一个纠结的bug以及微信、微博、QQ分享

       眼看着十月份即将进入尾声,这个困扰大半个月的东西终于出了一个低配版。说起来这个bug也是一般没有人回去关注的,国庆过完回到公司过几天,老大的老大突然说有个bug,让我快点优化一下,我看了一下,原来是手机在打开gps的时候手机会一直在后台跑(一直在后台占用cpu,事实不止这个),我重现之后赶紧各种调试各种log,过流程找可能出现的地方。后来发现是在app打开的时候有个定时器会刷新首页数据,然后在app进入后台的时候忘记关了,赶紧优化完成之后让他测试一下,等他开完会回来,正是我噩梦开始的地方。。

       由于就我一个android,走了很多弯路(没人带加自学的朋友应该能够懂)。话说回来,那个bug就是app进入后台的时候过一些时间会在后台一直占用cpu(某些机型)导致耗电增加,boss发话了,这个必须得解决。说实话我当时是有点懵逼的,怎么办,硬着头皮搞呗,经过了一个礼拜的排查(你没看错,真的是一个礼拜早9晚10加周末在家研究),后面在一些朋友的帮助下(最终是通过ddms)终于找到了那个问题,原因竟然某个第三方的sdk,会在后台开启线程搜集用户数据(我问了客服,他们承认了,说会自动关闭,可能某些机型或者系统没有做相应的优化),好吧,我认了,只能自己来封装了。

       至于前面的是在应用商店注册什么的百度一大把我也就不说了,我就说下遇到的坑和一些注意事项吧,先说微信,微信分享还是挺顺利的,根据官方文档和搜索基本上没有遇到什么问题,有一个回调的问题到时候一起说下。

       刚开始做QQ分享我还在吐槽为什么不和微信那样在xml里面注册回调,后面才发现QQ这样做确实要方便一些。直接在需要分享的地方拿到QQ分享的实例(QQ分享竟然不用自己压缩图片),我贴一点代码吧。

public class QQShareListener implements IUiListener {
    private Context mContext;
    public QQShareListener(Context context){
        mContext=context;
    }

    @Override
        public void onComplete(Object o) {
            Tip.show(mContext, "分享成功");
        }

        @Override
        public void onError(UiError e) {
            Tip.show(mContext, "分享失败");
        }

        @Override
        public void onCancel() {
            Tip.show(mContext, "分享取消");
    }

}
直接定义一个公共类来接收回调即可,如果多个activity去调同一个的话,可以在activity中实例化,然后传到分享那里。就是这么简单粗暴,当然,别忘记在调用的activity那边在onActivityResult中进行声明回调。

Tencent.onActivityResultData(requestCode, resultCode, data, myListener);
if (requestCode == Constants.REQUEST_API) {
    if (resultCode == Constants.REQUEST_QQ_SHARE ||
            resultCode == Constants.REQUEST_QZONE_SHARE ||
            resultCode == Constants.REQUEST_OLD_SHARE) {
        Tencent.handleResultData(data, myListener);
    }
    return;
}
当然这里有些注意事项我在结尾一一道来。

微博这边的话需要在xml注册的类里面进行一些声明。

 mAuthInfo = new AuthInfo(this, Constant.WB_APPID,
                Constant.WB_REDIRECT_URL, Constant.WB_SCOPE);
        mSsoHandler = new SsoHandler(this, mAuthInfo);
        // SSO 授权
        mSsoHandler.authorize(new AuthListener());

        // 创建微博 SDK 接口实例
        mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this,
                Constant.WB_APPID);
//
//        // 注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
//        // 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
//        // NOTE:请务必提前注册,即界面初始化的时候或是应用程序初始化时,进行注册
        mWeiboShareAPI.registerApp();
//
//        //  Activity 被重新初始化时(该 Activity 处于后台时,可能会由于内存不足被杀掉了),
//        // 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
//        // 执行成功,返回 true,并调用 {@link IWeiboHandler.Response#onResponse}//        // 失败返回 false,不调用上述回调
        mWeiboShareAPI.handleWeiboResponse(getIntent(), this);

如果在这里进行了registerApp()的话,在调用微博客户端的时候就可以不用这个了,注意,这种只能存在客户端的情况下才能正常使用,如需web分享可以直接去官网(我做的是需要客户端的)。

特别记得在xml声明的时候加上

android:launchMode="singleTask"
这样分享完成之后就能回到自己的app了。

再来聊下微信登录吧,微信登录这块得自己去调用官方的接口去获得授权和获取用户信息然后再进行操作。

String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
      + Constant.WX_PAY_APPID
      + "&secret="
      + Constant.WX_APP_SECRET
      + "&code="
      + code
      + "&grant_type=authorization_code";
通过这个链接拿到需要的

String openid = jsonObject.getString("openid").toString().trim();
String access_token = jsonObject.getString("access_token").toString().trim();
再根据这两个去调
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
      + accessToken + "&openid=" + openId;
拿到用户数据,调这个接口之前可以对拿到的token和openid进行校验,如没有过期则拿用户数据,否则重新授权。再拿用户数据。

最后来说下遇到的问题:

首先是回调的问题,因为QQ的回调是在activity里面的onResultActivity里面,这里可能还有其他的返回数据的处理,所以你得拿到返回数据进行判断,什么时候是QQ回调的, 什么时候是返回的,但是微信登录和分享回调的东西是一样的,在WXEntryActivity(类名一定要这个名字,WTF...),所以可以考虑在点击分享或者登录的时候做一些数据存储,然后回调的时候拿到进行判断(记得finish)。

第二个坑是图片大小问题(这个问题花费的时间巨大,原谅我没有经验。。~-~!!)。因为Android的机型简直海量,很多机型尼玛还有自己的更改( 原谅我的粗口),网上查资料和官网看到的缩略图是32K,分享的图是多少我忘了(...),图片如果过大的话点击分享就没有反应,刚开始的时候不知道压缩那块的具体意思,摸索了好久(慢慢尝试对大家好处挺大的),后面各种更改终于能够分享成功了,然后测试的时候就出幺蛾子了,某款乐视硬是分享不出来,后面查看压缩图片之前和之后的过程,这款手机压缩前的图会比其他手机的大很多(有知道的朋友麻烦告知下),后面只能加大压缩的次数,最后终于解决。贴一下压缩的代码:

private static byte[] bmpToByteArray(Bitmap bmp) {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try {
        int options = 100;
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, output);
        while (output.toByteArray().length/1024 > IMAGE_SIZE && options > 0) {
            output.reset(); //清空baos
            bmp.compress(Bitmap.CompressFormat.JPEG, options, output);//这里压缩options%,把压缩后的数据存放到baos             SwitchLogger.e("aaa","--"+output.toByteArray().length);
            options -= 5;
        }
        output.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return output.toByteArray();
}
这里大家就根据需求进行自己的更改吧。PS:记得对图片进行非空处理。

第三个坑:如果你分享完成之后停留在微博发生莫名其妙的事情,记得把微博分享回调的REDIRECT_URL和AppID写正确。

遇到bug还是需要自己静下心来去排查,很多时间都花在了没有意义的操作上面,有时候还把之前写好的给改坏了,还是太年轻啊,由于比较习惯去打印log来分析bug原因(如分享图片为null或者太大或者其他数据不正常),有些查找bug的方式还是需要去多学几个。花了一个礼拜去找问题,休息了三天(台风~~),用了三天半的时间终于把低配版的完成,这些天都忙得昏天暗地了,终于在昨晚12点的时候发布成功。(哈哈,放下了一块大石头...,但是今天一天都没有精神。。)

由于微博的回调提示这边还在研究中其他的功能和回调都已经正常,所以目前是低配版的,为高配版的继续搬砖~~。

---------翻过了一座山,嘿,又掉进了一个坑。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值