Android 实现QQ第三方登录_安卓代码怎么实现qq登录页面-程序员宅基地

技术标签: android  qq登录  

Android 实现QQ第三方登录


Android 实现QQ第三方登录

首先肯定是去下载SDK和DEMO

http://wiki.open.qq.com/wiki/mobile/SDK下载

本文是我自己整合后的简单DEMO。

先看下效果图吧

\\\\\

原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID.<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+uPrXxbT6wuvAtMu1sMmhozwvcD4KPHA+ytfPyKOsztLDx9KqvNPU2G9wZW5fc2RrLmphcrrNbXRhLXNkay0xLjAwLmphctXiwb249rzcsPzLs7Hjv7TPws7S19y5stPDtb21xMDgPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140910/201409100906079.jpg" alt="\">\

其中,AppConstant中是用来放置APPID的,由于考虑到还可能引入其他第三方登录,为方便管理,故创建此类。Util是根据路径从网上获取图片的处理类

好了进入主题

首先在AndroidManifest.xml中进行两个定义如果不定义是不行的

?
1
2
3
4
5
6
7
8
9
10
11
12
             <intent-filter>
                 
 
                 <category android:name= "android.intent.category.DEFAULT" >
                 <category android:name= "android.intent.category.BROWSABLE" >
 
                 <data android:scheme= "tencent222222" ><!--—注意在这里用你的appid替换 222222 ---->
             </data></category></category></action></intent-filter>
         </activity>
         
</activity>


然后是两个权限

?
1
2
3
<uses-permission android:name= "android.permission.INTERNET" >
     <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" >
</uses-permission></uses-permission>

接下来是布局文件,activity_main.xml登录按钮,获取头像、昵称、openid的textview

?
1
2
3
4
5
6
7
8
<linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "fill_parent" android:layout_height= "fill_parent" android:orientation= "vertical" >
     <button android:id= "@+id/login" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:text= "登录" >
     <imageview android:id= "@+id/user_logo" android:layout_width= "wrap_content" android:layout_height= "wrap_content" >
     <textview android:id= "@+id/user_nickname" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:textcolor= "#80505050" android:textsize= "18sp" >
     <textview android:id= "@+id/user_openid" android:layout_width= "wrap_content" android:layout_height= "wrap_content" >
    
 
</textview></textview></imageview></button></linearlayout>


然后是MainActivity

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class MainActivity extends Activity implements OnClickListener {
     TextView openidTextView;
     TextView nicknameTextView;
     Button loginButton;
     ImageView userlogo;
     private Tencent mTencent;
     public static QQAuth mQQAuth;
       public static String mAppid;
       public static String openidString;
       public static String nicknameString;
       public static String TAG= "MainActivity" ;
       Bitmap bitmap = null ;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //用来登录的Button
         loginButton=(Button)findViewById(R.id.login);
         loginButton.setOnClickListener( this );
         //用来显示OpenID的textView
         openidTextView=(TextView)findViewById(R.id.user_openid);
         //用来显示昵称的textview
         nicknameTextView=(TextView)findViewById(R.id.user_nickname);
        //用来显示头像的Imageview
         userlogo=(ImageView)findViewById(R.id.user_logo);
         
     }
     public void onClick(View v) {
         // TODO Auto-generated method stub
         switch (v.getId()) {
         case R.id.login:
             LoginQQ();
             break ;
 
         default :
             break ;
         }
     }
     //这里是调用QQ登录的关键代码
     public void LoginQQ() {
         //这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 222222
         mAppid = AppConstant.APP_ID;
         //第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录
         mTencent = Tencent.createInstance(mAppid,getApplicationContext());
         /**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限
         官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all” 
         第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */
         mTencent.login(MainActivity. this , "all" , new BaseUiListener());
             
     }
     /**当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法,
      * onComplete  onCancel onError
      *分别表示第三方登录成功,取消 ,错误。*/
     private class BaseUiListener implements IUiListener {
 
         public void onCancel() {
             // TODO Auto-generated method stub
             
         }
         public void onComplete(Object response) {
             // TODO Auto-generated method stub
             Toast.makeText(getApplicationContext(), "登录成功" , 0 ).show();
             try {
                 //获得的数据是JSON格式的,获得你想获得的内容
                 //如果你不知道你能获得什么,看一下下面的LOG
                 Log.e(TAG, "-------------" +response.toString());
                 openidString = ((JSONObject) response).getString( "openid" );
                 openidTextView.setText(openidString);
                 Log.e(TAG, "-------------" +openidString);
                 //access_token= ((JSONObject) response).getString("access_token");              //expires_in = ((JSONObject) response).getString("expires_in");
             } catch (JSONException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             /**到此已经获得OpneID以及其他你想获得的内容了
             QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?
             sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
             如何得到这个UserInfo类呢?  */
             QQToken qqToken = mTencent.getQQToken();
             UserInfo info = new UserInfo(getApplicationContext(), qqToken);
             //这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON          
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
             info.getUserInfo( new IUiListener() {
 
                 public void onComplete( final Object response) {
                     // TODO Auto-generated method stub
                     Log.e(TAG, "---------------111111" );
                     Message msg = new Message();
                     msg.obj = response;
                     msg.what = 0 ;
                     mHandler.sendMessage(msg);
                     Log.e(TAG, "-----111---" +response.toString());
                     /**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接
                      * 在mHandler里进行操作
                      *
                      */
                     new Thread(){
 
                         @Override
                         public void run() {
                             // TODO Auto-generated method stub
                             JSONObject json = (JSONObject)response;
                             try {
                                 bitmap = Util.getbitmap(json.getString( "figureurl_qq_2" ));
                             } catch (JSONException e) {
                                 // TODO Auto-generated catch block
                                 e.printStackTrace();
                             }
                             Message msg = new Message();
                             msg.obj = bitmap;
                             msg.what = 1 ;
                             mHandler.sendMessage(msg);
                         }                      
                     }.start();
                 }              
                 public void onCancel() {
                     Log.e(TAG, "--------------111112" );
                     // TODO Auto-generated method stub                 
                 }
                 public void onError(UiError arg0) {
                     // TODO Auto-generated method stub
                     Log.e(TAG, "-111113" + ":" +arg0);
                 }
                 
             });
             
         }
 
         public void onError(UiError arg0) {
             // TODO Auto-generated method stub
             
         }          
         
     }
     Handler mHandler = new Handler() {
 
         @Override
         public void handleMessage(Message msg) {
             if (msg.what == 0 ) {
                 JSONObject response = (JSONObject) msg.obj;
                 if (response.has( "nickname" )) {
                     try {
                         nicknameString=response.getString( "nickname" );
                         
                         nicknameTextView.setText(nicknameString);
                         Log.e(TAG, "--" +nicknameString);
                     } catch (JSONException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     }
                 }
             } else if (msg.what == 1 ){
                 Bitmap bitmap = (Bitmap)msg.obj;
                 userlogo.setImageBitmap(bitmap);
                 
             }
         }
 
     };
 
     
}

\

上图是登录Q的返回LOG

\

上图是我们获得腾讯提供的UserInfo返回的LOG

然后是AppConstant.java

?
1
2
3
public class AppConstant {
     public static String APP_ID= "222222" ;
}

然后是Util.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Util {
     public static String TAG= "UTIL" ;
     public static Bitmap getbitmap(String imageUri) {
         Log.v(TAG, "getbitmap:" + imageUri);
         // 显示网络上的图片
         Bitmap bitmap = null ;
         try {
             URL myFileUrl = new URL(imageUri);
             HttpURLConnection conn = (HttpURLConnection) myFileUrl
                     .openConnection();
             conn.setDoInput( true );
             conn.connect();
             InputStream is = conn.getInputStream();
             bitmap = BitmapFactory.decodeStream(is);
             is.close();
 
             Log.v(TAG, "image download finished." + imageUri);
         } catch (IOException e) {
             e.printStackTrace();
             Log.v(TAG, "getbitmap bmp fail---" );
             return null ;
         }
         return bitmap;
     }
}


至此全部代码就在这里了,我们获得了OpenID这个唯一标识最关键的东西,然后看项目中

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/feixiangdexin123087/article/details/40622557

智能推荐

cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration的解决-程序员宅基地

文章浏览阅读2.3w次,点赞7次,收藏12次。导入了一个工程,编译什么的都还好,但是报了一个XML的错误。cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'. 具体错误如下:Multiple annotations found at this line: ..._cvc-complex-type.2.4.c: the matching wildcard is strict, but no declaration

如何避免对话冲突-《关键对话》笔记与心得_关键对话 为什么我们会面临关键冲突-程序员宅基地

文章浏览阅读1.9k次。 目录 1~关键对话的含义2~关键对话的目标3~处在关键对话场景下的心理状态4~好公司和差公司的区别5~ 关键对话的重要性6~跟踪表现良好的人行为7~专注于真正想要的结果8~ 谈话禁忌9~决策的四种方式 自勉1~关键对话的含义两个或更多人参与讨论,条件:1)事关重大ps: 个..._关键对话 为什么我们会面临关键冲突

Mac中找不到.bash_profile则自己创建.bash_profile文件_mac 中没有bash_profile-程序员宅基地

文章浏览阅读9.5k次。1.启动Terminal终端工具2.输入cd ~/ 进入当前用户的home目录或cd /Users/YourUserName3. 创建:touch .bash_profile4.打开并编辑:open -e .bash_profile5.保存关闭,其实创建了一个空文件6.更新:source .bash_profile..._mac 中没有bash_profile

什么是航位推算(Dead Reckoning )-程序员宅基地

文章浏览阅读2.8w次,点赞2次,收藏61次。只有同时接收三到四个GPS / GNSS卫星的信号才能实现精确的GPS / GNSS定位。当仅依靠GPS / GNSS定位时,可能会出现位置精度降低或丢失的情况。例如,当车辆在无法接收GPS / GNSS信号的区域(隧道或地下通道)或发生非常强烈的多径传播(被高层玻璃覆盖的建筑物环绕的区域)中移动时。为了克服GPS / GNSS定位的这些限制,推测航位推算解决方案是有用的。即使在仅GPS / GN..._航位推算

unity3d android 触摸事件,解决Unity3D关于手机触屏事件的方法-程序员宅基地

文章浏览阅读1.5k次。经过了不断的调试,终于解决了这个问题,虽然花的时间久了些,不过很值得这是移动的代码if(Input.touchCount>0&&Input.GetTouch(0).phase.Equals(TouchPhase.Began)){touchBeganPosition = Input.GetTouch(0).position;}//这是触屏的代码TouchDirection di..._if (input.touchcount > 0 && input.gettouch(0).phase == touchphase.began)

Java7 ForkJoin入门实例-程序员宅基地

文章浏览阅读89次。本文转自:http://www.xiaoyaochong.net/wordpress/?p=314Java7引入了Fork Join的概念,来更好的支持并行运算。顾名思义,Fork Join类似与流程语言的分支,合并的概念。也就是说Java7 SE原生支持了在一个主线程中开辟多个分支线程,并且根据分支线程的逻辑来等待(或者不等待)汇集,当然你也可以fork的某一个分支线程中再开辟Fork ..._java fork join入门

随便推点

python入门必看指南_网络安全python-程序员宅基地

文章浏览阅读2.4k次。python编辑器 实用函数汇总 type():查看变量的类型 help():了解一个函数的详细 str():把整型转换成字符串类型 字符串操作指南 通过偏移值来获取你想需要的字符串 len():来获取字符串的长度 ..._网络安全python

深度学习——rain convolutional dictionary network (RCD-Net)-程序员宅基地

文章浏览阅读2.3k次,点赞7次,收藏18次。CVPR2020原论文:A Model-driven Deep Neural Network for Single Image Rain Removal 开源代码:https://github.com/hongwang01/RCDNet1.主要内容:利用卷积字典学习机制去编码雨的形状,以及近端梯度技术设计优化算法,提出了单幅图像的雨卷积字典模型(rain convolutional dictionary model,RCD model)。如下图:Rainy Image(O)=Rain_rain convolutional dictionary network

Centos8使用Kolla-ansible部署Ussuri(乌苏里2020-5-13发布)版本openstack-allinone云平台_centos8 安装openstack kolla-ans-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏6次。最近的一个版本更新Victoria 预计2020年10月发布Ussuri暂无法kolla-ansible部署只有TripleO这篇文章用Train版本 19年10月发布生产环境安装Kolla居多DevStack、PackStack主要适用于开发后续补充。_centos8 安装openstack kolla-ans

I2C通讯-程序员宅基地

文章浏览阅读219次。很多传感器喜欢使用I2C进行通讯i2c.ci2c.h调用i2c的函数hrm.chrm.h主函数初始化并调用

国外优秀的UI设计资源库_breezy wu ui-程序员宅基地

文章浏览阅读1k次。网站设计或者说UI设计对于Web上的运用是非常的关键,一个站做得好不好,能不能吸引人的眼球,设计占了不低的地位,但话又说回来,Web前端人 员又有多少人是设计专业毕业,具有这方面的能力呢?像我这样没有设计艺术细胞的页面仔,有时候为了一个效果苦于无法整出来,唯一的办法就是去搜索寻找相关 的设计资源网站,找到适合自己的UI效果。经过平时的积累与搜集,我整理了一个UI设计以及Web设计相关的资源网站,希_breezy wu ui

codeblocks调试问题--单步调试遇到breakpoint不停---不能单步调试--运行按钮是灰色但是没有dos窗口_codeblockdebug是灰的-程序员宅基地

文章浏览阅读5.3k次,点赞6次,收藏10次。今天晚上调试的时候可能不小心改了设置,还是其它原因,codeblocks突然遇到breakpoint不停了,然后百度了一下,大部分是说project创建的问题,感觉和自己的问题不同,我的问题是所有的project都不能单步调试。然后在seting-&gt;debug设置中找了一会都没有找到相应的设置,然后我就到debug中找到了debug-&gt;active debuggers-&gt;gdb/..._codeblockdebug是灰的