Android授权登录新浪微博获取用户个人信息.docx
- 文档编号:27942296
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:17
- 大小:326.82KB
Android授权登录新浪微博获取用户个人信息.docx
《Android授权登录新浪微博获取用户个人信息.docx》由会员分享,可在线阅读,更多相关《Android授权登录新浪微博获取用户个人信息.docx(17页珍藏版)》请在冰豆网上搜索。
Android授权登录新浪微博获取用户个人信息
Android授权登录新浪微博获取用户个人信息
一、准备工作
我们都知道,无论是分享到新浪微博,还是获取新浪微博的用户信息,都离不开一样东西,那就是新浪微博的APPID,APPID通过绑定我们应用程序的包名和签名进行识别,可以说它是我们跟新浪微博官方所提供接口进行交互的一个重要令牌,这一点跟QQ、微信接口等访问原理基本是一样的。
那么问题来了,APPID到底怎么得到?
答案就是你要到新浪微博开放平台
点击创建应用后会出现如下图所示页面,在这个页面中你必须要填写你的Android包名和Android签名,包名就是你应用程序AndroidManifest.xml文件中的package中的字符串,比如你新建了一个名称为“test”的项目,那么你的包名应该是com.example.test了。
至于Android签名,你可以在该开放平台下载签名工具apk装到手机,然后打开该apk填写程序包名获取签名,也可以直接在开发工具eclispe中点击Window->Preferences->Android->Build查看,如下图所示,至于其它必要的填写信息,你自己去完善就可以了
将所有信息填写完善后我们点击提交审核,注意,只有审核通过的应用才能调用他们提供的API。
二、工程准备
新建一个工程,包名要跟你上面填写的包名一致。
新建完成后下载新浪微博SDK,下载完成后解压,将libs目录下的文件全部拷贝到你的工程libs目录下,将weiboSDKCore_3.1.2.jar包也拷贝到libs目录下,找到AccessTokenKeeper.Java、UsersAPI.java、AbsOpenAPI.java文件并拷贝到你的包中,我把我的工程目录图贴出来,后面我会把整个示例源码放上来。
注意上面common中的SinaUserInfo.java是我自己建的,只是用来方便存和取用户信息而已。
还有,别忘了在AndroidManifest.xml中添加权限:
name="android.permission.INTERNET"/> 三、动手写代码 几经波折,下面直接进入正题,贴代码 1、SinaUserInfo.java(前面说过,这个类非常简单,只是方便存取用户信息而已) [java]viewplaincopy在CODE上查看代码片派生到我的代码片 publicclassSinaUserInfo{ privateStringuid;//用户ID privateStringname;//用户昵称 privateStringavatarHd;//用户头像url publicSinaUserInfo(){ super(); //TODOAuto-generatedconstructorstub } publicStringgetUid(){ returnuid; } publicvoidsetUid(Stringuid){ this.uid=uid; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetAvatarHd(){ returnavatarHd; } publicvoidsetAvatarHd(StringavatarHd){ this.avatarHd=avatarHd; } } 2.MainActivity.java(这个是核心,先分步讲解,后面直接贴出完整代码) 在这个java文件中,授权登录并获取信息的具体流程是这样子的,首先通过我们之前审核通过的APPID来实例化IWeiboShareAPI: [java]viewplaincopy在CODE上查看代码片派生到我的代码片 weiboShareAPI=WeiboShareSDK.createWeiboAPI(context,SWB_APP_ID); 然后获取OAuth协议信息,并设置授权回调接口: [java]viewplaincopy在CODE上查看代码片派生到我的代码片 authInfo=newAuthInfo(context,SWB_APP_ID,SWB_REDIRECT_URL,SWB_SCOPE); ssoHandler=newSsoHandler(MainActivity.this,authInfo); ssoHandler.authorize(newAuthListener()); 在授权回调接口当中,我们通过利用onComplete方法中的参数values来解析访问令牌accessToken,并通过AccessTokenKeeper这个类将accessToken保存,这样我们就完成了授权,紧接着我们开了一个线程,实例化UsersAPI并调用show()方法,这个方法有两个参数,由于我们是通过accessToken.getUid()也就是用户ID来获取用户信息的,所以这里的参数类型是long而不是String,如果你不转成long的话,他实际上是通过用户名来访问用户信息的,那么就会出现“com.weibo.sdk.android.WeiboException: {"error": "Userdoesnotexists! ","error_code": 20003,"request": "/2/users/show.json"}”,也就是用户不存在的现象。 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 @Override publicvoidonComplete(Bundlevalues){ //TODOAuto-generatedmethodstub accessToken=Oauth2AccessToken.parseAccessToken(values);//从Bundle中解析Token StringphoneNum=accessToken.getPhoneNum();//从这里获取用户输入的电话号码信息 if(accessToken.isSessionValid()){ AccessTokenKeeper.writeAccessToken(MainActivity.this,accessToken);//保存Token Toast.makeText(context,"授权成功",Toast.LENGTH_SHORT) .show(); newThread(newRunnable(){ @Override publicvoidrun(){ //TODOAuto-generatedmethodstub UsersAPIusersAPI=newUsersAPI(context,SWB_APP_ID,accessToken); usersAPI.show(Long.valueOf(accessToken.getUid()),newSinaRequestListener()); } }).start(); }else{ //以下几种情况,您会收到Code: //1.当您未在平台上注册的应用程序的包名与签名时; //2.当您注册的应用程序包名与签名不正确时; //3.当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 Stringcode=values.getString("code"); Stringmessage="授权失败"; if(! TextUtils.isEmpty(code)){ message=message+"\nObtainedthecode: "+code;}Toast.makeText(context,message,Toast.LENGTH_LONG).show(); } } 上面show方法中的第二个参数是新浪微博请求监听回调接口,我们可以在这个接口的onComplete方法中的参数respon中得到返回的json数据, 通过解析json数据就可以得到我们想要的新浪微博用户信息啦,到此整个流程也就结束了,以下是请求接口的部分代码。 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 publicclassSinaRequestListenerimplementsRequestListener{//新浪微博请求接口 @Override publicvoidonComplete(Stringresponse){ //TODOAuto-generatedmethodstub try{ JSONObjectjsonObject=newJSONObject(response); StringidStr=jsonObject.getString("idstr");//唯一标识符(uid) Stringname=jsonObject.getString("name");//姓名 StringavatarHd=jsonObject.getString("avatar_hd");//头像 要想授权回调有效,别忘了在Activity中添加如下代码: [java]viewplaincopy在CODE上查看代码片派生到我的代码片 @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ //TODOAuto-generatedmethodstub super.onActivityResult(requestCode,resultCode,data); if(ssoHandler! =null){ ssoHandler.authorizeCallBack(requestCode,resultCode,data); } } 好了,下面直接贴出完整的代码: [java]viewplaincopy在CODE上查看代码片派生到我的代码片 importorg.json.JSONException; importorg.json.JSONObject; importandroid.app.Activity; importandroid.content.Context; importandroid.content.Intent; importandroid.os.Bundle; importandroid.os.Handler; importandroid.os.Message; importandroid.text.TextUtils; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; importandroid.widget.Toast; importmon.SinaUserInfo; importcom.sina.weibo.sdk.api.share.IWeiboShareAPI; importcom.sina.weibo.sdk.api.share.WeiboShareSDK; importcom.sina.weibo.sdk.auth.AuthInfo; importcom.sina.weibo.sdk.auth.Oauth2AccessToken; importcom.sina.weibo.sdk.auth.WeiboAuthListener; importcom.sina.weibo.sdk.auth.sso.SsoHandler; importcom.sina.weibo.sdk.exception.WeiboException; import.RequestListener; publicclassMainActivityextendsActivityimplementsOnClickListener{ privateContextcontext; privateIWeiboShareAPIweiboShareAPI; privatefinalstaticStringSWB_APP_ID="3802299039"; privateButtonlogin; privateAuthInfoauthInfo; privateSsoHandlerssoHandler; privateOauth2AccessTokenaccessToken; privateTextViewuserinfo_tv; privateSinaUserInfouserInfo; publicstaticfinalStringSWB_REDIRECT_URL=" publicstaticfinalStringSWB_SCOPE="email,direct_messages_read,direct_messages_write," +"friendships_groups_read,friendships_groups_write,statuses_to_me_read," +"follow_app_official_microblog,"+"invitation_write"; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context=this; weiboShareAPI=WeiboShareSDK.createWeiboAPI(context,SWB_APP_ID); userinfo_tv=(TextView)findViewById(R.id.userinfo_tv); login=(Button)findViewById(R.id.login); login.setOnClickListener(this); } @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub authInfo=newAuthInfo(context,SWB_APP_ID,SWB_REDIRECT_URL,SWB_SCOPE); ssoHandler=newSsoHandler(MainActivity.this,authInfo); ssoHandler.authorize(newAuthListener()); } publicclassAuthListenerimplementsWeiboAuthListener{ @Override publicvoidonCancel(){ //TODOAuto-generatedmethodstub Toast.makeText(context,"授权取消",Toast.LENGTH_LONG).show(); } @Override publicvoidonComplete(Bundlevalues){ //TODOAuto-generatedmethodstub accessToken=Oauth2AccessToken.parseAccessToken(values);//从Bundle中解析Token StringphoneNum=accessToken.getPhoneNum();//从这里获取用户输入的电话号码信息 if(accessToken.isSessionValid()){ AccessTokenKeeper.writeAccessToken(MainActivity.this,accessToken);//保存Token Toast.makeText(context,"授权成功",Toast.LENGTH_SHORT) .show(); newThread(newRunnable(){ @Override publicvoidrun(){ //TODOAuto-generatedmethodstub UsersAPIusersAPI=newUsersAPI(context,SWB_APP_ID,accessToken); usersAPI.show(Long.valueOf(accessToken.getUid()),newSinaRequestListener()); } }).start(); } }else{ //以下几种情况,您会收到 //1.当您未在平台上注册的应用程序的包名与签名时; //2.当您注册的应用程序包名与签名不正确时; //3.当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 Stringcode=values.getString("code"); Stringmessage="授权失败"; if(! TextUtils.isEmpty(code)){ message=message+"\nObtainedthecode: "+code; } Toast.makeText(context,message,Toast.LENGTH_LONG).show(); } @OverridepublicvoidonWeiboException(WeiboExceptione) {//TODOAuto-generatedmethodstub Toast.makeText(context,"Authexception: "+e.getMessage(),Toast.LENGTH_LONG).show(); } } publicHandlerhandler=newHandler(){ publicvoidhandleMessage(Messagemsg){ if(msg.what==1){ userinfo_tv.setText("用户id: "+userInfo.getUid()+"\n"+"用户名: "+userInfo.getName()+"\n"+"用户头像url: "+userInfo.getAvatarHd()); } }; }; publicclassSinaRequestListenerimplementsRequestListener{//新浪微博请求接口 @Override publicvoidonComplete(Stringresponse){//TODOAuto-generatedmethodstub try{ JSONObjectjsonObject=newJSONObject(response); StringidStr=jsonObject.getString("idstr");//唯一标识符(uid) Stringname=jsonObject.getString("name");//姓名 StringavatarHd=jsonObject.getString("avatar_hd");//头像 userInfo=newSinaUserInfo(); userInfo.setUid(idStr); userInfo.setName(name); userInfo.setAvatarHd(avatarHd); Messagemessage=Message.obtain(); message.what=1;handler.sendMessage(message); }catch(JSONExceptione){//TODOAuto-generatedcatchblock e.printStackTrace(); } } @Override publicvoidonWeiboException(WeiboExceptione) {//TODOAuto-generatedmethodstubToast.makeText(context,"Authexception: "+e.getMessage(),Toast.LENGTH_LONG)how(); Log.i("mylog","Authexception: "+e.getMessage()); } } @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//TODOAuto-generatedhodstub super.onActivityResult(requestCode,resultCode,data); if(ssoHandler! =null){ ssoHandler
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 授权 登录 新浪 获取 用户 个人信息