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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.