Android实现QQ第三方登录

Android 实现QQ第三方登录

在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了。

首先肯定是去下载SDK和DEMO

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

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

先看下效果图吧

\\\\\

原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID.

跟着代码来说吧。

首先,我们要加载open_sdk.jar和mta-sdk-1.00.jar这两个架包顺便看下我总共用到的类

\\

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

 

好了进入主题

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

01. <activity
02. android:name="com.tencent.tauth.AuthActivity"
03. android:launchMode="singleTask"
04. android:noHistory="true" >
05. <intent-filter>
06. <action android:name="android.intent.action.VIEW" />
07.  
08. <category android:name="android.intent.category.DEFAULT" />
09. <category android:name="android.intent.category.BROWSABLE" />
10.  
11. <data android:scheme="tencent222222" /><!—注意在这里用你的appid替换222222 -->
12. </intent-filter>
13. </activity>
14. <activity android:name="com.tencent.connect.common.AssistActivity"
15. android:theme="@android:style/Theme.Translucent.NoTitleBar"
16. android:screenOrientation="portrait"/>

 

然后是两个权限

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

 

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

01. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03. android:layout_width="fill_parent"
04. android:layout_height="fill_parent"
05. android:orientation="vertical">
06. <Button
07. android:id="@+id/login"
08. android:layout_width="fill_parent"
09. android:layout_height="wrap_content"
10. android:text="登录"/>
11. <ImageView
12. android:id="@+id/user_logo"
13. android:layout_width="wrap_content"
14. android:layout_height="wrap_content"
15. />
16. <TextView
17. android:id="@+id/user_nickname"
18. android:layout_width="wrap_content"
19. android:layout_height="wrap_content"
20. android:textColor="#80505050"
21. android:textSize="18sp"
22. />
23. <TextView
24. android:id="@+id/user_openid"
25. android:layout_width="wrap_content"
26. android:layout_height="wrap_content" 
27. />
28.  
29. </LinearLayout>

 

然后是MainActivity

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

\

上图是登录Q的返回LOG

\

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

然后是AppConstant.java

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

然后是Util.java

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

 

至此全部代码就在这里了,我们获得了OpenID这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了。

得意结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值