1、Android授权登录新浪微博获取用户个人信息汇总Android授权登录新浪微博获取用户个人信息一、准备工作我们都知道,无论是分享到新浪微博,还是获取新浪微博的用户信息,都离不开一样东西,那就是新浪微博的APPID,APPID通过绑定我们应用程序的包名和签名进行识别,可以说它是我们跟新浪微博官方所提供接口进行交互的一个重要令牌,这一点跟QQ、微信接口等访问原理基本是一样的。那么问题来了,APPID到底怎么得到?答案就是你要到新浪微博开放平台点击创建应用后会出现如下图所示页面,在这个页面中你必须要填写你的Android包名和Android签名,包名就是你应用程序AndroidManifest.x
2、ml文件中的package中的字符串,比如你新建了一个名称为“test”的项目,那么你的包名应该是com.example.test了。至于Android签名,你可以在该开放平台下载签名工具apk装到手机,然后打开该apk填写程序包名获取签名,也可以直接在开发工具eclispe中点击Window-Preferences-Android-Build查看,如下图所示,至于其它必要的填写信息,你自己去完善就可以了将所有信息填写完善后我们点击提交审核,注意,只有审核通过的应用才能调用他们提供的API。二、工程准备新建一个工程,包名要跟你上面填写的包名一致。新建完成后下载新浪微博SDK,下载完成后解压,将
3、libs目录下的文件全部拷贝到你的工程libs目录下,将weiboSDKCore_3.1.2.jar包也拷贝到libs目录下,找到AccessTokenKeeper.Java、UsersAPI.java、AbsOpenAPI.java文件并拷贝到你的包中,我把我的工程目录图贴出来,后面我会把整个示例源码放上来。注意上面common中的SinaUserInfo.java是我自己建的,只是用来方便存和取用户信息而已。还有,别忘了在AndroidManifest.xml中添加权限:三、动手写代码几经波折,下面直接进入正题,贴代码1、SinaUserInfo.java(前面说过,这个类非常简单,只是方
4、便存取用户信息而已)java view plain copy 在CODE上查看代码片派生到我的代码片public class SinaUserInfo private String uid;/用户ID private String name;/用户昵称 private String avatarHd;/用户头像url public SinaUserInfo() super(); / TODO Auto-generated constructor stub public String getUid() return uid; public void setUid(String uid) this
5、.uid = uid; public String getName() return name; public void setName(String name) this.name = name; public String getAvatarHd() return avatarHd; public void setAvatarHd(String avatarHd) this.avatarHd = avatarHd; 2.MainActivity.java(这个是核心,先分步讲解,后面直接贴出完整代码)在这个java文件中,授权登录并获取信息的具体流程是这样子的,首先通过我们之前审核通过的A
6、PPID来实例化IWeiboShareAPI:java view plain copy 在CODE上查看代码片派生到我的代码片weiboShareAPI = WeiboShareSDK.createWeiboAPI(context, SWB_APP_ID); 然后获取OAuth协议信息,并设置授权回调接口:java view plain copy 在CODE上查看代码片派生到我的代码片authInfo = new AuthInfo(context, SWB_APP_ID, SWB_REDIRECT_URL, SWB_SCOPE); ssoHandler = new SsoHandler(Mai
7、nActivity.this, authInfo); ssoHandler.authorize(new AuthListener(); 在授权回调接口当中,我们通过利用onComplete方法中的参数values来解析访问令牌accessToken,并通过AccessTokenKeeper这个类将accessToken保存,这样我们就完成了授权,紧接着我们开了一个线程,实例化UsersAPI并调用show()方法,这个方法有两个参数,由于我们是通过accessToken.getUid()也就是用户ID来获取用户信息的,所以这里的参数类型是long而不是String,如果你不转成long的话,他
8、实际上是通过用户名来访问用户信息的,那么就会出现“com.weibo.sdk.android.WeiboException: error:User does not exists!,error_code:20003,request:/2/users/show.json”,也就是用户不存在的现象。java view plain copy 在CODE上查看代码片派生到我的代码片Override public void onComplete(Bundle values) / TODO Auto-generated method stub accessToken = Oauth2AccessToken
9、.parseAccessToken(values); / 从Bundle中解析Token String phoneNum = accessToken.getPhoneNum();/ 从这里获取用户输入的 电话号码信息 if (accessToken.isSessionValid() AccessTokenKeeper.writeAccessToken(MainActivity.this, accessToken); / 保存Token Toast.makeText(context, 授权成功, Toast.LENGTH_SHORT) .show(); new Thread(new Runnab
10、le() Override public void run() / TODO Auto-generated method stub UsersAPI usersAPI = new UsersAPI(context, SWB_APP_ID, accessToken); usersAPI.show(Long.valueOf(accessToken.getUid(), new SinaRequestListener(); ).start(); else / 以下几种情况,您会收到 Code: / 1. 当您未在平台上注册的应用程序的包名与签名时; / 2. 当您注册的应用程序包名与签名不正确时; /
11、 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 String code = values.getString(code); String message = 授权失败; if (!TextUtils.isEmpty(code) message = message + nObtained the code: + code;Toast.makeText(context, message, Toast.LENGTH_LONG).show(); 上面show方法中的第二个参数是新浪微博请求监听回调接口,我们可以在这个接口的onComplete方法中的参数respon中得到
12、返回的json数据,通过解析json数据就可以得到我们想要的新浪微博用户信息啦,到此整个流程也就结束了,以下是请求接口的部分代码。java view plain copy 在CODE上查看代码片派生到我的代码片public class SinaRequestListener implements RequestListener /新浪微博请求接口 Override public void onComplete(String response) / TODO Auto-generated method stub try JSONObject jsonObject = new JSONObject
13、(response); String idStr = jsonObject.getString(idstr);/ 唯一标识符(uid) String name = jsonObject.getString(name);/ 姓名 String avatarHd = jsonObject.getString(avatar_hd);/ 头像 要想授权回调有效,别忘了在Activity中添加如下代码:java view plain copy 在CODE上查看代码片派生到我的代码片 Override protected void onActivityResult(int requestCode, int
14、 resultCode, Intent data) / TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(ssoHandler != null) ssoHandler.authorizeCallBack(requestCode, resultCode, data); 好了,下面直接贴出完整的代码:java view plain copy 在CODE上查看代码片派生到我的代码片import org.json.JSONException; import org.json
15、.JSONObject; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickL
16、istener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import mon.SinaUserInfo; import com.sina.weibo.sdk.api.share.IWeiboShareAPI; import com.sina.weibo.sdk.api.share.WeiboShareSDK; import com.sina.weibo.sdk.auth.AuthInfo; import com.sina.weibo.sdk.auth.
17、Oauth2AccessToken; import com.sina.weibo.sdk.auth.WeiboAuthListener; import com.sina.weibo.sdk.auth.sso.SsoHandler; import com.sina.weibo.sdk.exception.WeiboException; import .RequestListener; public class MainActivity extends Activity implements OnClickListener private Context context; private IWei
18、boShareAPI weiboShareAPI; private final static String SWB_APP_ID = 3802299039; private Button login; private AuthInfo authInfo; private SsoHandler ssoHandler; private Oauth2AccessToken accessToken; private TextView userinfo_tv; private SinaUserInfo userInfo; public static final String SWB_REDIRECT_U
19、RL = public static final String SWB_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 protected void onCreate(Bundle savedInstanceState) super.onCreate(savedI
20、nstanceState); 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 public void onClick(V
21、iew v) / TODO Auto-generated method stub authInfo = new AuthInfo(context, SWB_APP_ID, SWB_REDIRECT_URL, SWB_SCOPE); ssoHandler = new SsoHandler(MainActivity.this, authInfo); ssoHandler.authorize(new AuthListener(); public class AuthListener implements WeiboAuthListener Override public void onCancel(
22、) / TODO Auto-generated method stub Toast.makeText(context, 授权取消, Toast.LENGTH_LONG).show(); Override public void onComplete(Bundle values) / TODO Auto-generated method stub accessToken = Oauth2AccessToken.parseAccessToken(values); / 从Bundle中解析Token String phoneNum = accessToken.getPhoneNum();/ 从这里获
23、取用户输入的 电话号码信息 if (accessToken.isSessionValid() AccessTokenKeeper.writeAccessToken(MainActivity.this, accessToken); / 保存Token Toast.makeText(context, 授权成功, Toast.LENGTH_SHORT) .show(); new Thread(new Runnable() Override public void run() / TODO Auto-generated method stub UsersAPI usersAPI = new Users
24、API(context, SWB_APP_ID, accessToken); usersAPI.show(Long.valueOf(accessToken.getUid(), new SinaRequestListener(); ).start(); else / 以下几种情况,您会收到 / 1. 当您未在平台上注册的应用程序的包名与签名时; / 2. 当您注册的应用程序包名与签名不正确时; / 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 String code = values.getString(code); String message = 授权失败; i
25、f (!TextUtils.isEmpty(code) message = message + nObtained the code: + code; Toast.makeText(context, message, Toast.LENGTH_LONG).show(); Override public void onWeiboException(WeiboException e) / TODO Auto-generated method stub Toast.makeText(context, Auth exception : + e.getMessage(),Toast.LENGTH_LON
26、G).show(); public Handler handler = new Handler() public void handleMessage(Message msg) if(msg.what = 1) userinfo_tv.setText(用户id:+userInfo.getUid()+n+用户名:+userInfo.getName()+n+用户头像url:+userInfo.getAvatarHd(); ; ; public class SinaRequestListener implements RequestListener /新浪微博请求接口 Override public
27、 void onComplete(String response) / TODO Auto-generated method stub try JSONObject jsonObject = new JSONObject(response); String idStr = jsonObject.getString(idstr);/ 唯一标识符(uid) String name = jsonObject.getString(name);/ 姓名 String avatarHd = jsonObject.getString(avatar_hd);/ 头像 userInfo = new SinaUs
28、erInfo(); userInfo.setUid(idStr); userInfo.setName(name); userInfo.setAvatarHd(avatarHd); Message message = Message.obtain(); message.what = 1; handler.sendMessage(message); catch (JSONException e) / TODO Auto-generated catch block e.printStackTrace(); Override public void onWeiboException(WeiboExce
29、ption e) / TODO Auto-generated method stubToast.makeText(context, Auth exception : + e.getMessage(),Toast.LENGTH_LONG)how(); Log.i(mylog, Auth exception : + e.getMessage(); Override protected void onActivityResult(int requestCode, int resultCode, Intent data) / TODO Auto-generated hod stub super.onActivityResult(requestCode, resultCode, data); if(ssoHandler != null) ssoHandl
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1