android 微博登录与分享集成


       除了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;/** * 微博登录 */@JavascriptInterfacepublic void wbLogin () {    MainActivity.mHandle.sendEmptyMessage(WEIBO_LOGIN);}/** * 微博分享 */@JavascriptInterfacepublic 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();    }}/** * 微博分享监听 */@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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;}/** * 处理微博分享的回调 */@Overrideprotected void onNewIntent(Intent intent){    super.onNewIntent(intent);    shareHandler.doResultIntent(intent,this);}
在微博登录的监听类里面获取到用户信息之后又发送消息到JavaScriptUtils里面的Handle里面去调用h5方法然后就返回用户信息给前端了。我还是贴一下吧,JavaScriptUtils类里面写的
// 消息接受handle,android调用jspublic 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版本签名的时候需要等待。




更多相关文章

  1. Android聊天列表Demo(QQ,微信,等通讯工具的聊天列表)
  2. Android异步消息处理机制 深入理解Looper、Handler、Message的关
  3. Android(安卓)使用极光推送自定义消息打造个性的消息推送效果
  4. Android一键分享至社交平台
  5. Android之SqliteDatabase(MVP模式)实现用户登录注册功能
  6. Android通讯录管理(获取联系人、通话记录、短信消息)(一)
  7. 从破解APP开始学Android——用户登录验证
  8. android 某些三星手机上不显示通知Notification和消息Toast
  9. Android消息机制源码阅读

随机推荐

  1. Android加载网络图片并保存到系统相册
  2. Android用自己的app替换Launcher
  3. 看完这篇。再也不怕被问 HandlerThread
  4. 《转》完美解决微信video视频隐藏控件和
  5. Android(安卓)通过软引用实现图片缓存,防
  6. 更改cocos2d-x android 项目的cocos2d-x
  7. android studio配置retrolambda
  8. Android中的前置服务
  9. android SDK 代理配置(东北大学)
  10. Android(安卓)常用代码段收集(不断更新)(都