android 開發 微博分享時遇到的坑
最近想專案中遇見了寫微博分享,就專門下了微博SDK去看,開始肯定是要先去微博開發平臺上申請開發者並註冊app,成功後會獲得App Key和App Secret,然後才可以進行下面的操作,但在寫的過程中發現微博的SDK還是有點坑的,這裡列舉出來,以便以後避開坑,踩坑是真難受啊,下面挨著講述一下。
1:微博分享將app註冊到微博的時候,sdk裡面會判斷你是否安裝微博,沒有了的話提示你安裝,但是他是在onCreate方法裡面寫的,而你在專案中要是寫到onCreate方法的話,那麼每次進入這個activity中就會提示使用者安裝微博,寫到分享微博的點選事件裡面就好了,程式碼在下面。
iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(ProductActivity.this, Constant.APP_KEY_WEIBO);//這裡輸入App Key iWeiboShareAPI.registerApp();//將應用註冊到微部落格戶端
2:分享時要上傳圖片官方給的程式碼如下
private ImageObject getImageObj() {
ImageObject imageObject = new ImageObject();
BitmapDrawable bitmapDrawable = (BitmapDrawable) mImageView.getDrawable();
imageObject.setImageObject(bitmapDrawable.getBitmap());
return imageObject;
}
而我們其實是要放入一個網路得到l的圖片的,所以我們要將得到的url轉化為bitmap在放進去就好了,而這個轉換查了好久,終於找到了一個比較好的方法,首先是要用非同步的,將圖片的url以流的方式轉換為bitmap,直接上轉換的程式碼
//點選微博開啟非同步獲得bitmap圖片
String url = product.getSpuDetail().getImageUrlList().get(0);
new GetBitMapAsyncTask().execute(url);
然後寫一個內部AsyncTask類
private class GetBitMapAsyncTask extends AsyncTask {//泛型的三個引數,第一個是網路請求需要的引數,第二個是進度,第三個是result //執行任務前的操作 @Override protected void onPreExecute() { super.onPreExecute(); } //內部執行後臺任務,不可在此方法內修改UI @Override protected Bitmap doInBackground(String... strings) { Log.e(TAG, "doInBackground(Params... params) called"); return getHttpBitmap(strings[0]);//這裡的strings是陣列,長度為一所以用下表0,意思就是支援多執行緒的,引數不止一個 } //用於更新進度資訊 @Override protected void onProgressUpdate(Integer... values) { Log.e(TAG, "onProgressUpdate(Progress... progresses) called"); } //用於在執行完後臺任務後更新UI,顯示結果 @Override protected void onPostExecute(Bitmap bitmap) { Log.e(TAG, "onPostExecute(Result result) called"); sendMultiMessageToWeibo(true, true, true, bitmap);//這個是傳送微博的方法,就是跟sdk上的一癢 } //取消的操作(不帶結果) @Override protected void onCancelled() { super.onCancelled(); } //取消的操作(帶結果的,也就是所謂的返回值) @Override protected void onCancelled(Bitmap bitmap) { super.onCancelled(bitmap); } }
將url轉為bitmap的方法,試了各種都沒成功,也就沒試BitmapFactory.decodeStream這個方法,然後就是用這個方法的,我也是醉了,哈哈
/**
* 將網路圖片轉換為Bitmap
*
* @param url
* @return
*/
public Bitmap getHttpBitmap(String url) {
Bitmap bitmap = null;
try {
URL pictureUrl = new URL(url);
InputStream in = pictureUrl.openStream();
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
微博分享的方法
/**
* 傳送多種訊息到微博
*
* @param hasText:是否有文字
* @param hasImage:是否有圖片
*/
private void sendMultiMessageToWeibo(boolean hasText, boolean hasImage, boolean hasWebpage, Bitmap wbShareBitmap) {
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();//初始化微博的分享訊息
//文字
if (hasText) {
weiboMessage.textObject = getTextObj();
}
//圖片
if (hasImage) {
weiboMessage.imageObject = getImageObj(compressImage(wbShareBitmap));
}
//網頁
if (hasWebpage) {
weiboMessage.mediaObject = getWebpageObj();
}
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
iWeiboShareAPI.sendRequest(request);//傳送請求訊息到微博,喚起微博分享介面
}
下面這是分享各種型別的方法
/**
* 獲取文字資訊物件
*
* @return TextObject
*/
private TextObject getTextObj() {
TextObject textObject = new TextObject();
textObject.text = "我在萌趣裡發現了的一個不錯的商品,趕快來看看把。";//這裡輸入文字
return textObject;
}
/**
* 建立圖片訊息物件。
*
* @return 圖片訊息物件。
*/
private ImageObject getImageObj(Bitmap bitmap) {
ImageObject imageObject = new ImageObject();
imageObject.setImageObject(bitmap);
return imageObject;
}
/**
* 建立網頁物件
*
* @return
*/
private BaseMediaObject getWebpageObj() {//這個方法裡面一個引數都不能少,開始以為描述和設定圖片引數是沒用的,其實它是當你沒網時或失敗時用的
WebpageObject mediaObject = new WebpageObject();
mediaObject.identify = Utility.generateGUID();
mediaObject.title = product.getSpuDetail().getName() + product.getSpuDetail().getBriefDescription();
mediaObject.description = "萌趣用著真的是好啊!";
mediaObject.setThumbImage(BitmapFactory.decodeResource(getResources(), R.mipmap.icon));
mediaObject.actionUrl = Constant.USUAL_ISSUE_URL;
return mediaObject;
}
3:然後一個問題就是微博回撥的坑了,當時試了好久,總算找到問題了,然後得到回調了。首先我們要知道,QQ,微信,微博,他們三個的分享是有區別的,QQ在manifest裡面有2個activity,他們都是整合好的類
微信的類是自己寫的,但是它也是sdk整合好的,也就是說在manifest裡面要有註冊的對應activity,而可以發現微博是沒有的
所以微博就和他們有點不一樣的了,微博實現回撥如下
第一;肯定是要註冊自己的app
//微博sdk
iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(ProductActivity.this, Constant.APP_KEY_WEIBO);//這裡輸入App Key
iWeiboShareAPI.registerApp();//將應用註冊到微部落格戶端
//判斷使用者是否安裝微博,記得要放在需要判斷的地方,比如點選微博的時候才判斷
if (!iWeiboShareAPI.isWeiboAppInstalled()) {
iWeiboShareAPI.registerWeiboDownloadListener(new IWeiboDownloadListener() {
@Override
public void onCancel() {
Toast.makeText(ProductActivity.this, "取消下載", Toast.LENGTH_SHORT).show();
}
});
}
第二:實現回撥,下面是sdk裡面的方法,介紹的很清楚,剛開始我以為這個方法是沒用的,一直都是把他註釋掉的狀態,今天才發現接收回調是先進入這個方法,然後在進入
onResponse回撥的方法
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 從當前應用喚起微博並進行分享後,返回到當前應用時,需要在此處呼叫該函式
// 來接收微部落格戶端返回的資料;執行成功,返回 true,並呼叫
// {@link IWeiboHandler.Response#onResponse};失敗返回 false,不呼叫上述回撥
iWeiboShareAPI.handleWeiboResponse(intent, this);
}
onResponse回撥的方法如下,他實現的介面是IWeiboHandler.Response
/**
* 微博分享回撥
*/
@Override
public void onResponse(BaseResponse baseResponse) {
switch (baseResponse.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: " + baseResponse.errMsg, Toast.LENGTH_LONG).show();
break;
}
}
第三:也是我萬萬沒想到的一個地方,也是個微信 QQ最大的區別,我們要在用到微博分享的activity在mainfest裡新增intent-filter,也就是下面的程式碼,具體為什麼呢,我想應該是微博的sdk不知道要回調到哪個activity,你看微信和QQ在manifest裡面都頭sdk繼整合好的activity,所以微博就要自己去寫了,用intent-filter去告訴微博你給我回調到這個activity裡面,裡面的action也是隱式跳轉,而category也是預設,說了這麼多,看程式碼
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
然後你一除錯就發現微博回撥終於進去了,好開心,哈哈哈