微博第三方登录##
微博第三方登录,在这里记录一下笔记,获取到授权,切获取到头像名字等个人信息
首先在微博开发者平台注册
填写基本的信息
应用包名(千万不能有空格,这是一个坑)
签名工具自己到网上下载一个,把自己的app装到手机,打开签名工具填写包名,可以获得签名,从手机上把签名填写到签名处
之后就可以获得App_Key 和 App Secret,之后要用。
在应用信息的高级信息填写回调页,之后要用
之后就是代码问题了
打开自己的工程,导入官方的sdk,建立依赖,下载sdk可以到官方开发品台去下载,我的是SDK3.1.1 。官方下载的。顺便把官方的demo也一起打开,里面的工具类,可以用。
将demo里面的Constant接口和AccessTokenKeeper类考到自己的工程里;修改App_key,填写自己之前得到的的App key,回调页的网址和之前在开发平台填写的必须要一样。
package com.example.administrator.installapkapplication;
/**
* 该类定义了微博授权时所需要的参数。
*
* @author SINA
* @since 2013-09-29
*/
public interface Constants {
/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
public static final String APP_KEY = "1196****82";
/**
* 当前 DEMO 应用的回调页,第三方应用可以使用自己的回调页。
*
*
* 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响,
* 但是没有定义将无法使用 SDK 认证登录。
* 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
*
*/
public static final String REDIRECT_URL = "http://www.sina.com";
/**
* Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。通过 Scope,平台将开放更多的微博
* 核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新 OAuth2.0 授权页中有权利
* 选择赋予应用的功能。
*
* 我们通过新浪微博开放平台-->管理中心-->我的应用-->接口管理处,能看到我们目前已有哪些接口的
* 使用权限,高级权限需要进行申请。
*
* 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。
*
* 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
* 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope
*/
public static final String SCOPE =
"email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," + "invitation_write";
}
AccessTokenKeeper里面的东西不用修改。
之后就是主页面的程序了
package com.example.administrator.installapkapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
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 java.text.SimpleDateFormat;
public class LoginActivity extends AppCompatActivity {
private TextView textView;
private AuthInfo mAuthInfo;
private SsoHandler mSsoHandler;
private Oauth2AccessToken mAccessToken;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
init();
}
private void init() {
textView = (TextView) findViewById(R.id.text);
mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler = new SsoHandler(LoginActivity.this, mAuthInfo);
}
public void Login(View view) {
mSsoHandler.authorizeClientSso(new AuthListener());
}
private String phoneNum;
public void LoginUser(View view) {
Intent intent=new Intent(this,UserActivity.class);
startActivity(intent);
}
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
//从这里获取用户输入的 电话号码信息
phoneNum = mAccessToken.getPhoneNum();
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView(false);
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(LoginActivity.this, mAccessToken);
Toast.makeText(LoginActivity.this,
R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
String message = "fail";
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(LoginActivity.this, message, Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancel() {
Toast.makeText(LoginActivity.this,
"取消", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(LoginActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mSsoHandler != null&&data!=null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
private void updateTokenView(boolean hasExisted) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
new java.util.Date(mAccessToken.getExpiresTime()));
String format = getString(R.string.weibosdk_demo_token_to_string_format_1);
textView.setText(phoneNum+":num"+String.format(format, mAccessToken.getToken(), date));
String message = String.format(format, mAccessToken.getToken(), date);
if (hasExisted) {
message = getString(R.string.weibosdk_demo_token_has_existed) + "\n" + message;
}
textView.setText(message);
}
}
在这里的布局就是一个按钮和一个textview,显示获取到的token值
这就表示授权成功了
再写一个类,叫UserActivity 获取头像,名字
看代码:
package com.example.administrator.installapkapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.User;
public class UserActivity extends AppCompatActivity {
private AuthInfo authInfo;
private UsersAPI mUsersAPI;
private TextView textView;
private TextView textView1;
private TextView textView2;
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
init();
}
private void init() {
mUsersAPI = new UsersAPI(this, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(this));
long uid = Long.parseLong(AccessTokenKeeper.readAccessToken(this).getUid());
mUsersAPI.show(uid, mListenermListener);
authInfo = new AuthInfo(this, Constants.APP_KEY,
Constants.REDIRECT_URL, Constants.SCOPE); //软件认证
textView = (TextView) findViewById(R.id.name);
textView1 = (TextView) findViewById(R.id.name1);
textView2 = (TextView) findViewById(R.id.name2);
image = (ImageView) findViewById(R.id.image);
}
//实现异步请求接口回调,并在回调中直接解析 User 信息
private RequestListener mListenermListener = new RequestListener() {
@Override
public void onComplete(String s) {
if (!TextUtils.isEmpty(s)) { //如果不为空
User user = User.parse(s);
String name = user.name;
textView.setText(name);
Log.i("aaa", String.valueOf(user.bi_followers_count));
textView1.setText(user.province+" "+user.city);
String uri = user.avatar_hd;
Log.i("dsadsad", uri);
textView2.setText(user.description);
Glide.with(getApplicationContext()).load(uri).into(image);
}
}
@Override
public void onWeiboException(WeiboException e) {
}
};
}
授权成功后,写这个类,导入相应的包,就能获取到头像啊,名字那些,具体的可以查看User类,里面有相应的解释
到此就结束了呢