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

2024-05-09 04:32

本文主要是介绍Android授权登录新浪微博获取用户个人信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明出处:http://blog.csdn.net/u010214991/article/details/49149793

记得第一次发博文的时候我写了一篇文章,题为“ Android使用官方API分享内容到QQ和微信(非第三方集成)”,里面介绍了如何使用各官方提供的SDK来实现分享功能。那么今天我们来讲讲如何通过新浪微博授权登录获取用户信息,大家都知道,现在很多软件除了本地注册登录之外,还增加了第三方登录功能,最常见的是直接授权QQ等软件来登录应用而无需自行注册,其原理更多的是通过开放协议OAuth获取第三方用户信息来达到此目的。本篇讲的正是基于OAuth认证来获取新浪微博用户信息。


一、准备工作

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

点击创建应用后会出现如下图所示页面,在这个页面中你必须要填写你的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中添加权限:

<uses-permission android:name="android.permission.INTERNET"/>


三、动手写代码

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

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

public class SinaUserInfo {private String uid;//用户IDprivate String name;//用户昵称private String avatarHd;//用户头像urlpublic SinaUserInfo() {super();// TODO Auto-generated constructor stub}public String getUid() {return uid;}public void setUid(String uid) {this.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文件中,授权登录并获取信息的具体流程是这样子的,首先通过我们之前审核通过的APPID来实例化IWeiboShareAPI:

weiboShareAPI = WeiboShareSDK.createWeiboAPI(context, SWB_APP_ID);

然后获取OAuth协议信息,并设置授权回调接口:

authInfo = new AuthInfo(context, SWB_APP_ID, SWB_REDIRECT_URL, SWB_SCOPE);ssoHandler = new SsoHandler(MainActivity.this, authInfo);ssoHandler.authorize(new AuthListener());
在授权回调接口当中,我们通过利用onComplete方法中的参数values来解析访问令牌accessToken,并通过AccessTokenKeeper这个类将accessToken保存,这样我们就完成了授权,紧接着我们开了一个线程,实例化UsersAPI并调用show()方法,这个方法有两个参数,由于我们是通过accessToken.getUid()也就是用户ID来获取用户信息的,所以这里的参数类型是long而不是String,如果你不转成long的话,他实际上是通过用户名来访问用户信息的,那么就会出现“ com.weibo.sdk.android.WeiboException: {"error":"User does not exists!","error_code":20003,"request":"/2/users/show.json"}”,也就是用户不存在的现象。

@Overridepublic void onComplete(Bundle values) {// TODO Auto-generated method stubaccessToken = Oauth2AccessToken.parseAccessToken(values); // 从Bundle中解析TokenString phoneNum = accessToken.getPhoneNum();// 从这里获取用户输入的 电话号码信息if (accessToken.isSessionValid()) {  AccessTokenKeeper.writeAccessToken(MainActivity.this, accessToken); // 保存TokenToast.makeText(context, "授权成功", Toast.LENGTH_SHORT).show();new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubUsersAPI usersAPI = new UsersAPI(context, SWB_APP_ID, accessToken);usersAPI.show(Long.valueOf(accessToken.getUid()), new SinaRequestListener()); }}).start();}else{                        	
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 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中得到返回的json数据,
通过解析json数据就可以得到我们想要的新浪微博用户信息啦,到此整个流程也就结束了,以下是请求接口的部分代码。


public class SinaRequestListener implements RequestListener{ //新浪微博请求接口@Overridepublic void onComplete(String response) {// TODO Auto-generated method stubtry {JSONObject jsonObject = new JSONObject(response);String idStr = jsonObject.getString("idstr");// 唯一标识符(uid)  String name = jsonObject.getString("name");// 姓名  String avatarHd = jsonObject.getString("avatar_hd");// 头像  

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

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if(ssoHandler != null){ssoHandler.authorizeCallBack(requestCode, resultCode, data);}}


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

import org.json.JSONException;
import org.json.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.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;import com.gdruichao.bbt.common.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.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.net.RequestListener;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 = "https://api.weibo.com/oauth2/default.html";//新浪微博回调页面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";@Overrideprotected void onCreate(Bundle savedInstanceState) {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);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubauthInfo = 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{@Overridepublic void onCancel() {// TODO Auto-generated method stubToast.makeText(context, "授权取消", Toast.LENGTH_LONG).show();}@Overridepublic void onComplete(Bundle values) {// TODO Auto-generated method stubaccessToken = Oauth2AccessToken.parseAccessToken(values); // 从Bundle中解析TokenString phoneNum = accessToken.getPhoneNum();// 从这里获取用户输入的 电话号码信息if (accessToken.isSessionValid()) {  AccessTokenKeeper.writeAccessToken(MainActivity.this, accessToken); // 保存TokenToast.makeText(context, "授权成功", Toast.LENGTH_SHORT).show();new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubUsersAPI usersAPI = new UsersAPI(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 = "授权失败";
if (!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 stubToast.makeText(context, "Auth exception : " + e.getMessage(),Toast.LENGTH_LONG).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 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 SinaUserInfo();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(WeiboException e) 
{// TODO Auto-generated method stubToast.makeText(context, "Auth exception : " + e.getMessage(),Toast.LENGTH_LONG).show();
Log.i("mylog", "Auth exception : " + e.getMessage());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(ssoHandler != null){
ssoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
}



四、activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/LinearLayout1"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity" ><Buttonandroid:id="@+id/login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="新浪微博登录获取用户信息" /><TextViewandroid:id="@+id/userinfo_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:textSize="20dp"android:text="" /></LinearLayout>

五、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.gdruichao.bbt"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.gdruichao.bbt.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!-- 新浪微博网页授权登录相关配置 --><activityandroid:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"android:configChanges="keyboardHidden|orientation"android:exported="false"android:windowSoftInputMode="adjustResize" ></activity></application></manifest>

其实也就加了个网络访问权限和新浪微博网页授权登录配置,防止用户没有新浪微博客户端的情况,如果你已经有新浪微博客户端了,可以不加这个网页授权这个配置,不过为了安全起见你还是加吧哈哈。


最后附上源码下载, Android授权第三方登录获取新浪微博用户信息,注意运行测试的时候要改成你自己的APPID和包名。好了,本篇到此结束了,欢迎有疑问或建议的童鞋热烈表白,咱们下期见!

这篇关于Android授权登录新浪微博获取用户个人信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972396

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取