登录

android--QQ账号登陆第三方应用

2016-10-18  本文已影响163人  爱情小傻蛋

1.在开发之前,首先要使用QQ号登录平台,然后完善开发者信息成为开发者,之后,要在管理中心,创建你的应用,其中包括完善很多关于你的应用的信息。(关于这部分的详细信息,请查看官方在线文档开发者注册和android应用注册)。

2.当我们成功创建 了应用之后,会获得APP ID,这个ID在开发中是必须的。
3.QQ互联SDK,前往该网页,可以下载官方的sdk资料,其中 包括了jar文件,demo,以及详细的开发说明文档。
4.(警醒)开发的第一步,首先要把所需要的jar文件导入到我们的工程中去,在上一步下载的SDK文档中,我们会发现有一个open_sdk.jar文件,按照说明文档导入进去,但是我们会发现在说明文档中分明提到了2个jar文件,
sdk中的open_sdk.jar和mta_sdk_XXX.jar导入到工程之后,可以按照开发文档,继续往下进行。
5.关于AndroidManifest的配置,开发文档比较详尽,不赘述。

使用的sdk版本: V2.2.2(发布日期:2014.3.17)
因为,开发SDK的版本更新比较快,阅读的童鞋注意点吧。

开工前期的准备:
1.建议你首先去下载最新的SDK,那里面除了有案例外,还有必须的jar包(open_sdk.jar和mta_sdk_XXX.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" />   
            </intent-filter>  
        </activity>  
        <activity  
            android:name="com.tencent.connect.common.AssistActivity"  
            android:screenOrientation="portrait"  
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />  

在tencent后面添加自己的应用id,222222是腾讯给的专用测试id。

顺便提醒一句,在这个版本中要导入两个jar包(open_sdk.jar和mta_sdk_XXX.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="返回消息" />  

活动的详细代码:

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);  
       }  
   }  
 
     
   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("退出帐号");  
       }  
   }  
 
     
   private class BaseUiListener implements IUiListener {  
         
       @Override  
       public void onComplete(Object response) {  
           backInfo.setText(response.toString());  
           doComplete((JSONObject) response);  
       }  
 
         
       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.运行的开始界面: android--QQ账号登陆第三方应用
2.当你的手机没用安装qq的时候,会跳转到网页qq注册界面:
android--QQ账号登陆第三方应用
3.如果手机上有qq客户端: android--QQ账号登陆第三方应用
4.获取成功:
android--QQ账号登陆第三方应用

注意:
1.因为我使用的是腾讯给的测试接口id,如果你也是使用的测试接口的话,那么记得把应用的名字改为: “open_sample”。
2.在进行登录的时候,可以进行判断是否适合sso登录。
// 是否支持sso登录

            if (mTencent.isSupportSSOLogin(this)) {  
                onClickLogin();  
            }  

当支持的时候,就返回真,否则返回假。

上一篇 下一篇

猜你喜欢

热点阅读