欠伸展肢体,吟咏心自愉。这篇文章主要讲述Android 实现QQ第三方登录相关的知识,希望能为你提供帮助。
android 实现QQ第三方登录
【Android 实现QQ第三方登录】在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了。
首先肯定是去下载SDK和DEMO
http://wiki.open.qq.com/wiki/mobile/SDK下载
本文是我自己整合后的简单DEMO。
先看下效果图吧
文章图片
小码哥Html5教程,免费随你看 【点击进入】24小时阅读30000+,48小时视频下载50000+ H5,JS,CSS,0基础学完独立开发网站/APP!查 看
文章图片
小码哥Html5教程,免费随你看 【点击进入】24小时阅读30000+,48小时视频下载50000+ H5,JS,CSS,0基础学完独立开发网站/APP!查 看
文章图片
省心选房,上链家网 【点击进入】很多人在【链家】都找到满意的房子! 放心买房 上【链家网】!查 看
文章图片
[尚观]10年品质,高端IT培训 【点击进入】十年运营,9大校区,技术为王,7天免费试学 63214名高薪就业学员,8万年薪就业查 看
文章图片
原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID.
跟着代码来说吧。
首先,我们要加载open_sdk.jar和mta-sdk-1.00.jar这两个架包顺便看下我总共用到的类
文章图片
文章图片
其中,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" ;
} |
?
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这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了。
推荐阅读
- Android NDK, No rule to make target
- Android开发之JavaMail发送邮件(用户反馈)
- Android 对话框(Dialog)大全 建立你自己的对话框
- PHP如何使用fwrite()函数写入文件()
- 地址解析协议(ARP)如何工作()
- 操作系统中的可用空间管理指南
- 高盛夏季分析师实习面试经验2020校园
- Scala Map介绍和用法实例指南
- 德勤面试经历分享|S3(校园内数据科学资料)