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
|  |      1kingiis OP 低版本太诡异 自己 sdk 都不支持 我们注释掉  它自动更新华为 hms 服务的部分 同样在低版本上放弃了这个功能 | 
|  |      2qwwuyu      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.最近尝试了一下,暂无问题,但还未全面测试... | 
|  |      3kingiis OP @qwwuyu  app 流水太大 用户太多 对于华为推送这种集成方式的不敢大改,期待官方修改。 我这边需要透传的,要拉起 app 集成的 HMS_SDK_2.6.1.301.jar ,旧版推送的 sdk 都下架了找不到. | 
|  |      4qwwuyu      2019-04-19 09:52:08 +08:00 @kingiis 我也是 2.6.1.301 ,最近才开始相关开发,透传是指应用存活才可以收到的消息,不影响系统通知点击拉活推送。像 oppo xiaomi 都没有 res,hw 还有更新。。 | 
|  |      6qwwuyu      2019-04-19 10:24:46 +08:00 @kingiis 这样啊..但是还是不明白你们流程,服务器不知道用户开启自启动权限,需要发送系统级推送,让用户点击通知拉起应用吧.溜了溜了,工作去了. | 
|  |      7xuhaoyangx      2019-04-19 11:38:20 +08:00 你们透传 是引导用户开启自启动? | 
|      8honeycomb      2019-04-19 11:49:10 +08:00 via Android @xuhaoyangx 你看是不是很没办法,连搞个推送都是为了保活 | 
|  |      9xuhaoyangx      2019-04-19 11:51:33 +08:00 @honeycomb #8 我司要求,消息到达即可 | 
|  |      10kingiis OP | 
|  |      12xuhaoyangx      2019-04-19 22:54:17 +08:00 @kingiis #10 我司是想自己保持长连接,没了,就走远推,有厂商的推的,走厂商推 |