新浪微博授权 分享

微博官方demo:http://pan.baidu.com/s/1eQIhjqy

1.需要回调的activity上加接收器

<activity
android:name="com.qingbai.mengpai.ui.ShareActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

2.加入权限,与版本号

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.测试时,可以使用微博测试账号的KEY和包名
APP_KEY= "2045436852";
包名=com.sina.weibo.sdk.demo
3.下载debug.keystore 替换 ADT原有的那个文件
http://pan.baidu.com/s/1gdCF3wB
5.导入jar包:
http://pan.baidu.com/s/1jGKGPIA
4.贴代码:
package com.qingbai.mengpai.share;

import java.text.SimpleDateFormat;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.demo.R;
import com.qingbai.mengpai.tool.MyLog;
import com.qingbai.mengpai.ui.BaseFragmentActivity;
import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.MusicObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.VideoObject;
import com.sina.weibo.sdk.api.VoiceObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboDownloadListener;
import com.sina.weibo.sdk.api.share.IWeiboHandler;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.exception.WeiboShareException;
import com.sina.weibo.sdk.utils.Utility;

public class SinaShare extends Activity implements IWeiboHandler.Response{
	
    /** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
    public  final String APP_KEY= "2045436852";//994010941
  //  public  final String REDIRECT_URL = "http://api.weibo.com/oauth2/default.html";
    public static final String REDIRECT_URL = "http://www.sina.com";
    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";
    
    private SsoHandler mSsoHandler;
    /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能  */
    private Oauth2AccessToken mAccessToken;

    //分享
    /** 微博微博分享接口实例 */
    private IWeiboShareAPI  mWeiboShareAPI = null;
    String title="分享标题";
    String description="分享描述";
    String actionUrl="http://www.baidu.com";//分享链接
    String defaultText="Webpage 默认文案";//默认文本
    String dataUrl="www.weibo.com";//视频链接地址
    String dataHdUrl="www.weibo.com";//视频高清链接地址
    Bitmap shareImage=null;
    @Override
	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sina_share);
        shareImage=((BitmapDrawable)getResources().getDrawable(R.drawable.logo)).getBitmap();
        weiboAuth();
    }
//授权开始//////////////////////////////////////////////////////////////////////////////////////////////////   
    /**
     * 微博授权认证
     */
    public void weiboAuth(){
    	
    	WeiboAuth   mWeiboAuth=new WeiboAuth(SinaShare.this, APP_KEY, REDIRECT_URL, SCOPE);
        mSsoHandler = new SsoHandler(SinaShare.this, mWeiboAuth);
        mSsoHandler.authorize(new AuthListener());
        /*mWeiboAuth.anthorize(new AuthListener());*/
    }
    /**
     * 当 SSO 授权 Activity 退出时,该函数被调用。
     * 
     * @see {@link Activity#onActivityResult}
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        // SSO 授权回调
        // 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResult
        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }
    /**
     * 微博认证授权回调类。
     * 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
     *    该回调才会被执行。
     * 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
     * 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
     */
    class AuthListener implements WeiboAuthListener {
        
        @Override
        public void onComplete(Bundle values) {
            // 从 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            if (mAccessToken.isSessionValid()) {
                // 显示 Token
                updateTokenView(false);
                
                // 保存 Token 到 SharedPreferences
                AccessTokenKeeper.writeAccessToken(SinaShare.this, mAccessToken);
                Toast.makeText(SinaShare.this, 
                        R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();
            } else {
                // 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
                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(SinaShare.this, message, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onCancel() {
            Toast.makeText(SinaShare.this, "cancel", Toast.LENGTH_LONG).show();
        }
        
        @Override
        public void onWeiboException(WeiboException e) {
            Toast.makeText(SinaShare.this, "Auth exception : " + e.getMessage(), 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";
       MyLog.toLog(String.format(format, mAccessToken.getToken(), date));
        
        String message = String.format(format, mAccessToken.getToken(), date);
        if (hasExisted) {
            message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;
        }
        MyLog.toLog(message);
    }
    ////////////////////////////////////////分享开始///////////////////////////////////////
    /**
     * 一键分享
     */
    public void myclick(View v){
        if(checkVersion()){
            try {
                // 检查微博客户端环境是否正常,如果未安装微博,弹出对话框询问用户下载微博客户端
                if (mWeiboShareAPI.checkEnvironment(true)) {
                    
                    // 注册第三方应用 到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
                    // 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
                    mWeiboShareAPI.registerApp();
                    
                    sendMessage(false, false, true,false,  false, false);
                }
            } catch (WeiboShareException e) {
                e.printStackTrace();
                Toast.makeText(SinaShare.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
    }
    
    /**
     * 是否有安装微博客户端
     */
    public Boolean checkVersion(){
        // 创建微博分享接口实例
        mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, APP_KEY); 
        // 如果未安装微博客户端,设置下载微博对应的回调
        if (!mWeiboShareAPI.isWeiboAppInstalled()) {
            mWeiboShareAPI.registerWeiboDownloadListener(new IWeiboDownloadListener() {
                @Override
                public void onCancel() {
                    Toast.makeText(SinaShare.this, "取消下载微博客户端",  Toast.LENGTH_SHORT).show();
                }
            });
            return false;
        }
        return true;
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        
        // 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
        // 来接收微博客户端返回的数据;执行成功,返回 true,并调用
        // {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
        mWeiboShareAPI.handleWeiboResponse(intent, this);
    }
    /**
     * 接收微客户端博请求的数据。
     * 当微博客户端唤起当前应用并进行分享时,该方法被调用。
     * 
     * @param baseRequest 微博请求数据对象
     * @see {@link IWeiboShareAPI#handleWeiboRequest}
     */
    @Override
    public void onResponse(BaseResponse baseResp) {
        switch (baseResp.errCode) {
        case WBConstants.ErrorCode.ERR_OK:
            Toast.makeText(this, "分享成功", Toast.LENGTH_LONG).show();
            break;
        case WBConstants.ErrorCode.ERR_CANCEL:
            Toast.makeText(this, "分享取消", Toast.LENGTH_LONG).show();
            break;
        case WBConstants.ErrorCode.ERR_FAIL:
            Toast.makeText(this, "分享失败" + "Error Message: " + baseResp.errMsg, Toast.LENGTH_LONG).show();
            break;
        }
    }
    /**
     * 第三方应用发送请求消息到微博,唤起微博分享界面。
     * @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}
     */
    private void sendMessage(boolean hasText, boolean hasImage, boolean hasWebpage, boolean hasMusic, boolean hasVideo, boolean hasVoice) {
        
        if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
            int supportApi = mWeiboShareAPI.getWeiboAppSupportAPI();
            if (supportApi >= 10351 /*ApiUtils.BUILD_INT_VER_2_2*/) {
                sendMultiMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo, hasVoice);
            } else {
                sendSingleMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo/*, hasVoice*/);
            }
        } else {
            Toast.makeText(this, "微博客户端不支持,请升级版本", Toast.LENGTH_SHORT).show();
        }
    }
    /**
     * 第三方应用发送请求消息到微博,唤起微博分享界面。
     * 注意:当 {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时,支持同时分享多条消息,
     * 同时可以分享文本、图片以及其它媒体资源(网页、音乐、视频、声音中的一种)。
     * 
     * @param hasText    分享的内容是否有文本
     * @param hasImage   分享的内容是否有图片
     * @param hasWebpage 分享的内容是否有网页
     * @param hasMusic   分享的内容是否有音乐
     * @param hasVideo   分享的内容是否有视频
     * @param hasVoice   分享的内容是否有声音
     */
    private void sendMultiMessage(boolean hasText, boolean hasImage, boolean hasWebpage,
            boolean hasMusic, boolean hasVideo, boolean hasVoice) {
        
        // 1. 初始化微博的分享消息
        WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
        if (hasText) {
            weiboMessage.textObject = getTextObj();
        }
        
        if (hasImage) {
            weiboMessage.imageObject = getImageObj();
        }
        
        // 用户可以分享其它媒体资源(网页、音乐、视频、声音中的一种)
        if (hasWebpage) {
            weiboMessage.mediaObject = getWebpageObj();
        }
        if (hasMusic) {
            weiboMessage.mediaObject = getMusicObj();
        }
        if (hasVideo) {
            weiboMessage.mediaObject = getVideoObj();
        }
        if (hasVoice) {
            weiboMessage.mediaObject = getVoiceObj();
        }
        
        // 2. 初始化从第三方到微博的消息请求
        SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
        // 用transaction唯一标识一个请求
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.multiMessage = weiboMessage;
        
        // 3. 发送请求消息到微博,唤起微博分享界面
        mWeiboShareAPI.sendRequest(request);
    }
    /**
     * 第三方应用发送请求消息到微博,唤起微博分享界面。
     * 当{@link IWeiboShareAPI#getWeiboAppSupportAPI()} < 10351 时,只支持分享单条消息,即
     * 文本、图片、网页、音乐、视频中的一种,不支持Voice消息。
     * 
     * @param hasText    分享的内容是否有文本
     * @param hasImage   分享的内容是否有图片
     * @param hasWebpage 分享的内容是否有网页
     * @param hasMusic   分享的内容是否有音乐
     * @param hasVideo   分享的内容是否有视频
     */
    private void sendSingleMessage(boolean hasText, boolean hasImage, boolean hasWebpage,
            boolean hasMusic, boolean hasVideo/*, boolean hasVoice*/) {
        
        // 1. 初始化微博的分享消息
        // 用户可以分享文本、图片、网页、音乐、视频中的一种
        WeiboMessage weiboMessage = new WeiboMessage();
        if (hasText) {
            weiboMessage.mediaObject = getTextObj();
        }
        if (hasImage) {
            weiboMessage.mediaObject = getImageObj();
        }
        if (hasWebpage) {
            weiboMessage.mediaObject = getWebpageObj();
        }
        if (hasMusic) {
            weiboMessage.mediaObject = getMusicObj();
        }
        if (hasVideo) {
            weiboMessage.mediaObject = getVideoObj();
        }
        /*if (hasVoice) {
            weiboMessage.mediaObject = getVoiceObj();
        }*/
        
        // 2. 初始化从第三方到微博的消息请求
        SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
        // 用transaction唯一标识一个请求
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.message = weiboMessage;
        
        // 3. 发送请求消息到微博,唤起微博分享界面
        mWeiboShareAPI.sendRequest(request);
    }
    /**
     * 创建文本消息对象。
     * 
     * @return 文本消息对象。
     */
    private TextObject getTextObj() {
        TextObject textObject = new TextObject();
        String  text = String.format("我正在使用微博客户端发博器分享文字", "【%1$s】(分享自 菜菜一号 %2$s)", 
        		"https://github.com/mobileresearch/weibo_android_sdk/blob/master/WeiboSDKDemo.apk");
        textObject.text =text;
        return textObject;
    }

    /**
     * 创建图片消息对象。
     * 
     * @return 图片消息对象。
     */
    private ImageObject getImageObj() {
        ImageObject imageObject = new ImageObject();
        imageObject.setImageObject(shareImage);
        return imageObject;
    }

    /**
     * 创建多媒体(网页)消息对象。
     * 
     * @return 多媒体(网页)消息对象。
     */
    private WebpageObject getWebpageObj() {
        WebpageObject mediaObject = new WebpageObject();
        mediaObject.identify = Utility.generateGUID();
        mediaObject.title =title;
        mediaObject.description = description;
        
        // 设置 Bitmap 类型的图片到视频对象里
        
        mediaObject.setThumbImage(shareImage);
        mediaObject.actionUrl = actionUrl;
        mediaObject.defaultText = defaultText;
        return mediaObject;
    }

    /**
     * 创建多媒体(音乐)消息对象。
     * 
     * @return 多媒体(音乐)消息对象。
     */
    private MusicObject getMusicObj() {
        // 创建媒体消息
        MusicObject musicObject = new MusicObject();
        musicObject.identify = Utility.generateGUID();
        musicObject.title =title;
        musicObject.description =description;
        
        // 设置 Bitmap 类型的图片到视频对象里
        musicObject.setThumbImage(shareImage);
        musicObject.actionUrl = actionUrl;
        musicObject.dataUrl = dataUrl;
        musicObject.dataHdUrl =dataHdUrl;
        musicObject.duration = 10;
        musicObject.defaultText = defaultText;
        return musicObject;
    }
    /**
     * 创建多媒体(视频)消息对象。
     * 
     * @return 多媒体(视频)消息对象。
     */
    private VideoObject getVideoObj() {
        // 创建媒体消息
        VideoObject videoObject = new VideoObject();
        videoObject.identify = Utility.generateGUID();
        videoObject.title =title;
        videoObject.description =description;
        
        // 设置 Bitmap 类型的图片到视频对象里
        videoObject.setThumbImage(shareImage);
        videoObject.actionUrl =actionUrl;
        videoObject.dataUrl = dataUrl;
        videoObject.dataHdUrl = dataHdUrl;
        videoObject.duration = 10;
        videoObject.defaultText = defaultText;
        return videoObject;
    }

    /**
     * 创建多媒体(音频)消息对象。
     * 
     * @return 多媒体(音乐)消息对象。
     */
    private VoiceObject getVoiceObj() {
        // 创建媒体消息
        VoiceObject voiceObject = new VoiceObject();
        voiceObject.identify = Utility.generateGUID();
        voiceObject.title =title;
        voiceObject.description = description;
        
        // 设置 Bitmap 类型的图片到视频对象里
        voiceObject.setThumbImage(shareImage);
        voiceObject.actionUrl = actionUrl;
        voiceObject.dataUrl = dataUrl;
        voiceObject.dataHdUrl =dataHdUrl;
        voiceObject.duration = 10;
        voiceObject.defaultText =defaultText;
        return voiceObject;
    }
}

  

 

posted on 2014-08-22 15:41  clarenceV1  阅读(4789)  评论(0编辑  收藏  举报

导航