因爲,開發SDK的版本更新比較快,閱讀的童鞋注意點吧。
開工前期的準備:
1.建議你首先去下載最新的SDK,那裏面除了有案例外,還有必須的jar包。
2.最好在qq的開發平臺自己註冊個賬號,那樣移植起來更容易點。
給個鏈接吧:
配置清單:
1.添加權限:
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.添加活動:
- <activity
- android:name="com.tencent.tauth.AuthActivity"
- android:launchMode="singleTask"
- android:noHistory="true" >
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:scheme="tencent222222" /> <!-- 100380359 100381104 222222 -->
- </intent-filter>
- </activity>
- <activity
- android:name="com.tencent.connect.common.AssistActivity"
- android:screenOrientation="portrait"
- android:theme="@android:style/Theme.Translucent.NoTitleBar" />
順便提醒一句,在這個版本中要導入兩個jar包。
佈局:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/user_nickname"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="暱稱" />
- <ImageView
- android:id="@+id/user_logo"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/new_login_btn"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="登錄" />
- <TextView
- android:id="@+id/user_callback"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="返回消息" />
活動的詳細代碼:
- /**
- * 測試qq第三方登錄功能
- *
- */
- public class TestQQ extends Activity implements OnClickListener {
- private TextView mUserInfo;
- private ImageView mUserLogo;
- private Button mNewLoginButton;
- private TextView backInfo;
- private UserInfo mInfo;
- private Tencent mTencent;
- public QQAuth mQQAuth;
- // 申請的id
- public String mAppid = "222222";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.acy_testqq);
- initView();
- }
- public void initView() {
- mUserInfo = (TextView) findViewById(R.id.user_nickname);
- mUserLogo = (ImageView) findViewById(R.id.user_logo);
- mNewLoginButton = (Button) findViewById(R.id.new_login_btn);
- mNewLoginButton.setOnClickListener(this);
- backInfo = (TextView) findViewById(R.id.user_callback);
- // Tencent類是SDK的主要實現類,通過此訪問騰訊開放的OpenAPI。
- mQQAuth = QQAuth.createInstance(mAppid, this.getApplicationContext());
- // 實例化
- mTencent = Tencent.createInstance(mAppid, this);
- }
- Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- if (msg.what == 0) {
- mUserInfo.setVisibility(android.view.View.VISIBLE);
- mUserInfo.setText(msg.getData().getString("nickname"));
- } else if (msg.what == 1) {
- Bitmap bitmap = (Bitmap) msg.obj;
- mUserLogo.setImageBitmap(bitmap);
- mUserLogo.setVisibility(android.view.View.VISIBLE);
- }
- }
- };
- private void updateUserInfo() {
- if (mQQAuth != null && mQQAuth.isSessionValid()) {
- IUiListener listener = new IUiListener() {
- @Override
- public void onError(UiError e) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onComplete(final Object response) {
- JSONObject json = (JSONObject) response;
- // 暱稱
- Message msg = new Message();
- String nickname = null;
- try {
- nickname = ((JSONObject) response)
- .getString("nickname");
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- msg.getData().putString("nickname", nickname);
- msg.what = 0;
- mHandler.sendMessage(msg);
- // 頭像
- String path;
- try {
- path = json.getString("figureurl_qq_2");
- MyImgThread imgThread = new MyImgThread(path);
- Thread thread = new Thread(imgThread);
- thread.start();
- } catch (JSONException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- @Override
- public void onCancel() {
- // TODO Auto-generated method stub
- }
- };
- // MainActivity.mTencent.requestAsync(Constants.GRAPH_SIMPLE_USER_INFO,
- // null,
- // Constants.HTTP_GET, requestListener, null);
- mInfo = new UserInfo(this, mQQAuth.getQQToken());
- mInfo.getUserInfo(listener);
- } else {
- // mUserInfo.setText("");
- // mUserInfo.setVisibility(android.view.View.GONE);
- // mUserLogo.setVisibility(android.view.View.GONE);
- }
- }
- /**
- * 開啓線程 獲取頭像
- */
- class MyImgThread implements Runnable {
- private String imgPath;
- private Bitmap bitmap;
- public MyImgThread(String imgpath) {
- this.imgPath = imgpath;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- bitmap = getImgBitmap(imgPath);
- Message msg = new Message();
- msg.obj = bitmap;
- msg.what = 1;
- mHandler.sendMessage(msg);
- }
- }
- /**
- * 根據頭像的url 獲取bitmap
- */
- public Bitmap getImgBitmap(String imageUri) {
- // 顯示網絡上的圖片
- Bitmap bitmap = null;
- HttpURLConnection conn = null;
- InputStream is = null;
- try {
- URL myFileUrl = new URL(imageUri);
- conn = (HttpURLConnection) myFileUrl.openConnection();
- conn.setDoInput(true);
- conn.connect();
- is = conn.getInputStream();
- bitmap = BitmapFactory.decodeStream(is);
- is.close();
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- } finally {
- try {
- conn.disconnect();
- is.close();
- is.reset();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return bitmap;
- }
- public void onClickLogin() {
- // 登錄
- if (!mQQAuth.isSessionValid()) {
- // 實例化回調接口
- IUiListener listener = new BaseUiListener() {
- @Override
- protected void doComplete(JSONObject values) {
- updateUserInfo();
- // updateLoginButton();
- if (mQQAuth != null) {
- mNewLoginButton.setTextColor(Color.BLUE);
- mNewLoginButton.setText("登錄");
- }
- }
- };
- // "all": 所有權限,listener: 回調的實例
- // mQQAuth.login(this, "all", listener);
- // 這版本登錄是使用的這種方式,後面的幾個參數是啥意思 我也沒查到
- mTencent.loginWithOEM(this, "all", listener, "10000144",
- "10000144", "xxxx");
- } else {
- // 註銷登錄
- mQQAuth.logout(this);
- updateUserInfo();
- // updateLoginButton();
- mNewLoginButton.setTextColor(Color.RED);
- mNewLoginButton.setText("退出帳號");
- }
- }
- /**
- * 調用SDK封裝好的藉口,需要傳入回調的實例 會返回服務器的消息
- */
- private class BaseUiListener implements IUiListener {
- /**
- * 成功
- */
- @Override
- public void onComplete(Object response) {
- backInfo.setText(response.toString());
- doComplete((JSONObject) response);
- }
- /**
- * 處理返回的消息 比如把json轉換爲對象什麼的
- *
- * @param values
- */
- protected void doComplete(JSONObject values) {
- }
- @Override
- public void onError(UiError e) {
- Toast.makeText(TestQQ.this, e.toString(), 1000).show();
- }
- @Override
- public void onCancel() {
- Toast.makeText(TestQQ.this, "cancel", 1000).show();
- }
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- // 當點擊登錄按鈕
- if (v == mNewLoginButton) {
- onClickLogin();
- }
- }
- }
測試:
1.運行的開始界面:
2.當你的手機沒用安裝qq的時候,會跳轉到網頁qq註冊界面:
3.如果手機上有qq客戶端:
4.獲取成功:
注意:
1.因爲我使用的是騰訊給的測試接口id,如果你也是使用的測試接口的話,那麼記得把應用的名字改爲: “open_sample”。
2.在進行登錄的時候,可以進行判斷是否適合sso登錄。
- // 是否支持sso登錄
- if (mTencent.isSupportSSOLogin(this)) {
- onClickLogin();
- }