第三方登陆大致流程
1.注册微博开发者账号
2.进入微博开放平台创建应用获取APP key 和APP Secret
3.给应用签名,获取MD5签名
4.在应用中嵌入代码
前三布直接略过,不懂的去看微博官方API说明文档,这里直接说嵌入代码
1.将下载好的weiboSDK项目中的weibosdkcore_v3.0.1.jar文件拷贝到libs文件夹下然后右键build path
2.在 AndroidManifest.xml文件中添加权限和activity,大概需要以下几个权限
Activity我只添加了WeiboSdkBrowser,因为授权登陆需要用到,这里自己需要那个功能就去微博SDK项目中去找,我这里仅用到授权登录,这里不再阐述
3.嵌入代码
将AccessTokenKeeper.java拷贝到项目src目录下,具体位置根据自己需求调整,这里我放在了跟登录同级目录下以方便调用,该类定义了微博授权时所需要的参数。
将Constants.java也拷贝过来,该类定义了SDK授权时需要到的APPKEY和回调地址,回调地址尽量使用新浪默认回调地址(https://api.weibo.com/oauth2/default.html),若需求需要可以根据自己需求定义自己的回调页,这里需要注意appkey要跟自己在新浪开发平台创建应用时所生成的appkey一致,scope是自己所需要用到的权限,这里定义了部分权限,需要可以自己添加
登录验证功能代码如下:
package com.example.demo06;
import java.text.SimpleDateFormat;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
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;
/**
* 该类主要演示如何进行授权、SSO登陆。
*
* @author SINA
* @since 2013-09-29
*/
public class WBAuthActivity extends Activity {
private static final String TAG = "weibosdk";
/** 显示认证后的信息,如 AccessToken */
private TextView mTokenText;
private AuthInfo mAuthInfo;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
private SsoHandler mSsoHandler;
/**
* @see {@link Activity#onCreate}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取 Token View,并让提示 View 的内容可滚动(小屏幕可能显示不全)
mTokenText = (TextView) findViewById(R.id.textView1);
TextView hintView = (TextView) findViewById(R.id.textView1);
hintView.setMovementMethod(new ScrollingMovementMethod());
// 创建微博实例
// mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY,
// Constants.REDIRECT_URL, Constants.SCOPE);
// 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
mAuthInfo = new AuthInfo(this, Constants.APP_KEY,
Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler = new SsoHandler(WBAuthActivity.this, mAuthInfo);
// SSO 授权, 仅客户端
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mSsoHandler.authorizeClientSso(new AuthListener());
}
});
// SSO 授权, 仅Web
findViewById(R.id.Button2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mSsoHandler.authorizeWeb(new AuthListener());
}
});
// SSO 授权, ALL IN ONE
findViewById(R.id.Button3).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mSsoHandler.authorize(new AuthListener());
}
});
// 用户登出
// findViewById(R.id.logout).setOnClickListener(new OnClickListener() {
// @Override
// public void onClick(View v) {
// AccessTokenKeeper.clear(getApplicationContext());
// mAccessToken = new Oauth2AccessToken();
// updateTokenView(false);
// }
// });
// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
// 第一次启动本应用,AccessToken 不可用
mAccessToken = AccessTokenKeeper.readAccessToken(this);
if (mAccessToken.isSessionValid()) {
updateTokenView(true);
}
}
/**
* 当 SSO 授权 Activity 退出时,该函数被调用。
*
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResult
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
/**
* 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用
* {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO
* 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到
* SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView(false);
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(WBAuthActivity.this,
mAccessToken);
Toast.makeText(WBAuthActivity.this, "成功", Toast.LENGTH_SHORT)
.show();
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
String message = "失败";
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(WBAuthActivity.this, message, Toast.LENGTH_LONG)
.show();
}
}
@Override
public void onCancel() {
Toast.makeText(WBAuthActivity.this, "取消", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(WBAuthActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
}
/**
* 显示当前 Token 信息。
*
* @param hasExisted
* 配置文件中是否已存在 token 信息并且合法
*/
private void updateTokenView(boolean hasExisted) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new java.util.Date(mAccessToken.getExpiresTime()));
String format = "Token:%1$s \n有效期:%2$s";
mTokenText
.setText(String.format(format, mAccessToken.getToken(), date));
String message = String.format(format, mAccessToken.getToken(), date);
if (hasExisted) {
message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;
}
mTokenText.setText(message);
}
}
此类主要功能就是微博认证授权,写一个内部微博授权验证监听类,在点击按钮时调用即可
主要出现问题
在运行程序时发现会报无法载入jar包,百度之后找到解决方法,如下所示
问题:java.lang.UnsatisfiedLinkError: Couldn't load weibosdkcore from loader dalvik.system
解决方法:找到微博官方SDK项目,在libs文件夹下armeabi文件夹下将libweibosdkcore.so文件拷贝到自己项目相同目录下即可解决
问题:程序toast报错21338
解决办法:如果报21338就说明你的Constants.java里的appkey和你申请时的APPKEY不一致,更换成相同的appkey之后问题解决,其他错误代码可以去微博开放平台找相应的问题,发现此处错误也是因为我自己疏忽大意造成,希望大家不要犯此类错误
问题程序toast报错21322
解决办法:此错误是由于回调页与自己填写时的回调页不匹配导致,
查看回调也信息方法:
登陆微博开放平台->点击我的应用->右侧列表选择应用信息->点击高级信息 ,即可查看自己定义的回调页内容,若未定义请定义为与程序中填写的回调页内容一致
其他错误代码详情请到微博开放平台wiki里查,地址如下
http://open.weibo.com/wiki/Help/error
demo已上传
http://download.csdn.net/detail/u010206381/8325279