关闭

(4.2.12.1)浅谈第三方推送[快速集成]:百度推送、小米推送、华为推送、魅族推送

5219人阅读 评论(0) 收藏 举报
分类:

在上一章节,我们了解了推送的基本概念,在本章节,我们开始使用百度推送、小米推送、华为推送

录入时版本号:

第三方推送的官方网址

集成第三方推送的一般过程

再此之前,我们假设你已经注册了对应平台的对应账户,并且创建了对应的应用,获取到了对应AppID,Appkey,ApppSecretKey

1-环境配置

1.1-SDK引入[jar、.so、资源文件等]

 dependencies {
        compile 'com.meizu.flyme.internet:push-internal-publish:3.2.*'
    }

1.2-AndroidManifest.xml配置

一般需要注册:

1.2.1-配置信息

  • 百度-配置信息
<!-- 在百度开发者中心查询应用的API Key -->
<meta-data android:name="api_key" android:value="vbhptIZZOetZTtPaEKM1a4LK" />
  • 小米-配置信息
  • 华为-配置信息

1.2.2-相关官方的Service

  • 百度-相关官方的Service
  <!-- 百度 push service start -->
        <meta-data
                android:name="api_key"
                android:value="MUBmEOuW29Kajfy7tVzDG2D7" />
        <!-- 用于接收系统消息以保证PushService正常运行 -->
        <!--4.3.0 版本的 AndroidManifest.xml 中 PushServiceReceiver 中增加四个可选 Action-->
        <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
                  android:process=":bdservice_v1" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
                <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
                <action android:name="android.intent.action.MEDIA_MOUNTED" />
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
        <!-- Push服务接收客户端发送的各种请求-->
        <receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"
                  android:process=":bdservice_v1" >
            <intent-filter>
                <action android:name="com.baidu.android.pushservice.action.METHOD" />
                <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <!--4.0.0 版本的 AndroidManifest.xml 中 PushService 声明新增一个 intent-filter-->
        <service android:name="com.baidu.android.pushservice.PushService" android:exported="true"
                 android:process=":bdservice_v1" >
            <intent-filter >
                <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
            </intent-filter>
        </service>
        <!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->
        <service android:name="com.baidu.android.pushservice.CommandService"
                 android:exported="true" />
        <!--5.1.0 版本的 AndroidManifest.xml 中增加了一个 ContentProvider 声明-->
        <!--5.2.0 版本的 AndroidManifest.xml 中 PushInfoProvider 新增权限级别-->
        <provider
                android:name="com.baidu.android.pushservice.PushInfoProvider"
                android:authorities="test.com.yu.bdpush"
                android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.test.com.yu"
                android:protectionLevel = "signature"
                android:exported="true" />
        <!--百度 push结束 -->
  • 小米-相关官方的Service

        <!-- 小米通道官方配置 -->
        <service
                android:name="com.xiaomi.push.service.XMJobService"
                android:enabled="true"
                android:exported="false"
                android:permission="android.permission.BIND_JOB_SERVICE"
                android:process=":pushservice" />-
        <service android:name="com.xiaomi.push.service.XMPushService" android:enabled="true"
                 android:process=":pushservice"/>
        <!--注:此service必须在3.0.1版本以后(包括3.0.1版本)加入-->
        <service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true"
                 android:exported="true"/>
        <!--注:此service必须在2.2.5版本以后(包括2.2.5版本)加入-->
        <service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService"/>
        <receiver
                android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
                android:exported="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
                  android:exported="true" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.xiaomi.push.service.receivers.PingReceiver"
                  android:exported="false"
                  android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.xiaomi.push.PING_TIMER" />
            </intent-filter>
        </receiver>
  • 华为-相关官方的Service
        <!-- &lt;!&ndash; 华为通道官方配置 &ndash;&gt; -->
        <!-- 备注:Push相关的android组件需要添加到业务的AndroidManifest.xml,
                 Push相关android组件运行在另外一个进程是为了防止Push服务异常而影响主业务 -->
        <!-- PushSDK:PushSDK接收外部请求事件入口 -->
        <service
                android:name="com.huawei.android.pushagent.PushService"
                android:process=":pushservice" >
        </service>
        <receiver
                android:name="com.huawei.android.pushagent.PushEventReceiver"
                android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.REFRESH_PUSH_CHANNEL" />
                <action android:name="com.huawei.intent.action.PUSH" />
                <action android:name="com.huawei.intent.action.PUSH_ON" />
                <action android:name="com.huawei.android.push.PLUGIN" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <receiver
                android:name="com.huawei.android.pushagent.PushBootReceiver"
                android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.REGISTER" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <meta-data
                    android:name="CS_cloud_version"
                    android:value="\u0032\u0037\u0030\u0035" />
        </receiver>
        <!-- PushSDK:富媒体呈现页面,用于呈现服务器下发的富媒体消息 -->
        <!-- locale|layoutDirection 切换语言后不重新创建activity -->
        <!--<activity
                android:name="com.huawei.android.pushselfshow.richpush.RichPushActivity"
                android:process=":pushservice"
                android:theme="@style/hwpush_NoActionBar"
                android:configChanges="orientation|screenSize|locale|layoutDirection"
                android:screenOrientation="portrait">
          <meta-data android:name="hwc-theme"
                     android:value="androidhwext:style/Theme.Emui"/>
          <intent-filter>
            <action android:name="com.huawei.android.push.intent.RICHPUSH" />

            <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
        </activity>-->

1.2.3-自定义的receiver

  • 百度-自定义的receiver
        <!-- push应用定义消息receiver声明 -->
        <receiver android:name="com.baidu.push.example.MyPushMessageReceiver">
            <intent-filter>
                <!-- 接收push消息 -->
                <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                <!-- 接收bind,unbind,fetch,delete等反馈消息 -->
                <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
                <!-- 接收通知点击事件,和通知自定义内容 -->
                <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
            </intent-filter>
        </receiver>
  • 小米-自定义的receiver
        <receiver
                android:name="test.com.yu.DemoMessageReceiver"
                android:exported="true" >
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.ERROR" />
            </intent-filter>
        </receiver>
  • 华为-自定义的receiver
        <!-- 第三方相关 :接收Push消息(注册、Push消息、Push连接状态、标签,LBS上报结果)广播 -->
        <receiver android:name="com.huawei.pushtest.receiver.MyReceiver" >
            <intent-filter>
                <!-- 必须,用于接收token-->
                <action android:name="com.huawei.android.push.intent.REGISTRATION" />
                <!-- 必须,用于接收消息-->
                <action android:name="com.huawei.android.push.intent.RECEIVE" />
                <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调-->
                <action android:name="com.huawei.android.push.intent.CLICK" />
                <!-- 可选,查看push通道是否连接,不查看则不需要-->
                <action android:name="com.huawei.intent.action.PUSH_STATE" />
                <!-- 可选,标签、地理位置上报回应,不上报则不需要 -->
                <action android:name="com.huawei.android.push.plugin.RESPONSE" />
            </intent-filter>
            <meta-data android:name="CS_cloud_ablitity" android:value="@string/hwpush_ability_value"/>
        </receiver>
  • 魅族-自定义的receiver
    <!-- push应用定义消息receiver声明 -->
    <receiver android:name="包名.MyPushMsgReceiver">
        <intent-filter>
            <!-- 接收push消息 -->
            <action android:name="com.meizu.flyme.push.intent.MESSAGE" />
            <!-- 接收register消息 -->
            <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
            <!-- 接收unregister消息-->
            <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK"/>
            <!-- 兼容低版本Flyme3推送服务配置 -->
            <action android:name="com.meizu.c2dm.intent.REGISTRATION" />
            <action android:name="com.meizu.c2dm.intent.RECEIVE" />
            <category android:name="包名"></category>
        </intent-filter>
    </receiver>

1.2.5-相关权限信息

  • 公共
<!-- Android 6.0版本可去除,用于选举信息(通道复用)的同步 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!-- 进行网络访问和网络状态监控相关的权限声明 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 允许对sd卡进行读写操作 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 网络库使用,当网络操作时需要确保事务完成不被杀掉 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!-- 用于读取手机硬件信息等,用于机型过滤 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 选举使用,当应用有删除或者更新时需要重新选举,复用推送通道 -->
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <!-- 补偿通道小米PUSH使用,不用可去除 -->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <!-- 补偿通道GCM使用,不使用可去除 -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <!-- 允许监听启动完成事件 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- 允许访问震动器 -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!--允许程序禁用键盘锁-->
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <!--允许一个程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序-->
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
  • 百度-相关权限信息
    <!--百度 推送权限  start-->
    <!--5.1.0 版本的 AndroidManifest.xml 中 声明了写权限-->
    <!-- 适配Android N系统必需的ContentProvider写权限声明,写权限包含应用包名-->
    <uses-permission android:name="baidu.push.permission. WRITE_PUSHINFOPROVIDER.test.com.yu " />
    <permission
            android:name="baidu.push.permission. WRITE_PUSHINFOPROVIDER.test.com.yu"
            android:protectionLevel="normal">
    </permission>
    <!--百度 推送权限  end-->
  • 小米-相关权限信息
    <!--小米 推送权限  start-->
    <!-- the following 2 com.xiaomi.mipushdemo should be changed to your package name -->
    <permission
            android:name="test.com.yu.permission.MIPUSH_RECEIVE"
            android:protectionLevel="signature" />
    <uses-permission android:name="test.com.yu.permission.MIPUSH_RECEIVE" />
    <!--小米 推送权限  end-->
  • 华为-相关权限信息
    <!-- 访问Push APK provider需要的权限,SDK富媒体需要,无富媒体功能则不需要 -->  
    <uses-permission android:name="com.huawei.pushagent.permission.RICHMEDIA_PROVIDER"/>
  • 魅族-相关信息
<!-- 兼容flyme5.0以下版本,魅族内部集成pushSDK必填,不然无法收到消息-->
    <uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE"></uses-permission>
    <permission android:name="包名.push.permission.MESSAGE" android:protectionLevel="signature"/>
    <uses-permission android:name="包名.push.permission.MESSAGE"></uses-permission>

    <!--  兼容flyme3.0配置权限-->
    <uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
    <permission android:name="你的包名.permission.C2D_MESSAGE"
                    android:protectionLevel="signature"></permission>
    <uses-permission android:name="你的包名.permission.C2D_MESSAGE"/>

1.2.6-其他信息:如富媒体等

  • 百度-其他信息:如富媒体等
        <!-- push富媒体,不使用富媒体推送不需要 -->
        <activity
            android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
            android:configChanges="orientation|keyboardHidden"
            android:label="MediaViewActivity" >
        </activity>
        <activity
            android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
            android:configChanges="orientation|keyboardHidden"
            android:label="MediaListActivity"
            android:launchMode="singleTask" >
        </activity>
        <!-- push富媒体结束 -->
  • 小米-其他信息:如富媒体等
  • 华为-其他信息:如富媒体等
        <!-- PushSDK:富媒体呈现页面,用于呈现服务器下发的富媒体消息 -->
        <!-- locale|layoutDirection 切换语言后不重新创建activity -->
        <activity
            android:name="com.huawei.android.pushselfshow.richpush.RichPushActivity"
            android:process=":pushservice"  
            android:theme="@style/hwpush_NoActionBar"
            android:configChanges="orientation|screenSize|locale|layoutDirection"
            android:screenOrientation="portrait">
            <meta-data android:name="hwc-theme" 
                       android:value="androidhwext:style/Theme.Emui"/>
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.RICHPUSH" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <activity
            android:name="com.huawei.android.pushselfshow.permission.RequestPermissionsActivity"
            android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:configChanges="orientation|screenSize|locale|layoutDirection"
            android:exported="false">
        </activity>

2-在入口处调用SDK的管理类开启服务

  • 百度
    在当前工程的主Activity的onCreate函数中,其中的“API Key“需要手动修改为指定应用的API Key。添加以下代码:
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY,"api_key")
  • 小米
    为了提高push的注册率,你可以在Application的onCreate中初始化push。你也可以根据需要,在其他地方初始化push。
    通过调用MiPushClient.registerPush来初始化小米推送服务。注册成功后,您可以在自定义的onCommandResult和onReceiveRegisterResult中收到注册结果,其中的regId即是当前设备上当前app的唯一标示。您可以将regId上传到自己的服务器,方便向其发消息。
   MiPushClient.registerPush(this, APP_ID, APP_KEY);
  • 华为
    在当前工程的主Activity的onCreate函数中
 // 获取客户端AccessToken,获取之前请先确定该应用(包名)已经在开发者联盟上创建成功,并申请、审核通过Push权益
                    PushManager.requestToken(PustDemoActivity.this);

3-继承SDK的Receiver,实现相关方法并注册该Receiver

该部分详见下一章节内容

4-需要的话,在代码中调用管理类,进行设置标签等操作

该部分详见下一章节内容

5-混淆的保持处理

  • 百度
如果需要混淆app,请在混淆文件(一般默认为Android工程下proguard-project.txt或者proguard.cfg)中添加以下说明(pushservice-VERSION.jar为集成的jar包名字,VERSION为版本名称),防止SDK内容被二次混淆,无法收到消息。

     -libraryjars libs/pushservice-VERSION.jar
     -dontwarn com.baidu.**
     -keep class com.baidu.**{*; }
  • 小米
如果你的应用使用了混淆,你需要keep自定义的BroadcastReceiver。
自定义的BroadcastReceiver继承PushMessageReceiver,使用下面的代码是不行的。
-keep public class * extends android.content.BroadcastReceiver

你需要使用下面的代码keep自定义的BroadcastReceiver。
#这里com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定义的完整类名
-keep class com.xiaomi.mipush.sdk.DemoMessageReceiver {*;}
  • 华为
开发者编译APK时请不要混淆本SDK,避免功能异常。 在配置文件中加入:
-keep class com.huawei.android.pushagent.**{*;}
-keep class com.huawei.android. pushselfshow.**{*;}
-keep class com.huawei.android. microkernel.**{*;}
-keep class com.baidu.mapapi.**{*;}
仅供参考。
  • 魅族
混淆 Meizu插件以前是将proguard文件独立发布,因此proguard文件需要独立配置,现在我们已经将proguard打包进了aar中,具体详见consumerProguardFiles,因此就不再需要单独配置proguard远程依赖了

6-注意事项

华为HMS集成

  • PUSH服务 与 华为移动服务(HMS)

    • PUSH服务 仅是提供推送服务,所以一般推送使用这种。如果华为手机没有打开 应用自启动 也可以使用这种推送
    • HMS 中不仅集成了推送,还包括支付等服务开发者需要在华为开发者门户为应用开通HMS调用权限,并集成HMS SDK,该SDK通过用户手机上的“华为移动服务”(一个独立应用)完成对华为云端能力的调用,调用过程中“华为移动服务”会对调用者进行签权
    • PUSH服务 与 HMS 在华为手机上相比,前者的通用性更强些。目前在几台华为手机上测试发现, PUSH服务 都能注册成功,而 HMS 在有些手机上不能注册成功,需要打开应用的 应用自启动 开关,甚至有的手机上根本注册不成功,不管怎么折腾
  • 使用HMS推送定义了EMUI的样式导致TimePicker初始化失败

官方DEMO有这句话

<application>
    <meta-data android:name="hwc-theme"
            android:value="androidhwext:style/Theme.Emui.NoActionBar" />
</application>

使用了华为HMS SDK中的推送功能,然后插件布局文件中的TimePicker初始化时,会报如下错误:

android.view.InflateException: Binary XML file line #47: Error inflating class huawei.android.widget.TimePicker

很奇怪,TimePicker在布局文件中使用标签,当布局文件被inflate后,在android.widget.TimePicker前面加了一个huawei.。如果使用

android.view.InflateException: Binary XML file line #20: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:620)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at android.app.TimePickerDialog.<init>(TimePickerDialog.java:103)
at android.app.TimePickerDialog.<init>(TimePickerDialog.java:74)
at android.view.View.performClick(View.java:4447)
at android.view.View$PerformClick.run(View.java:18457)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5119)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
... 20 more
Caused by: java.lang.NullPointerException
at android.view.ViewGroup.addView(ViewGroup.java:3353)
at com.huawei.android.hwcontrol.TimePickerFactory.updateAmPmStart(TimePickerFactory.java:92)
at android.widget.TimePicker.<init>(TimePicker.java:265)
at android.widget.TimePicker.<init>(TimePicker.java:139)
... 23 more
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at android.app.TimePickerDialog.<init>(TimePickerDialog.java:103)
at android.app.TimePickerDialog.<init>(TimePickerDialog.java:74)
at android.view.View.performClick(View.java:4447)
at android.view.View$PerformClick.run(View.java:18457)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5119)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.ViewGroup.addView(ViewGroup.java:3353)
at com.huawei.android.hwcontrol.TimePickerFactory.updateAmPmStart(TimePickerFactory.java:92)
at android.widget.TimePicker.<init>(TimePicker.java:265)
at android.widget.TimePicker.<init>(TimePicker.java:139)
... 23 more

华为改了系统的源码,因为google官方的android系统源中有这样一个逻辑,发现布局文件中的View没有包名,会自动加上android.widget.前缀。已经在怀疑是在AndroidManifest.xml文件中配置了什么导致了问题,所以一行一行的排查。果然,在去掉下面这行后,就正常了。
这个meta-data定义是放在applicaton标签中,所以会针对整个App。把这行干掉之后,问题解决。

  • 如果在推送中已经填写了Debug Key的SHA256证书指纹,再改成Release Key的指纹时,发现手机一直获取不到token,解决办法是把手机中相关华为的服务的应用缓存清除掉,特别是华为移动服务。如果还是不行,把华为商城应用升级到最新版本

  • 如果一直能正常获取到token,突然又不能,解决办法是重启手机再试。

  • 如果注册成功,发现收到消息,首先排查服务器端调用华为SDK是否OK,如果服务器端调用OK,没有出现报错之类的问题,然后就是等,可能是10分钟后或者20分钟后,甚至是第二天,你就 基本 能收到消息了

  • 自己集成SDK测试时,出现了几次消息没收到的情况,也就是推送丢失了。但使用华为联盟后台推送比使用SDK推送,消息的到达率和准时性要好

1
0
查看评论

android接入华为推送注意点

由于公司产品有及时聊天功能,因此对信息达到及时性要求比较高,因此安排我处理部分android手机在app不运行情况下的信息推送。下面分别介绍华为推送和小米推送接入。        一、华为推送 接入之前,我先研究了华为推送的demo,目前华为推送官网是HM...
  • wql2rainbow
  • wql2rainbow
  • 2017-03-24 16:58
  • 3484

极光推送华为手机bug

最近小编在测试极光推送的时候,用了三部手机,分别是魅族mx4,红米note2,酷派大神f2,华为mate2,发现只有华为手机经常在熄屏状态下接收不到推送,而当我点亮屏幕之后,立马接收到了推送,最后发现原来华为对熄屏之后的wifi做了处理,华为手机在熄屏时,如果用户不设置,会断开wifi连接,从而达到...
  • u010575303
  • u010575303
  • 2016-12-17 14:45
  • 1573

极光消息推送及角标实现,附带完整demo

摘要:本次实现了用户登录注册,将用户保存到Application 里面实现用户持久化,用户有已读消息查看,未读消息查看,发送消息功能,未读消息读取后,添加到已读消息里面,发送消息具有推送功能 可以全部发送,和选择人员发送,发送消息过后,如果当前用户在线会收到一条任务栏通知,点击通知可以查看到该消息,...
  • vip573117
  • vip573117
  • 2017-06-13 17:27
  • 6106

小米手机退出app后收不到极光推送消息

场景: 进入app,发送消息,消息正常接收,连续2次back退出app后,收不到极光推送消息,pushService进程存在,app主进程被杀。华为,魅族都能在相同条件下接收消息,**小米手机 收不到消息** 针对小米手机分析分析: 1.MIUI 6开始增加了神隐模式-顾名思义是隐藏起来,MI...
  • tsdfk1455
  • tsdfk1455
  • 2016-11-30 10:27
  • 3639

App推送java服务端_小米推送

目前主流的推送,jpush,友盟,小米等等,楼主这里用的是小米,当然需要先看小米的api 小米提供的服务端api地址:http://dev.xiaomi.com/doc/?p=533#d5e15 客户端集成好sdk,服务器导入jar包,调小米的方法,然后做个后台界面供运维使用: ...
  • xb12369
  • xb12369
  • 2015-09-14 15:21
  • 5624

小米杀不死的消息推送-- Android、java后端同时接入小米推送

作者简介 微信公众号(高质量文章推送):陈博易 前言选择小米推送的原因:App进程被杀死的情况下,小米推送服务并不会被杀死(除非用户手动在设置中关闭了该推送的权限),所以我选择给大家分享下小米推送。
  • u013777094
  • u013777094
  • 2017-11-13 18:19
  • 458

(4.2.12)浅谈第三方推送[推送基础]:百度推送、小米推送、华为推送

市面上目前做免费推送服务的有很多,友盟、极光、百度、小米、华为等,由于android机型的多样性,在使用单独的一种推送时,往往会造成一些机型无法获取(当然,内部原因可能很复杂)。Android 第三方 Push 推送方案使用调查因此往往需要同时集成多个第三方推送,并且能做到: 自动识别机型以选取对应...
  • fei20121106
  • fei20121106
  • 2016-06-02 12:14
  • 2361

魅族实时消息推送架构

转载:http://www.csdn.net/article/2015-12-22/2826542系统介绍这个系统数据情况是这样的,实时在线的用户是2500万左右,下面有一个趋势图,从今年1到10月份的都列出来了,这个系统一天PV量是50亿左右,这个系统推送速度可以达到600万条/分钟。数据结构 系...
  • kongbaidepao
  • kongbaidepao
  • 2015-12-27 22:19
  • 910

android接入华为推送

最近公司产品想要提高用户体验,便让我研究一下华为推送的问题。其实推送最重要的就是进程保活的这个问题,这是一个比较棘手的问题。现在比较普遍的做法是集成多个厂商的推送,例如小米,华为,魅族推送等,再加一个另外的第三方推送(个推,极光,信鸽)。今天主要讲的是华为推动接入的一些步骤和问题,而接入的版本是hm...
  • lihuanxing
  • lihuanxing
  • 2017-08-03 11:26
  • 1560

Android 推送 整合小米、个推、jpush

Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像iOS能提供统一管理的推送服务。Android端推送目前常用的都是第三方推送服务,也可以自己搭建推送服务器来实现, 为了节约开发成本,目前主流的提供第三方推送服务的有:极光推送、个推、友盟、小米推送、百度推送等。 A...
  • zhi137_zhi148_qwer
  • zhi137_zhi148_qwer
  • 2016-11-22 10:11
  • 1630
    个人资料
    • 访问:498944次
    • 积分:8360
    • 等级:
    • 排名:第2878名
    • 原创:263篇
    • 转载:603篇
    • 译文:1篇
    • 评论:20条