话说新浪微博分享

前段时间做分享,遇到一些问题,在这里做一下记录,以供大家参考
首先说授权,微博授权分为web授权和sso单点登录授权,设备安装了微博应用就走sso授权,没安装就走web授权,先来说第一种web授权
代码如下:

WeiboAuth mWeiboAuth = new WeiboAuth(this, WeiboKey, REDIRECT_URL, SCOPE);
mWeiboAuth.anthorize(listener);

class AuthListener implements WeiboAuthListener {


    @Override
    public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
        Oauth2AccessToken mAccessToken = Oauth2AccessToken.parseAccessToken(values);
        if (mAccessToken.isSessionValid()) {
// 保存 Token 到 SharedPreferences
            AccessTokenKeeper.writeAccessToken(ShareActivity.this, mAccessToken);
            Toast.makeText(ShareActivity.this,
                    R.string.weibosdk_demo_toast_auth_success,
                    Toast.LENGTH_SHORT).show();
        } else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
            String code = values.getString("code");
            String message = getString(R.string.weibosdk_demo_toast_auth_failed);
            if (!TextUtils.isEmpty(code)) {
                message = message + "\nObtained the code: " + code;
            }
            Toast.makeText(ShareActivity.this, message, Toast.LENGTH_LONG)
                    .show();
        }
    }


    @Override
    public void onCancel() {
    }


    @Override
    public void onWeiboException(WeiboException e) {
        UIUtils.showToast(ShareActivity.this,
                "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG);
    }
}

第一句WeiboAuth mWeiboAuth = new WeiboAuth(this, WeiboKey, REDIRECT_URL, SCOPE);这里有几个参数,
weiboKey:就是开发者创建应用的时候申请的appkey,还有个secret暂时没用到
REDIRECT_URL:重定向url,建议设置为https://api.weibo.com/oauth2/default.html
SCOPE:Scope 是 OAuth2.0 新版授权页的一个功能,用户在新 OAuth2.0 授权页中有权利选择赋予应用的功能。
email – 用户的联系邮箱
direct_messages_read – 私信读取接口
direct_messages_write – 私信发送接口
friendships_groups_read – 好友分组读取接口组
friendships_groups_write – 好友分组写入接口组
statuses_to_me_read – 定向微博读取接口组
follow_app_official_microblog – 关注官方微博
invitation_write – 邀请发送接口
AccessTokenKeeper类其实就是把token保存到shareprefrence里,这里就不多说了

第二、微博应用授权,也就是sso单点登录,接着看代码

private SsoHandler mSsoHandler;
WeiboAuth mWeiboAuth = new WeiboAuth(this, WeiboKey, REDIRECT_URL, SCOPE);
mSsoHandler=new SsoHandler(this,mWeiboAuth);
        mSsoHandler.authorize(new AuthListener());
        authListener同上
        值得注意的地方就是,要实现onactivityResult方法,我当时就没仔细看,一直调不通,走了弯路
        onactivityResult里要加上以下两句代码
// SSO 授权回调
        // 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResult
        if(mSsoHandler!=null){
        mSsoHandler.authorizeCallBack(requestCode,resultCode,data);
        }
        再说下微博的分享,分享的话就简单很多了,应为业务需要我们只做了应用内分享,没用微博自己的页面
        mStatusesAPI=new StatusesAPI(AccessTokenKeeper.readAccessToken(this));
        mStatusesAPI.update(desc,null,null,mListener);
/** * 微博 OpenAPI 回调接口。 */
private RequestListener mListener=new RequestListener(){
@Override
public void onComplete(String response){
        if(!TextUtils.isEmpty(response)){
        showToast("分享成功");
        }else{
        showToast("分享失败");
        }
        }


@Override
public void onWeiboException(WeiboException e){
        showToast("分享失败");
        }
        };
        调用微博自己的页面分享就很简单了,甚至不需要授权,当然前提是设备安装了新浪微博应用
        TextObject textObject=new TextObject();
        textObject.text="balabala";
        WeiboMessage weiboMessage=new WeiboMessage();
        weiboMessage.mediaObject=textObject;
// 2. 初始化从第三方到微博的消息请求
        SendMessageToWeiboRequest request=new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
        request.transaction=String.valueOf(System.currentTimeMillis());
        request.message=weiboMessage;

        // 3. 发送请求消息到微博,唤起微博分享界面
        mWeiboShareAPI.sendRequest(request);

        大功告成,最后附上AccessTokenKeeper的代码

public class AccessTokenKeeper {
    private static final String PREFERENCES_NAME = "weibo_token";
    private static final String KEY_UID = "uid";
    private static final String KEY_ACCESS_TOKEN = "access_token";
    private static final String KEY_EXPIRES_IN = "expires_in";

    /** * 保存 Token 对象到 SharedPreferences。 * * @param context 应用程序上下文环境 * @param token Token 对象 */
    public static void writeAccessToken(Context context, Oauth2AccessToken token) {
        if (null == context || null == token) {
            return;
        }

        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        Editor editor = pref.edit();
        editor.putString(KEY_UID, token.getUid());
        editor.putString(KEY_ACCESS_TOKEN, token.getToken());
        editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime());
        editor.commit();
    }


    /** * 从 SharedPreferences 读取 Token 信息。 * * @param context 应用程序上下文环境 * @return 返回 Token 对象 */
    public static Oauth2AccessToken readAccessToken(Context context) {
        if (null == context) {
            return null;
        }

        Oauth2AccessToken token = new Oauth2AccessToken();
        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        token.setUid(pref.getString(KEY_UID, ""));
        token.setToken(pref.getString(KEY_ACCESS_TOKEN, ""));
        token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0));
        return token;
    }


    /** * 清空 SharedPreferences 中 Token信息。 * * @param context 应用程序上下文环境 */
    public static void clear(Context context) {
        if (null == context) {
            return;
        }

        SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
        Editor editor = pref.edit();
        editor.clear();
        editor.commit();
    }
}

你可能感兴趣的:(新浪微博)