微博分享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一样正常引入:如图:
微博分享sdk4.0 中遇到的坑以及解决办法汇总_第1张图片
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.分享完成后屏幕出现很多可选项
在项目中将这句话注释掉:

你可能感兴趣的:(第三方集成)