V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kingiis
V2EX  ›  Android

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

  •  
  •   kingiis · 2019-04-19 08:42:15 +08:00 · 11372 次点击
    这是一个创建于 2043 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    
    12 条回复    2019-04-19 22:54:17 +08:00
    kingiis
        1
    kingiis  
    OP
       2019-04-19 08:44:34 +08:00
    低版本太诡异 自己 sdk 都不支持 我们注释掉 它自动更新华为 hms 服务的部分 同样在低版本上放弃了这个功能
    qwwuyu
        2
    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
        3
    kingiis  
    OP
       2019-04-19 09:35:51 +08:00
    @qwwuyu
    app 流水太大 用户太多 对于华为推送这种集成方式的不敢大改,期待官方修改。
    我这边需要透传的,要拉起 app
    集成的 HMS_SDK_2.6.1.301.jar ,旧版推送的 sdk 都下架了找不到.
    qwwuyu
        4
    qwwuyu  
       2019-04-19 09:52:08 +08:00
    @kingiis 我也是 2.6.1.301 ,最近才开始相关开发,透传是指应用存活才可以收到的消息,不影响系统通知点击拉活推送。像 oppo xiaomi 都没有 res,hw 还有更新。。
    kingiis
        5
    kingiis  
    OP
       2019-04-19 10:02:32 +08:00
    @qwwuyu 开通自启动权限,透传可以直接拉活
    qwwuyu
        6
    qwwuyu  
       2019-04-19 10:24:46 +08:00
    @kingiis 这样啊..但是还是不明白你们流程,服务器不知道用户开启自启动权限,需要发送系统级推送,让用户点击通知拉起应用吧.溜了溜了,工作去了.
    xuhaoyangx
        7
    xuhaoyangx  
       2019-04-19 11:38:20 +08:00
    你们透传 是引导用户开启自启动?
    honeycomb
        8
    honeycomb  
       2019-04-19 11:49:10 +08:00 via Android
    @xuhaoyangx 你看是不是很没办法,连搞个推送都是为了保活
    xuhaoyangx
        9
    xuhaoyangx  
       2019-04-19 11:51:33 +08:00
    @honeycomb #8 我司要求,消息到达即可
    kingiis
        10
    kingiis  
    OP
       2019-04-19 22:49:12 +08:00
    @xuhaoyangx 对的
    如果后台透传失败会执行通知
    再不济进程内我们自己有移动端自发轮询推送
    kingiis
        11
    kingiis  
    OP
       2019-04-19 22:52:05 +08:00
    @honeycomb 保活是不可能保活的,只有发发推送,抱抱厂商大腿才能维持生存的,这个样子
    xuhaoyangx
        12
    xuhaoyangx  
       2019-04-19 22:54:17 +08:00
    @kingiis #10 我司是想自己保持长连接,没了,就走远推,有厂商的推的,走厂商推
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.