除了QQ与微信等两种常用的第三方登录,我们身边可能最能够接触的第三种三方登录也就是新浪微博登录了,但是我感觉身边用新浪微博的人儿并不是很多,感觉微博用户大多数是追星族,哈哈,可能是自己的误解吧,下面我们就来看一下android端怎么来集成微博登录和分享。我这里的应用场景是提供一个接口给h5调用。做的是混合开发,不过不管是那种,集成思路也一样。需要注意的是微博分享比较坑,大图片分享失败,分享是先把图片下载到本地,然后在从本地分享出去,而且小图片可以分享,大图片分享就闪退,应该是微博分享有对图片做限制吧,这我感觉算新浪微博的bug,但是感觉他们也不在意这个问题。毕竟微博用户现在并不是很多,反正我身边人都不喜欢用。
一、在微博开放平台上注册自己的应用,获取应用的APP_KEY, 注册过程就不多说了,大家都会的
二、首先看下项目截图
三、build.gradle里面加入微博登录所需要的包
// 微博登录
compile 'com.sina.weibo.sdk:core:4.2.7:openDefaultRelease@aar'
三、AndroidManifest.xml加入所需要的网络权限
四、Constant类
package com.iwiteks.PalmarTourism.util;
/**
* Created by spirits on 2018/3/20.
*/
public class Constant {
/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
public static final String APP_KEY = "*************";
/**
* 当前 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";
}
五、new_file.html里面的html就不贴出来了,就是简单的按钮然后js调用android,然后在JavaScriptUtils里面android回调js返回结果。JavaScriptUtils是这样申明接口的
public static final int WEIBO_LOGIN = 6009;
public static final int WEIBO_SHARE = 6010;
/**
* 微博登录
*/
@JavascriptInterface
public void wbLogin () {
MainActivity.mHandle.sendEmptyMessage(WEIBO_LOGIN);
}
/**
* 微博分享
*/
@JavascriptInterface
public void wbShare(){
MainActivity.mHandle.sendEmptyMessage(WEIBO_SHARE);
}
六、MainActivity,精华都在这,收到消息后的处理
// 接受消息回调
public static Handler mHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == JavaScriptUtils.WEIBO_LOGIN){
AuthInfo mAuthInfo = new AuthInfo(mActivity, Constant.APP_KEY, Constant.REDIRECT_URL, Constant.SCOPE);
WbSdk.install(mActivity,mAuthInfo);
mSsoHandler = new SsoHandler(mActivity);
mSsoHandler.authorize(new AuthListener());
}else if (msg.what == JavaScriptUtils.WEIBO_SHARE) {
WbSdk.install(mActivity,new AuthInfo(mActivity, Constant.APP_KEY,Constant.REDIRECT_URL, Constant.SCOPE));//创建微博API接口类对象
shareHandler = new WbShareHandler(mActivity);
shareHandler.registerApp();
sendMultiMessage(true,true);
}
}
};
在mHandle里面用到的方法也写在MainActivity里面如下,一个AuthInfo监听和一个sendMultiMessage方法如下
/**
* 微博登录监听
*/
private static class AuthListener implements WbAuthListener {
Thread thread = new Thread();
@Override
public void onSuccess(Oauth2AccessToken oauth2AccessToken) {
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url("https://api.weibo.com/2/users/show.json?access_token=" + oauth2AccessToken.getToken() + "&uid=" + oauth2AccessToken.getUid())
.get()
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
String result = response.body().string();
Message message = new Message();
message.what = JavaScriptUtils.WEIBO_LOGIN;
message.obj = result;
JavaScriptUtils.mHandler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
});
} else {
}
}
});
}
@Override
public void cancel() {
Toast.makeText(mActivity, "登录取消", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(WbConnectErrorMessage wbConnectErrorMessage) {
Toast.makeText(mActivity, "登录失败", Toast.LENGTH_SHORT).show();
}
}
/**
* 微博分享监听
*/
@Override
public void onWbShareSuccess() {
Toast.makeText(mActivity, "分享成功", Toast.LENGTH_SHORT).show();
Message message = new Message();
message.what = JavaScriptUtils.WEIBO_SHARE;
message.obj = "success";
JavaScriptUtils.mHandler.sendMessage(message);
}
@Override
public void onWbShareCancel() {
Toast.makeText(mActivity, "分享取消", Toast.LENGTH_SHORT).show();
Message message = new Message();
message.what = JavaScriptUtils.WEIBO_SHARE;
message.obj = "cancel";
JavaScriptUtils.mHandler.sendMessage(message);
}
@Override
public void onWbShareFail() {
Toast.makeText(mActivity, "分享失败", Toast.LENGTH_SHORT).show();
Message message = new Message();
message.what = JavaScriptUtils.WEIBO_SHARE;
message.obj = "fail";
JavaScriptUtils.mHandler.sendMessage(message);
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面实现方法。
*/
private static void sendMultiMessage(boolean hasText, boolean hasImage) {
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
if (hasText) {
weiboMessage.textObject = getTextObj();
}
if (hasImage) {
weiboMessage.imageObject = getImageObj(mActivity);
}
shareHandler.shareMessage(weiboMessage, false);
}
/**
* 创建文本消息对象。
* @return 文本消息对象。
*/
private static TextObject getTextObj() {
TextObject textObject = new TextObject();
textObject.text = "这里是分享的内容";
textObject.title = "演员赵诗绎";
textObject.actionUrl = "http://www.baidu.com";
return textObject;
}
/**
* 创建图片消息对象。
* @return 图片消息对象。
*/
private static ImageObject getImageObj(Context context) {
ImageObject imageObject = new ImageObject();
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
imageObject.setImageObject(bitmap);
return imageObject;
}
/**
* 处理微博分享的回调
*/
@Override
protected void onNewIntent(Intent intent){
super.onNewIntent(intent);
shareHandler.doResultIntent(intent,this);
}
在微博登录的监听类里面获取到用户信息之后又发送消息到JavaScriptUtils里面的Handle里面去调用h5方法然后就返回用户信息给前端了。我还是贴一下吧,JavaScriptUtils类里面写的
// 消息接受handle,android调用js
public static Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
String method = "";
if (msg.what == WEIBO_LOGIN) {
String result = (String) msg.obj;
method = "javascript:_Native_weiboLogin("+result+")";
} else if (msg.what == WEIBO_SHARE) {
String result = (String) msg.obj;
method = "javascript:_Native_weiboShare('"+result+"')";
}
mWebView.evaluateJavascript(method, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
//此处为 js 返回的结果
}
});
}
};
至此在集成微博登录与分享的时候也要注意app签名,需要一致才可以集成成功,和微信登录一样,用debug版本签名即可测试成功,微信登录与分享release版本修改的签名有延迟,而dubug版本秒改,所以在修改release版本签名的时候需要等待。