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

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();  
            }  

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,275评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,713评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,982评论 4 60
  • 半醉 一 阳光刺眼,微风拂过,真真假假,假假真真 暑假的第一天,半醉坐在自家的甜品店里发呆。昨儿个,那是梦吗?半醉...
    沐雪紫瞳阅读 1,575评论 16 36