admin管理员组

文章数量:1535877

2023年12月29日发(作者:)

Android授权登录新浪微博获取用户个人信息

一、准备工作

我们都知道,无论是分享到新浪微博,还是获取新浪微博的用户信息,都离不开一样东西,那就是新浪微博的APPID,APPID通过绑定我们应用程序的包名和签名进行识别,可以说它是我们跟新浪微博官方所提供接口进行交互的一个重要令牌,这一点跟QQ、微信接口等访问原理基本是一样的。那么问题来了,APPID到底怎么得到?答案就是你要到新浪微博开放平台/注册一个帐号,填写并创建你的应用。如下图所示:

点击创建应用后会出现如下图所示页面,在这个页面中你必须要填写你的Android包名和Android签名,包名就是你应用程序文件中的package中的字符串,比如你新建了一个名称为“test”的项目,那么你的包名应该是了。至于Android签名,你可以在该开放平台下载签名工具apk装到手机,然后打开该apk填写程序包名获取签名,也可以直接在开发工具eclispe中点击Window->Preferences->Android->Build查看,如下图所示,至于其它必要的填写信息,你自己去完善就可以了

将所有信息填写完善后我们点击提交审核,注意,只有审核通过的应用才能调用他们提供的API。

二、工程准备

新建一个工程,包名要跟你上面填写的包名一致。新建完成后下载新浪微博SDK,下载完成后解压,将libs目录下的文件全部拷贝到你的工程libs目录下,将weiboSDKCore_包也拷贝到libs目录下,找到、、文件并拷贝到你的包中,我把我的工程目录图贴出来,后面我会把整个示例源码放上来。

注意上面common中的是我自己建的,只是用来方便存和取用户信息而已。还有,别忘了在中添加权限:

三、动手写代码

几经波折,下面直接进入正题,贴代码

1、(前面说过,这个类非常简单,只是方便存取用户信息而已)

[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) {

= uid;

}

public String getName() {

return name;

}

public void setName(String name) {

= name;

}

public String getAvatarHd() {

return avatarHd;

}

public void setAvatarHd(String avatarHd) {

Hd = avatarHd;

}

}

(这个是核心,先分步讲解,后面直接贴出完整代码)

在这个java文件中,授权登录并获取信息的具体流程是这样子的,首先通过我们之前审核通过的APPID来实例化IWeiboShareAPI:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

weiboShareAPI = WeiboAPI(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(, authInfo);

ize(new AuthListener());

在授权回调接口当中,我们通过利用onComplete方法中的参数values来解析访问令牌accessToken,并通过AccessTokenKeeper这个类将accessToken保存,这样我们就完成了授权,紧接着我们开了一个线程,实例化UsersAPI并调用show()方法,这个方法有两个参数,由于我们是通过()也就是用户ID来获取用户信息的,所以这里的参数类型是long而不是String,如果你不转成long的话,他实际上是通过用户名来访问用户信息的,那么就会出现“xception: {"error":"User does not

exists!","error_code":20003,"request":"/2/users/"}”,也就是用户不存在的现象。

[java] view plain copy 在CODE上查看代码片派生到我的代码片

@Override

public void onComplete(Bundle values) {

// TODO Auto-generated method stub

accessToken = ccessToken(values); // 从Bundle中解析Token

String phoneNum = neNum();// 从这里获取用户输入的 电话号码信息

if (ionValid()) {

ccessToken(, accessToken);

// 保存Token

xt(context, "授权成功", _SHORT)

.show();

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

UsersAPI usersAPI = new UsersAPI(context, SWB_APP_ID,

accessToken);

(f(()), new

SinaRequestListener());

}

}).start();

}else{

// 以下几种情况,您会收到 Code:

// 1. 当您未在平台上注册的应用程序的包名与签名时;

// 2. 当您注册的应用程序包名与签名不正确时;

// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。

String code = ing("code");

String message = "授权失败";

if (!y(code)) {

message = message + "nObtained the code: " + code;}xt(context, message,

_LONG).show();

}

}

上面show方法中的第二个参数是新浪微博请求监听回调接口,我们可以在这个接口的onComplete方法中的参数respon中得到返回的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(response);

String idStr = ing("idstr");// 唯一标识符(uid)

String name = ing("name");// 姓名

String avatarHd = ing("avatar_hd");// 头像

要想授权回调有效,别忘了在Activity中添加如下代码:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

vityResult(requestCode, resultCode, data);

if(ssoHandler != null){

izeCallBack(requestCode, resultCode, data);

}

}

好了,下面直接贴出完整的代码:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

import ception;

import ject;

import ty;

import t;

import ;

import ;

import r;

import e;

import ils;

import ;

import ;

import kListener;

import ;

import ew;

import ;

import erInfo;

import ShareAPI;

import hareSDK;

import fo;

import 2AccessToken;

import uthListener;

import dler;

import xception;

import tListener;

public class MainActivity extends Activity implements OnClickListener{

private Context context;

private IWeiboShareAPI 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_URL =

"/oauth2/";//新浪微博回调页面

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) {

te(savedInstanceState);

setContentView(ty_main);

context = this;

weiboShareAPI = WeiboAPI(context, SWB_APP_ID);

userinfo_tv = (TextView) findViewById(fo_tv);

login = (Button) findViewById();

lickListener(this);

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

authInfo = new AuthInfo(context, SWB_APP_ID, SWB_REDIRECT_URL,

SWB_SCOPE);

ssoHandler = new SsoHandler(, authInfo);

ize(new AuthListener());

}

public class AuthListener implements WeiboAuthListener{

@Override

public void onCancel() {

// TODO Auto-generated method stub

xt(context, "授权取消", _LONG).show();

}

@Override

public void onComplete(Bundle values) {

// TODO Auto-generated method stub

accessToken = ccessToken(values); // 从Bundle中解析Token

String phoneNum = neNum();// 从这里获取用户输入的 电话号码信息

if (ionValid()) {

ccessToken(, accessToken);

// 保存Token

xt(context, "授权成功", _SHORT)

.show();

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

UsersAPI usersAPI = new UsersAPI(context, SWB_APP_ID,

accessToken);

(f(()), new

SinaRequestListener());

}

}).start();

}

}else{

// 以下几种情况,您会收到

// 1. 当您未在平台上注册的应用程序的包名与签名时;

// 2. 当您注册的应用程序包名与签名不正确时;

// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。

String code = ing("code");

String message = "授权失败";

if (!y(code)) {

message = message + "nObtained the code: " + code;

}

xt(context, message, _LONG).show();

}

@Override public void onWeiboException(WeiboException e)

{// TODO Auto-generated method stub

xt(context, "Auth exception : " + sage(),_LONG).show();

}

}

public Handler handler = new Handler(){

public void handleMessage(Message msg) {

if( == 1){

userinfo_t("用户id:"+()+"n"+"用户名:"+e()+"n"+"用户头像url:"+tarHd());

}

};

};

public class SinaRequestListener implements RequestListener{ //新浪微博请求接口

@Override

public void onComplete(String response) {// TODO Auto-generated method stub

try {

JSONObject jsonObject = new JSONObject(response);

String idStr = ing("idstr");// 唯一标识符(uid)

String name = ing("name");// 姓名

String avatarHd = ing("avatar_hd");// 头像

userInfo = new SinaUserInfo();

(idStr);

e(name);

tarHd(avatarHd);

Message message = ();

= 1; ssage(message);

} catch (JSONException e) {// TODO Auto-generated catch block

tackTrace();

}

}

@Override

public void onWeiboException(WeiboException e)

{// TODO Auto-generated method xt(context, "Auth exception : " +

sage(),_LONG).();

Log.i("mylog", "Auth exception : " + sage());

}

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO

Auto-generated stub

vityResult(requestCode, resultCode, data);

if(ssoHandler != null){

izeCallBack(requestCode, resultCode, data);

}

}

}

四、activity_

[html] view plain copy 在CODE上查看代码片派生到我的代码片

xmlns:tools="/tools"

android:id="@+id/LinearLayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >