Android实现QQ第三方登录
Tag标签:第三方
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"
02.
xmlns:tools=
"http://schemas.android.com/tools"
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这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了。
结束。