新浪微博授权 分享
微博官方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 阅读(4831) 评论(0) 收藏 举报
浙公网安备 33010602011771号