新浪微博授权 分享
微博官方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.加入权限,与版本号
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) 编辑 收藏 举报