android 微博登录与分享集成

android 微博登录与分享集成


       除了QQ与微信等两种常用的第三方登录,我们身边可能最能够接触的第三种三方登录也就是新浪微博登录了,但是我感觉身边用新浪微博的人儿并不是很多,感觉微博用户大多数是追星族,哈哈,可能是自己的误解吧,下面我们就来看一下android端怎么来集成微博登录和分享。我这里的应用场景是提供一个接口给h5调用。做的是混合开发,不过不管是那种,集成思路也一样。需要注意的是微博分享比较坑,大图片分享失败,分享是先把图片下载到本地,然后在从本地分享出去,而且小图片可以分享,大图片分享就闪退,应该是微博分享有对图片做限制吧,这我感觉算新浪微博的bug,但是感觉他们也不在意这个问题。毕竟微博用户现在并不是很多,反正我身边人都不喜欢用。

一、在微博开放平台上注册自己的应用,获取应用的APP_KEY, 注册过程就不多说了,大家都会的

二、首先看下项目截图

android 微博登录与分享集成_第1张图片
三、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版本签名的时候需要等待。




你可能感兴趣的:(Android)