集成前准备
1. 申请APP_KEY
第三方需要接入微博SDK必须在微博开放平台上对应用进行注册,并获取APP_KEY,添加
应用的授权回调页面(Redirect URI)
2. 注册应用程序的包名和签名
您需要在微博开放平台上注册应用程序的包名和签名后,才能正确进行授权。
请注意:包名和签名未注册,或者签名注册不正确,都会导致无法授权。
应用程序包名:指AndroidManifest.xml文件中,package标签所代表的内容。
应用程序签名:该签名是通过官方提供的签名工具生成的MD5值。
详情请查看:微博Android平台SDK文档V4.0pdf 中:如何使用签名工具获取您应用的签名?
注:这个pdf链接不知道是我浏览器的原因还是怎么回事,一直是打不开的,但是这个文档在文章末尾提到的官方demo中,是有这个文档的,大家可以将demo下载下来,然后就可以看里面的 Android平台SDK文档V4.0pdf。
3. 集成sdk
1:Android Studio接入 在你工程的主模块下面修改build.gradle文件,添加微博sdk的依赖
allprojects {
repositories {
jcenter()
mavenCentral()
maven { url "https://dl.bintray.com/thelasterstar/maven/" }
}
}
compile 'com.sina.weibo.sdk:core:4.1.4:openDefaultRelease@aar'
或者将新文档目录下的openDefault-4.1.4.aar复制到工程libs目录下,修改build.gradle文件如下:
repositories{
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1'
compile(name: 'openDefault-4.1.4', ext: 'aar')
}
2:关于so
微博sdk aar中默认直提供了[armeabi] [armeabi-v7a] [x86]三个平台的so,如果你需要适配更多版本的so,请到github->so目录中获取全部平台的so文件
如果你只想引入特别的平台在gradle 中配置如下
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a' //根据需求自己修改
universalApk true
}
}
3:关于混淆
-keep class com.sina.weibo.sdk.** { *; }
应用接入
1. 替换成自己应用的 APP_KEY 等参数
定义Constants接口,并将Constants类中的各种参数替换成自己应用的参数,请仔细阅读代码注释。
public interface Constants {
/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
public static final String APP_KEY = "2045436852";
/**
* 当前 DEMO 应用的回调页,第三方应用可以使用自己的回调页。
* 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
*/
public static final String REDIRECT_URL = "http://www.sina.com";
/**
* WeiboSDKDemo 应用对应的权限,第三方开发者一般不需要这么多,可直接设置成空即可。
* 详情请查看 Demo 中对应的注释。
*/
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";
}
2. 初始化WbSdk对象
初始化WbSdk对象,在你的应用的Application或者调用Sdk功能代码前。
建立一个MyApplication.java文件,继承Application。并且在Mainifest.xml修改使用自己定义的Application。
package com.sdlj.vehiclerepair.util;
import android.app.Application;
import android.util.Log;
import com.sdlj.vehiclerepair.webo.Constants;
import com.sina.weibo.sdk.WbSdk;
import com.sina.weibo.sdk.auth.AuthInfo;
/**
* Created by Chunna.zheng on 2017/9/7.
*/
public class MyApplication extends Application {
private static final String TAG = "ZCN==VehicleApplication";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"=====onCreate()=====");
//初始化WbSdk
WbSdk.install(this,new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE));
}
}
3.Activity中接入登录
布局文件中只有一个id为btn_login_wb的Button按钮。
LoginActivity.java文件
public class LoginActivity extends AppCompatActivity implements View.OnClickListener{
public static final String TAG = "ZCN_LoginActivity";
private Button btnWB;
private SsoHandler mSsoHandler;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnWB = (Button)findViewById(R.id.btn_login_wb);
btnWB.setOnClickListener(this);
mSsoHandler = new SsoHandler(LoginActivity.this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.btn_login_wb:
// SSO 授权, 仅客户端
//mSsoHandler.authorizeClientSso(new SelfWbAuthListener());
// SSO 授权, 仅Web
//mSsoHandler.authorizeWeb(new SelfWbAuthListener());
// SSO 授权, ALL IN ONE 如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权
mSsoHandler.authorize(new SelfWbAuthListener());
break;
}
}
/**
* 当 SSO 授权 Activity 退出时,该函数被调用。
*
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResults
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener{
@Override
public void onSuccess(final Oauth2AccessToken token) {
LoginActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAccessToken = token;
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView(false);
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(LoginActivity.this, mAccessToken);
Log.d(TAG,"=====onSuccess=====");
Toast.makeText(LoginActivity.this,"授权成功", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void cancel() {
Log.d(TAG,"=====cancel=====");
Toast.makeText(LoginActivity.this,"取消授权", Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(WbConnectErrorMessage errorMessage) {
Log.d(TAG,"=====onFailure=====");
Toast.makeText(LoginActivity.this, errorMessage.getErrorMessage(), 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";
Log.d(TAG,String.format(format, mAccessToken.getToken(), date));
String message = String.format(format, mAccessToken.getToken(), date);
if (hasExisted) {
message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;
}
Log.d(TAG,message);
}
}