1. 程式人生 > >android 開發 微博分享時遇到的坑

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>

然後你一除錯就發現微博回撥終於進去了,好開心,哈哈哈