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