微博官方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;
}
}
