Android 华为移动推送 hms 服务低版本报错

2019-04-19 08:42:15 +08:00
 kingiis

ps:本篇只适合已集成完毕华为推送 sdk 的开发者,在兼容上遇到的问题。 关于集成华为 hms 服务移动推送时遇到的问题:

第三方:

华为移动 hms 服务-推送服务

需求:

提高推送覆盖率

处理方案:

透传 + 自启动

权限开放:

自启动 = on

根据官方文档集成后,在华为老机型上运行时出现了崩溃.

//HuaweiApiAvailability.getInstance().resolveError(this, rstCode, REQUEST_HMS_RESOLVE_ERROR);

/**

* 代理 Activity,用于弹出解决问题的引导

*/

public class HMSAgentActivityextends BaseAgentActivity {

...

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    ApiClientMgr.INST.onActivityLunched();

    Intent intent = getIntent();

      finish();

    if (intent !=null) {

int rstCode =  intent.getIntExtra(CONN_ERR_CODE_TAG, 0);

        HMSAgentLog.d("dispose code:" + rstCode);

//            HuaweiApiAvailability.getInstance().resolveError(this, rstCode,     //REQUEST_HMS_RESOLVE_ERROR);

    }else {

        HMSAgentLog.e("intent is null");

        finish();

    }

}

定位到这行代码,当时运行的设备时 cl-200 版本 5.1.1

如果只是兼容不报错,注释 onConnectionFailed 中的以下代码即可:


ApiClientMgr.java

/**

* 建立 client 到 service 的连接失败时调用

*

 * @param result 连接结果,用于解决错误和知道什么类型的错误

*/

@Override

public void onConnectionFailed(ConnectionResult result) {

timeoutHandler.removeMessages(APICLIENT_TIMEOUT_HANDLE_MSG);

    if (result ==null) {

HMSAgentLog.e("result is null");

        onConnectEnd(HMSAgent.AgentResultCode.RESULT_IS_NULL);

return;

    }

int errCode = result.getErrorCode();

    HMSAgentLog.d("errCode=" + errCode +" allowResolve=" +allowResolveConnectError);

    if(HuaweiApiAvailability.getInstance().isUserResolvableError(errCode) &&allowResolveConnectError) {

Activity activity = ActivityMgr.INST.getLastActivity();

        if (activity !=null) {

try {

// 

timeoutHandler.sendEmptyMessageDelayed(APICLIENT_STARTACTIVITY_TIMEOUT_HANDLE_MSG,

//APICLIENT_STARTACTIVITY_TIMEOUT);

//                    Intent intent = new Intent(activity, HMSAgentActivity.class);

//                    intent.putExtra(HMSAgentActivity.CONN_ERR_CODE_TAG, errCode);

//                    intent.putExtra(BaseAgentActivity.EXTRA_IS_FULLSCREEN, UIUtils.isActivityFullscreen(activity));

//                    activity.startActivity(intent);

                return;

            }catch (Exception e) {

HMSAgentLog.e("start HMSAgentActivity exception:" + e.getMessage());

                timeoutHandler.removeMessages(APICLIENT_STARTACTIVITY_TIMEOUT_HANDLE_MSG);

                onConnectEnd(HMSAgent.AgentResultCode.START_ACTIVITY_ERROR);

return;

            }

}else {

// 当前没有界面处理不了错误

            HMSAgentLog.d("no activity");

            onConnectEnd(HMSAgent.AgentResultCode.NO_ACTIVITY_FOR_USE);

return;

        }

}else {

//其他错误码直接透传

    }

onConnectEnd(errCode);

}


到此兼容完毕。

希望这篇文章对大家有帮助,另外:

拒绝 996
7449 次点击
所在节点    Android
12 条回复
kingiis
2019-04-19 08:44:34 +08:00
低版本太诡异 自己 sdk 都不支持 我们注释掉 它自动更新华为 hms 服务的部分 同样在低版本上放弃了这个功能
qwwuyu
2019-04-19 09:19:20 +08:00
我这边是把 ActivityMgr 相关的都注释掉,一个是 HMSAgentActivity 处理连接错误,一个是 base.aar 里面的连接成功请求公告会使用到 topActivity(HuaweiApiClientImpl 类里 onConnectionResult 调用了 showNotice)。
可以尝试使用源码,删除 base.arr 的 res、com.huawei.hms.update 包相关、hmsrootcas.bks 、UpdateSdk_release_V2.0.3.300.jar ,这样清单只需要保留 HuaweiPushRevicer 和 meta-data。
如果不需要使用透传消息通知,可以尝试删除 com.huawei.hms.support.api.push.pushselfshow 包相关和 res,这样可以尝试只打出一个 jar 包,而不是 2 个 aar 和 2 个 jar.最近尝试了一下,暂无问题,但还未全面测试...
kingiis
2019-04-19 09:35:51 +08:00
@qwwuyu
app 流水太大 用户太多 对于华为推送这种集成方式的不敢大改,期待官方修改。
我这边需要透传的,要拉起 app
集成的 HMS_SDK_2.6.1.301.jar ,旧版推送的 sdk 都下架了找不到.
qwwuyu
2019-04-19 09:52:08 +08:00
@kingiis 我也是 2.6.1.301 ,最近才开始相关开发,透传是指应用存活才可以收到的消息,不影响系统通知点击拉活推送。像 oppo xiaomi 都没有 res,hw 还有更新。。
kingiis
2019-04-19 10:02:32 +08:00
@qwwuyu 开通自启动权限,透传可以直接拉活
qwwuyu
2019-04-19 10:24:46 +08:00
@kingiis 这样啊..但是还是不明白你们流程,服务器不知道用户开启自启动权限,需要发送系统级推送,让用户点击通知拉起应用吧.溜了溜了,工作去了.
xuhaoyangx
2019-04-19 11:38:20 +08:00
你们透传 是引导用户开启自启动?
honeycomb
2019-04-19 11:49:10 +08:00
@xuhaoyangx 你看是不是很没办法,连搞个推送都是为了保活
xuhaoyangx
2019-04-19 11:51:33 +08:00
@honeycomb #8 我司要求,消息到达即可
kingiis
2019-04-19 22:49:12 +08:00
@xuhaoyangx 对的
如果后台透传失败会执行通知
再不济进程内我们自己有移动端自发轮询推送
kingiis
2019-04-19 22:52:05 +08:00
@honeycomb 保活是不可能保活的,只有发发推送,抱抱厂商大腿才能维持生存的,这个样子
xuhaoyangx
2019-04-19 22:54:17 +08:00
@kingiis #10 我司是想自己保持长连接,没了,就走远推,有厂商的推的,走厂商推

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX