1. 程式人生 > >微博分享sdk4.0 中遇到的坑以及解決辦法彙總

微博分享sdk4.0 中遇到的坑以及解決辦法彙總

最近剛轉正,公司真的很忙,上一個月加班成常態,關鍵還是12點以後,打破我工作以來加班最晚記錄:凌晨2點。當然越忙對於我們來說也是有益處的,可以多學到很多東西。
公司專案用的微博的sdk 還是挺老的,大家都知道,早版本的微博sdk 存在一個問題就是使用了隱式的intent,而這個在android 5.0級更高版本的時候被谷歌認為是不安全的,所以很多手機無法使用web端的分享和登入。所以這個任務就交給我我了。
那麼接下來當然是使用微博當前最新的sdk 了,查了下是4.0,並且在github上有,地址https://github.com/sinaweibosdk/weibo_android_sdk。其中文件說明的很詳細,所以接入起來是很方便的。其中最大的特點就是此次提供的sdk是以aar的形式,aar我們都知道當前安卓最流行的方式了,主要優勢還是可以加入自己的佈局頁面,這個優勢挺大的。
針對以下出現的問題都已成功解決,噴一下新浪,對這些問題的冷漠,很多問題都不解決。
其中關鍵的幾點問題如下:
1.在安裝客戶端的情況下分享或者授權後,解除安裝微部落格戶端,再次分享或者授權,不會調起web端。這個問題的原因是微博分享的輔助類WbAppInfo是一個單列,而我們在發起shareMessage分享的時候會判斷客戶端是否安裝,程式碼如下:

 private boolean isWbAppInstalled() {
        WbAppInfo wbAppInfo = WeiboAppManager.getInstance(this.context).getWbAppInfo();
        return wbAppInfo != null && wbAppInfo.isLegal();
    }

其中wbAppInfo單列在第一次呼叫的時候已經初始化,並且儲存了客戶端存在的資訊,所以之後再次進行判斷的時候便預設是存在客戶端的。既然知道原因那麼解決辦法當然就是每次呼叫之前先充值這個wbAppInfo。值,這裡我是通過反射來充值的,如下:

//通過反射重置WeiboAppManager中wbAppInfo的值,因為這個單列模式會導致微部落格戶端解除安裝後單列中仍顯示客戶端已安裝導致分享失敗
        Field field = null;
        try {
            field =WeiboAppManager.class.getDeclaredField("wbAppInfo");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        field.setAccessible(true
); try { field.set(WeiboAppManager.getInstance(mActivity),null);//重置為null } catch (IllegalAccessException e) { e.printStackTrace(); }

2.在arm64的手機上出現崩潰。
因為微博的aar預設沒有吧64為平臺的動態連結庫放入,不知道為什麼要這麼做,當然他們是提供了其他平臺的so的,我們只需要手動新增到自己的專案的主工程的lib和其他so一樣正常引入:如圖:
這裡寫圖片描述
so的地址:https://github.com/sinaweibosdk/weibo_android_sdk/tree/master/so
3.分享所在的頁面容易出現崩潰
因為最新的sdk的分享是通過跳轉頁面來實現的,而且微博的回撥也是通過回跳我們的頁面(這一點很蛋疼,覺得完全沒必要,不知道為什麼一定要這麼實現,本人覺得onActivityForRseult比這個好),所以回撥是這樣處理的:

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //微博分享回撥
        WbShareHandler shareHandler=SinaWeibo.getShareHandler();
        if(shareHandler !=null && iShare!=null){
            shareHandler.doResultIntent(intent,(SinaWeibo)iShare);
        }
    }

所以當我們的activity 存在容易被銷燬或者回收的風險或者覆蓋的時候通過startActivity方式回撥會生成一個新的activity例項,如果我們在activity啟動中需要某些引數,此時很容易因為空指標而造成的崩潰。那解決辦法呢?本人根據實際情況分成兩種
①:簡單粗暴,將當前activity的launch_moudle宣告為SingleTask,這樣只會有一個我們的activity例項。
但是如果我們這個activity由於特殊原因不能宣告成singletask怎麼辦呢。看方法二。
②:生成一箇中間的代理activity 這個activity 負責分享和接受回撥,這個activity是一個透明的activity ,然後這個activity 宣告成SingleTask ,然後我們的activity 回撥通過此Activity回撥,當然回撥方式我們可以自定義。
4.分享完成後螢幕出現很多可選項
在專案中將這句話註釋掉: