集成华为HMS支付宝集成出现的问题SDK问题,求助

android集成华为推送总结 - 推酷
android集成华为推送总结
前段时间在应用中集成了华为推送,现在终于告一段落了,回首起来,发现一路踩的坑,都是泪啊。
先交待下集成华为推送的背景:由于android手机上的google官方的推送GCM在中国大陆基本是残废,而大陆有些手机厂商可能会干掉这部分,造成GCM推送基本不可用。而像小米、华为等手机厂商对android系统的ROM进行了深度定制,用户可以手机桌面直接将应用程序kill,即使有后台服务,都被会一起干掉,同时android新的版本为了改善手机续行,在6.0开始增加了Doze机制,无疑对推送又是一大打击。综合这些因素,决定选几种推送一起集成进来,其中就有针对华为手机的华为推送。
去华为开发者官网发现,华为推送有两种,不细心还真发现不了。一种是已经明确标识的 PUSH服务 ,另一种是 华为移动服务(HMS) 。 PUSH服务 仅是提供推送服务,所以一般推送使用这种。如果华为手机没有打开 应用自启动 也可以使用这种推送,但使用这种推送如果推送多条消息,会在通知栏显示多条通知,不会自动合并成一条,如果是用在IM中作为消息推送,N条消息一过来,用户体验可想而知。而相反,小米的推送就好很多,通知栏通知会自动合并,只显示一条。另外 HMS 中不仅集成了推送,还包括支付等服务,使用 HMS 中的推送可以自定义消息通知栏,还可以自定义数据格式,官方称这种方式为透传。 PUSH服务 只能是系统弹出通知栏,应用没有控制权限,也不能额外的再传递数据,所以使用 HMS 自定义通知栏通知可以解决通知栏弹出N多通知的问题。 PUSH服务 与 HMS 在华为手机上相比,前者的通用性更强些。目前在几台华为手机上测试发现, PUSH服务 都能注册成功,而 HMS 在有些手机上不能注册成功,需要打开应用的 应用自启动 开关,甚至有的手机上根本注册不成功,不管怎么折腾。
那么想要好的推送效果,又想要好的推送体验,唯一解决办法是两种都集成,先通过 HMS 注册,如果注册不成功,则使用使用 PUSH服务 。
写这篇记录的时候去官网看了一下,官方已经将 PUSH服务 与 HMS 中的推送合并,下图是官方的文档说明:
另外还有一些坑:
1.华为联盟后台的账号登录后会在浏览器缓存cookie,如果切换账号,发现后台的信息还是上一个账号的,需要清除浏览器cookie缓存才OK。这是同事在使用公司的账号和个人的账号测试时发现的。
2.如果在推送中已经填写了Debug Key的SHA256证书指纹,再改成Release Key的指纹时,发现手机一直获取不到token,解决办法是把手机中相关华为的服务的应用缓存清除掉,特别是华为移动服务。如果还是不行,把华为商城应用升级到最新版本。
添加指纹的位置:
3.如果一直能正常获取到token,突然又不能,解决办法是重启手机再试。
4.如果注册成功,发现收到消息,首先排查服务器端调用华为SDK是否OK,如果服务器端调用OK,没有出现报错之类的问题,然后就是等,可能是10分钟后或者20分钟后,甚至是第二天,你就 基本 能收到消息了。
自己集成SDK测试时,出现了几次消息没收到的情况,也就是推送丢失了。但使用华为联盟后台推送比使用SDK推送,消息的到达率和准时性要好。
下面这张截图是华为官方的服务介绍:
还有一些问题的解决方案参考这里:
如果还遇到其他问题解决不了,通过QQ找他们技术支持。
希望能帮到一些人,以上。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致后使用快捷导航没有帐号?
平板/笔记本
云服务专区
& & & & 应用开发
今日: 0 | 昨日: 0 | 帖子: 834 |版主: , , , ,
开发者联盟活动
效率、质量,华为开发者服务工具产品解决方华为开发者联盟开启专属于新品应用的“启蒙荣耀7智灵显开放实力
携手悦动圈开启运动
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
关注华为开发者联盟
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利公司的 app 一直使用的是极光推送,最近反馈比较多的是推送消息收不到,看来需要找新的推送服务了,在国内目前手机品牌占有率比较多的是华为和小米,且这两家都有自己的推送服务,同时一个合作的友商说他们使用的是友盟推送,推送率还不错,那么就测试这三个推送服务了。
按照集成的难易程度排序
官网有提供了视频和文档,很详细,而且很简单。
在小米推送运营平台创建应用,, 获取到 AppID , AppKey
把从小米下载的 jar 放到 libs 下
在 AndroidManifest.xml 中添加权限
&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" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="android.permission.VIBRATE"/&
&permission android:name="com.xxx.xxx.permission.MIPUSH_RECEIVE" android:protectionLevel="signature" /&
&uses-permission android:name="com.xxx.xxx.permission.MIPUSH_RECEIVE" /&
配置推送服务需要的service和receiver
android:enabled="true"
android:process=":pushservice"
android:name="com.xiaomi.push.service.XMPushService"/&
android:name="com.xiaomi.push.service.XMJobService"
android:enabled="true"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":pushservice" /&
&!--注:此service必须在3.0.1版本以后(包括3.0.1版本)加入--&
android:enabled="true"
android:exported="true"
android:name="com.xiaomi.mipush.sdk.PushMessageHandler" /&
&service android:enabled="true"
android:name="com.xiaomi.mipush.sdk.MessageHandleService" /&
&!--注:此service必须在2.2.5版本以后(包括2.2.5版本)加入--&
android:exported="true"
android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" &
&intent-filter&
&action android:name="android.net.conn.CONNECTIVITY_CHANGE" /&
&category android:name="android.intent.category.DEFAULT" /&
&/intent-filter&
&/receiver&
android:exported="false"
android:process=":pushservice"
android:name="com.xiaomi.push.service.receivers.PingReceiver" &
&intent-filter&
&action android:name="com.xiaomi.push.PING_TIMER" /&
&/intent-filter&
&/receiver&
自定义一个BroadcastReceiver类
public class MiMessageReceiver extends PushMessageReceiver {
private static final String TAG = "MiMessageReceiver";
private String mRegId;
private String mT
private String mA
private String mA
private String mStartT
private String mEndT
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
Log.v(MyApplication.TAG,
"onNotificationMessageClicked is called. " + message.toString());
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
Log.e(TAG, mTopic);
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
Log.e(TAG, mAlias);
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
Log.v(MyApplication.TAG,
"onNotificationMessageArrived is called. " + message.toString());
String log = "Arrived a notification message. Content is " + message.getContent();
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
public void onCommandResult(Context context, MiPushCommandMessage message) {
Log.v(TAG,
"onCommandResult is called. " + message.toString());
String command = message.getCommand();
List&String& arguments = message.getCommandArguments();
String cmdArg1 = ((arguments != null && arguments.size() & 0) ? arguments.get(0) : null);
String cmdArg2 = ((arguments != null && arguments.size() & 1) ? arguments.get(1) : null);
if (MAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mRegId = cmdArg1;
Log.e(TAG, "Register push success.");
Log.e(TAG, "Register push fail.");
log = message.getReason();
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
Log.v(TAG,
"onReceiveRegisterResult is called. " + message.toString());
String command = message.getCommand();
List&String& arguments = message.getCommandArguments();
String cmdArg1 = ((arguments != null && arguments.size() & 0) ? arguments.get(0) : null);
if (MAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mRegId = cmdArg1;
Log.e(TAG, "Register push success.");
Log.e(TAG, "Register push fail.");
在 AndroidManifest.xml 中注册该广播
android:name=".MiMessageReceiver"
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&
在 Application 中初始化推送服务
private void initMiPush() {
//初始化push推送服务
if (shouldInit()) {
MiPushClient.registerPush(this, MI_APP_ID, MI_APP_KEY);
LoggerInterface newLogger = new LoggerInterface() {
public void setTag(String tag) {
public void log(String content, Throwable t) {
Log.d(TAG, content, t);
public void log(String content) {
Log.d(TAG, content);
Logger.setLogger(this, newLogger);
private boolean shouldInit() {
ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
List&ActivityManager.RunningAppProcessInfo& processInfos = am.getRunningAppProcesses();
String mainProcessName = getPackageName();
int myPid = android.os.Process.myPid();
for (ActivityManager.RunningAppProcessInfo info : processInfos) {
if (info.pid == myPid && mainProcessName.equals(info.processName)) {
接入步骤(HMS-SDK版本:2.4.0.300):
把从华为 Push 推送官网下载的 aar ,位于:...\HMS-2.4.0.300\HWHMS-SDK-v2.4.0.300\libs\HMS-SDK-2.4.0.300.aar,放到工程目录的 aars 下(没有该目录的新建一个)
在 AndroidManifest.xml 文件的 Application 节点添加: meta-data 和自定义的 Receiver,如下(其中 meta-data 中的 appId 是在网页上创建应用的 id,我的是一个 8 位的数字):
&meta-data
android:name="com.huawei.hms.client.appid"
android:value="appId"&
&/meta-data&
&!-- 第三方相关 :接收Push消息(注册、Push消息、Push连接状态)广播 --&
&receiver android:name=".HuaweiPushReceiver"&
&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"/&
&/intent-filter&
&meta-data
android:name="CS_cloud_ablitity"
android:value="@string/hwpush_ability_value"/&
&/receiver&
在 AndroidManifest.xml 文件中添加权限
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&
&uses-permission android:name="android.permission.WAKE_LOCK" /&
&uses-permission android:name="android.permission.INTERNET"/&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
在 MainActivity 或者 BaseAcitivty 中初始化华为 Push ,放在 onCreate() 中初始化华为 Push
private void initHuaweiPush(Context context) {
HuaweiIdSignInOptions options = new HuaweiIdSignInOptions.Builder(HuaweiIdSignInOptions.DEFAULT_SIGN_IN)
mClient = new HuaweiApiClient.Builder(context)
.addApi(HuaweiPush.PUSH_API)
.addConnectionCallbacks(new HuaweiApiClient.ConnectionCallbacks() {
public void onConnected() {
getToken();
runOnUiThread(new Runnable() {
public void run() {
tv.setText("HUAWEI onConnected, IsConnected: " + mClient.isConnected());
Log.e(TAG, "HUAWEI onConnected, IsConnected: " + mClient.isConnected());
public void onConnectionSuspended(final int i) {
runOnUiThread(new Runnable() {
public void run() {
tv.setText("HUAWEI onConnectionSuspended, cause: " + i + ", IsConnected:" +
mClient.isConnected());
Log.e(TAG, "HUAWEI onConnectionSuspended, cause: " + i + ", IsConnected:" +
mClient.isConnected());
.addOnConnectionFailedListener(new HuaweiApiClient.OnConnectionFailedListener() {
public void onConnectionFailed(@NonNull final ConnectionResult
connectionResult) {
runOnUiThread(new Runnable() {
public void run() {
tv.setText("HUAWEI onConnectionFailed, ErrorCode: " + connectionResult.getErrorCode());
Log.e(TAG, "HUAWEI onConnectionFailed, ErrorCode: " + connectionResult.getErrorCode());
mClient.connect();
protected void onStart() {
super.onStart();
mClient.connect();
private void getToken() {
if (!isConnected()) {
tv.setText("get token failed, HMS is disconnect.");
// 同步调用方式,不会返回token,通过广播的形式返回。
new Thread(new Runnable() {
public void run() {
PendingResult&TokenResult& token = HuaweiPush.HuaweiPushApi.getToken(mClient);
token.await();
}).start();
public boolean isConnected() {
if (mClient != null && mClient.isConnected()) {
新建 HuaweiPushReceiver ,继承 PushReceiver,重写 onToken() ,onPushMsg(),onEvent(),onPushState(),在 onToken() 中可以获取到 token。
public class HuaweiPushReceiver extends PushReceiver {
private static final String TAG = "Huawei PushReceiver";
public void onToken(Context context, String token, Bundle extras) {
String belongId = extras.getString("belongId");
String content = "get token and belongId successful, token = " + token + ",belongId = " + belongId;
Log.d(TAG, content);
public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {
String content = "-------Receive a Push pass-by message: " + new String(msg, "UTF-8");
Log.d(TAG, content);
} catch (Exception e) {
e.printStackTrace();
public void onEvent(Context context, PushReceiver.Event event, Bundle extras) {
if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
int notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
if (0 != notifyId) {
NotificationManager manager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notifyId);
String content = "--------receive extented notification message: " + extras.getString
(BOUND_KEY.pushMsgKey);
Log.d(TAG, content);
super.onEvent(context, event, extras);
public void onPushState(Context context, boolean pushState) {
String content = "---------The current push status: " + (pushState ? "Connected" :
"Disconnected");
Log.d(TAG, content);
} catch (Exception e) {
e.printStackTrace();
获取到 token 以后就连接成功了。可以测试推送了。
非华为手机使用华为推送需要安装-华为移动服务.apk
各个版本EMUI对push的支持情况
华为手机上:
Emui3.0上,Push广播有很大概率被限制,如: Mate7 3.0版本,荣耀6plus,P7 3.0版本,4X, 4A等。
Emui3.1上,Push广播基本不被限制,但个别型号机型存在问题,如:荣耀5x等。
Emui4.0及以上,Push广播有较高概率被限制,不被限制的机型如:荣耀畅玩4C,荣耀畅玩4X,Mate S,P8 MAX等。
Emui4.1 , ROM升级到了最新版本的(80%已升),通知消息不走广播,不会被限制,透传消息走广播,会被限制。
Emui5.0以上 ,通知消息不走广播,不会被限制,透传消息走广播,会被限制。
如广播被限制,需要将应用设为开机启动项。所以对于及时性或到达率要求非常高的应用,我们建议应用要考虑替代方案。
非华为手机:
第三方手机(如:小米、OPPO、三星等),由于rom的限制,需要将应用 设为开机启动项。
Samsung S4(Android 5.0)
HTC D820u(Android 6.0)
Huawei P8(Android 6.0)
Xiaomi Note(Android 7.0)
Samsung S7(Android 7.0)
LG Nexus 6(Android 7.0)
Huawei Mate8(Android 7.0)
Huawei Mate9(Android 7.0)
三家推送比较
华为推送在非华为手机上必须安装华为移动服务,这点比较的坑,用户可能不会同意安装的,那就没得玩了,只适合在华为手机上使用。
华为推送还得区别 Emui 的版本,这玩意也不是个小坑,虽然官方QQ群公告说 Emui 5.0 以后都可以收到消息推送,但是不知道靠谱不靠谱
友盟推送的话,在测试阶段,发现三星S7(Android 7.0),三星S4(Android 5.0),华为P8(Android 6.0)无法获取到 token,没有 token ,那就推送不了了。
小米推送还可以,但是在三星 S4(Android 5.0) 上无法接收到推送。
综上,app 需要集成华为推送和小米推送比较的靠谱点,针对华为手机使用华为推送,其他手机使用小米推送。
使用中的大坑,在华为手机上假如华为移动服务不是最新版本或者被卸载了,推送服务无法使用。必须在 app 中提示用户更新或安装,真是一个大坑,关键是更新界面丑的要死,还会出现更新失败的情况,坑人呀。
针对小米推送,在非小米设备上会出现重启以后无法获得推送,因为是重启以后,小米的 XMPushService 没有起来,目前采用的办法是监听手机启动广播,然后启动小米的 XMPushService。
阅读(...) 评论()匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 支付宝集成出现的问题 的文章

 

随机推荐