小米集成指南
1、使用JCenter自动化集成步骤
确认AndroidStudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持)
buildscript {
repositories {
jcenter()
}
}
allprojects {
repositories {
jcenter()
}
}
在应用module的gradle中dependencies节点添加如下代码
dependencies{
implementation 'cn.jiguang.sdk.plugin:xiaomi:3.8.5'
// JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
}
在应⽤module的gradle中defaultConfig节点添加如下代码(不要遗漏前缀MI-):
manifestPlaceholders=[
JPUSH_PKGNAME:"您应用的包名",
XIAOMI_APPKEY:"MI-您的应用对应的小米的APPKEY",//小米平台注册的appkey
XIAOMI_APPID:"MI-您的应用对应的小米的APPID",//小米平台注册的appid
]
由于 MiPush 的 regid 只能在主进程获取,非主进程获取到的regid为空,所以极光的 PushReceiver应寄宿于应用主进程, 需要在AndroidManifest.xml中将 PushReceiver 的分离进程配置去掉。配置示例如下:
<receiver
android:name="cn.jpush.android.service.PushReceiver"
tools:node="replace"
android:enabled="true">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!--Required 显示通知栏 -->
<category android:name="${applicationId}" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<!-- Optional -->
<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>
2、配置AndroidManifest.xml集成步骤
注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上步骤,您可以跳过本段)
手动集成主要步骤为:
- 1. 增加小米插件包及小米推送包
- 2. 配置小米推送sdk所需要的权限
- 3. 配置小米必须的组件
- 4. 配置JPush接受的小米sdk的消息接受类
- 5. 将XIAOMI_APPKEY与XIAOMI_APPID替换为在小米后台注册对应该应用的AppKey/AppID
(1)导入极光的插件包以及小米推送sdk的jar,将极光提供的libs包中的jpush-android-plugin-xiaomi-v3.x.x.jar(插件包)及MiPush_SDK_Client_x_x_x.jar(小米推送包)导入到工程libs/目录下。
注1:极光集成小米通道在 JPush Android SDK 3.0.3 添加,对应测试的小米 SDK 版本为:3.2.2
注2:极光集成小米SDK在 JPush Android SDK 3.2.0 有升级,对应测试的小米 SDK 版本为:3.6.12
注2:极光集成小米SDK在 JPush Android SDK 3.3.2 有升级,对应测试的小米 SDK 版本为:3.6.18
注3:极光集成小米SDK在 JPush Android SDK 3.6.0 有升级,对应测试的小米 SDK 版本为:3.7.5
(2)配置小米推送sdk所需要的权限
<permission
android:name="您应用的包名.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="您应用的包名.permission.MIPUSH_RECEIVE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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" />
(3)配置小米必须的组件
<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
android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
android:enabled="true"
android:exported="true" />
<service
android:name="com.xiaomi.mipush.sdk.MessageHandleService"
android:enabled="true" />
<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>
注:请不要将极光的组件PushReceiver配置进程和主进程分离。(按照示例默认配置即可)否则会影响小米RegId的获取
(4)配置JPush接受的小米sdk的消息接受类
<receiver android:name="cn.jpush.android.service.PluginXiaomiPlatformsReceiver" 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>
(5)将APPKEY与APPID替换为在小米后台注册对应该应用的AppKey/AppID(不要遗漏前缀MI-)
<meta-data android:name="XIAOMI_APPKEY" android:value="MI-您的应用对应的小米的appkey"/> <meta-data android:name="XIAOMI_APPID" android:value="MI-您的应用对应小米的appID"/>
(6)对于同一个应用集成了多个推送SDK,且其他SDK也使用了小米通道的用户:
可以将这个极光内置的Receiver,换成自己定义的Receiver。
这个Receiver必须继承小米的com.xiaomi.mipush.sdk.PushMessageReceiver
且在每个回调方法,都回调给极光的PluginXiaomiPlatformsReceiver。类似于这样:
public class XMPushReceiver extends PushMessageReceiver {
final PluginXiaomiPlatformsReceiver receiver = new PluginXiaomiPlatformsReceiver();
@Override
public void onReceivePassThroughMessage(final Context context, final MiPushMessage message) {
receiver.onReceivePassThroughMessage(context, message);
}
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
receiver.onNotificationMessageClicked(context, message);
}
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
receiver.onNotificationMessageArrived(context, message);
}
@Override
public void onCommandResult(Context context, MiPushCommandMessage message) {
receiver.onCommandResult(context, message);
}
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
receiver.onReceiveRegisterResult(context, message);
}
}
3、小米SDK的编译混淆问题
如果使用了proguard,需要在配置文件中加入,可以防止一个误报的warning导致无法成功编译:
-dontwarn com.xiaomi.push.**
-keep class com.xiaomi.push.**{*;}
4、点击通知跳转到指定Activity(小米,华为,vivo均适用)
说明
小米/华为/vivo的push允许开发者在推送通知的时候传入自定义的intenturi字符串,当用户点击了该通知,系统会根据uri的值过滤出匹配的Activity,并打开Activity,达到跳转的目的。
注1:华为此功能从JPushAndroidSDK3.0.9开始支持;小米和vivo从JPushAndroidSDK3.3.8开始支持
注2:此功能需要服务器端与Android端联合修改与调试。
服务端使用方式
在pushapi的payload中的"notification"的"android"节点下添加以下字段:
| 关键字 | 类型 | 实例 | 说明 |
| uri_activity | String | "com.HuananThirdPush.cn.OpenClickActivity" | 该字段用于指定开发者想要打开的activity,值为activity节 点的"android:name"属性值。 |
示例代码:
{
"platform": [
"android"
],
"audience": "all",
"notification": {
"android": {
"alert": "在线alert003",
"title": "在线title003",
"uri_activity": "com.HuananThirdPush.cn.OpenClickActivity"
}
},
"message": {
"msg_content": "自定义消息内容003"
}
}
极光提供服务端JAVASDK,下载地址GitHub - jpush/jpush-api-java-client: JiGuang's officially supported Java client library for accessing JPush APIs. 极光官方支持的 Java 版本服务器端 SDK。,内含有example样例。可以拉取最新的代码自行打包,也可以直接使用libs文件夹下的jar。
示例代码如下:
注: addCustom("uri_activity","xxx")方法传递的参数在非华为/VIVO/小米机型上做无效处理;addCustom("uri_action","xxx")方法传递的参数在非OPPO/FCM机型上做无效处理
public static PushPayload buildPushObject_CustomField() {
Notification notification = Notification.newBuilder()
.addPlatformNotification(AndroidNotification.newBuilder()
.setAlert(ALERT)
.setTitle("Alert test")
.setLargeIcon("http://www.jiguang.cn/largeIcon.jpg")
.addCustom("uri_activity", "com.HuananThirdPush.cn.OpenClickActivity")
.addCustom("uri_flag", "uri_flag")
.addCustom("uri_action", "com.HuananThirdPush.cn.OpenClickActivity")
.build())
.build();
PushPayload.Builder payloadBuilder = new PushPayload.Builder()
.setPlatform(Platform.all())
.setAudience(Audience.all())
.setNotification(notification);
return payloadBuilder.build();
}
Android端配置步骤
(1)AndroidManifest.xml中配置点击通知要打开的Activity
<activity android:name="您配置的activity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
注:android:exported属性必须设置为true,并增加示例中的intent-filter,否则会导致无法收到通知。
(2)获取通知相关信息
目前启动配置的activity都是使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK方式启动,只需要在您配置的activity中的onCreate方法中进行处理,获取通知信息。华为通过getIntent().getData(),小米/vivo/OPPO/FCM通过 getIntent().getExtras().getString("JMessageExtra")取到Intent的数据。获取到的数据是JSON字符串,通过解析可以获得通知相关内容。
JSON示例如下:
{
"msg_id": "123456",
"n_content": "thisiscontent",
"n_extras": {
"key1": "value1",
"key2": "value2"
},
"n_title": "thisistitle",
"rom_type": 0
}
JSON内容字段说明:
| 字段 | 取值类型 | 描述 |
| msg_id | String | 通过此key获取到通知的msgid |
| n_title | String | 通过此key获取到通知标题 |
| n_content | String | 通过此key获取到通知内容 |
| n_extras | String | 通过此key获取到通知附加字段 |
| rom_type | byte | 通过此key获取到下发通知的平台。得到值说明:byte类型的整数, 0为极光,1为小米,2为华为,3为魅族,4为oppo,5为vivo,8为FCM。 |
注:rom_type用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值
通知点击上报
解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下
/** * context 上下文 * msgId 消息ID * whichPushSDK 收到推送的平台,即 rom_type 字段的取值。 **/ JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);
注:点击上报必须传入正确的whichPushSDK参数,否则会造成统计数据错误。
富媒体调整
在AndroidManifest.xml中将PushActivity、PopWinActivity的android:exported="false"属性修改为true,否则会导致收不到富媒体推送。
Activity示例代码(华为/小米/OPPO/vivo/FCM厂商均适用,魅族与基础的走极光通道的通知获取方法一致)
package com.HuananThirdPush.cn;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import cn.jpush.android.api.JPushInterface;
public class OpenClickActivity extends Activity {
private static final String TAG = "OpenClickActivity";
/**消息Id**/
private static final String KEY_MSGID = "msg_id";
/**该通知的下发通道**/
private static final String KEY_WHICH_PUSH_SDK = "rom_type";
/**通知标题**/
private static final String KEY_TITLE = "n_title";
/**通知内容**/
private static final String KEY_CONTENT = "n_content";
/**通知附加字段**/
private static final String KEY_EXTRAS = "n_extras";
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = new TextView(this);
setContentView(mTextView);
handleOpenClick();
}
/**
* 处理点击事件,当前启动配置的Activity都是使用
* Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
* 方式启动,只需要在onCreat中调用此方法进行处理
*/
private void handleOpenClick() {
Log.d(TAG, "用户点击打开了通知");
String data = null;
//获取华为平台附带的jpush信息
if (getIntent().getData() != null) {
data = getIntent().getData().toString();
}
//获取fcm/oppo/小米/vivo 平台附带的jpush信息
if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
data = getIntent().getExtras().getString("JMessageExtra");
}
Log.w(TAG, "msg content is " + String.valueOf(data));
if (TextUtils.isEmpty(data)) return;
try {
JSONObject jsonObject = new JSONObject(data);
String msgId = jsonObject.optString(KEY_MSGID);
byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
String title = jsonObject.optString(KEY_TITLE);
String content = jsonObject.optString(KEY_CONTENT);
String extras = jsonObject.optString(KEY_EXTRAS);
StringBuilder sb = new StringBuilder();
sb.append("msgId:");
sb.append(String.valueOf(msgId));
sb.append("\n");
sb.append("title:");
sb.append(String.valueOf(title));
sb.append("\n");
sb.append("content:");
sb.append(String.valueOf(content));
sb.append("\n");
sb.append("extras:");
sb.append(String.valueOf(extras));
sb.append("\n");
sb.append("platform:");
sb.append(getPushSDKName(whichPushSDK));
mTextView.setText(sb.toString());
//上报点击事件
JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
} catch (JSONException e) {
Log.w(TAG, "parse notification error");
}
}
private String getPushSDKName(byte whichPushSDK) {
String name;
switch (whichPushSDK) {
case 0:
name = "jpush";
break;
case 1:
name = "xiaomi";
break;
case 2:
name = "huawei";
break;
case 3:
name = "meizu";
break;
case 4:
name = "oppo";
break;
case 5:
name = "vivo";
break;
case 8:
name = "fcm";
break;
default:
name = "jpush";
}
return name;
}
}
5、集成结果判断
成功
能成功调用接口获取到小米rid,存在小米集成成功但rid为null的情况。(需要在主进程中获取)
MiPushClient.getRegId(getApplicationContext());
失败
缺少appkey或appid。打印:
xiaomisdkappkeyorappidwasempty,pleasecheckyourmanifestconfig
当配置都正常时,小米sdk注册失败时miui会打印E级别的日志,一般是appkey、appid非法。打印:
"xiaomipushregisterfailed-errorCode:" + message.getResultCode() + ",reason:" + message.getReason());
当配置都正常时,无法通过方法MiPushClient.getRegId获得regID,需要检查一下小米应用是否开启推送功能。打印:
[PluginXiaomiPlatformsReceiver]xiaomipushregisterfailed-errorCode:22022,reason:Invalidpackagename:com.xxxxxx.xxxxxx
6、小米厂商通道测试方法
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK
- 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网-应用信息-推送设置-厂商通道)填写小米相关参数,保存后启用;

- 保持App在前台运行,尝试对设备进行推送;
- 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
- 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。
华为集成指南
主要步骤为:
- 1. 添加 Huawei SDK 到项目中
- 2. 配置接收 HMS 消息的广播接收器
- 3. 在build.gradle中配置在华为后台添加的指纹证书对应的签名
1.集成步骤
(1)将极光提供的third-push/huawei/libs中的插件包(jpush-android-plugin-huawei-v3.x.x.jar)拷贝到工程libs目录下
注意:也可使用jcenter集成方式,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
示例:implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'
(2)在 Huawei 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 agconnect-services.json 配置文件并添加到应用的 module 目录下。

注:services.json 配置文件的获取请参考厂商通道相关参数申请教程--华为相关参数获取部分。
(3) 在根级 build.gradle 中添加规则,以纳入 HMS 服务插件 和 华为 的 Maven 代码库,可根据华为开发者联盟发布的版本更新选择最新版本:
buildscript {
repositories {
google()
jcenter()
maven {url 'http://developer.huawei.com/repo/'}
}
}
buildscript {
dependencies {
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
google()
jcenter()
maven {url 'http://developer.huawei.com/repo/'}
}
}
(4) 在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件:
// ADD THIS AT THE TOP apply plugin: 'com.huawei.agconnect'
(5) 在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 Huawei发布的版本更新选择最新版本:
dependencies {
implementation 'com.huawei.hms:push:5.0.0.300'
//引入极光-华为插件,如果采用此配置,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,
也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
implementation 'cn.jiguang.sdk.plugin:huawei:3.8.5'
// JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
}
注1:极光集成华为通道在 JPush Android SDK 3.0.5 添加,对应测试的华为HMS SDK 版本为:HMS-SDK-2.4.0.300.aar
注2:JPush Android SDK 3.0.9 适配HMS SDK的升级,对应测试的华为HMS SDK 版本为:HMSSdk-base-2.5.2.300.aar,HMSSdk-push-2.5.2.300.aar
注3:JPush Android SDK 3.1.2 适配HMS SDK的升级,对应测试的华为HMS SDK 版本为:HMSSdk-base-2.5.3.302.aar,HMSSdk-push-2.5.3.302.aar
注4:从HMS_SDK_2.6.0.301版本开始支持jar包+res资源集成,JPush Android SDK 3.1.5对应测试的华为HMS SDK 版本为:HMS_SDK_2.6.0.301.jar
注5:JPush Android SDK 3.2.0 更新华为HMS SDK版本为:hmssdk_2.6.3.301.jar
注6:JPush Android SDK 3.3.6 更新华为HMS SDK版本为:hmssdk_2.6.3.306.jar
注7:JPush Android SDK 3.5.4 更新华为HMS SDK版本为:3.0.3.301
注7:JPush Android SDK 3.6.0 更新华为HMS SDK版本为:4.0.2.300
注8: 添加 华为 Push SDK 的官方文档
(6) 配置接收HMS消息的服务(使用jcenter集成方式则无需配置)
<service
android:name="cn.jpush.android.service.PluginHuaweiPlatformsService"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service
(7)在build.gradle中配置在华为后台添加的指纹证书对应的签名
signingConfigs {
release {
storeFile file("release.keystore")//签名文件的path
storePassword "123456"
keyAlias "android.keystore"
keyPassword "123456"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug{
minifyEnabled false
signingConfig signingConfigs.release
}
}
注:HMS服务必须要求app签名才能注册成功。指纹证书是在终端采用keytool-list-v-keystorekeystorefileName获取偶对应的指纹证书。
(8)HMS SDK的编译混淆问题
如果使用了 proguard,需要在配置文件中加入,可以防止一个误报的 warning 导致无法成功编译
-ignorewarning
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard白名单。
```
"R.string.hms*",
"R.string.connect_server_fail_prompt_toast",
"R.string.getting_message_fail_prompt_toast",
"R.string.no_available_network_prompt_toast",
"R.string.third_app_*",
"R.string.upsdk_*",
"R.layout.hms*",
"R.layout.upsdk_*",
"R.drawable.upsdk*",
"R.color.upsdk*",
"R.dimen.upsdk*",
"R.style.upsdk*",
"R.string.agc*"
```
2.点击通知跳转到指定Activity
(见小米集成指南第4点)
3.检测华为服务升级
如果华为设备华为服务版本过低的话,将不能使用华为推送通道发送通知,必须升级华为服务才行,用户可选检测该服务是否需要升级。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jPluginPlatformInterface = new JPluginPlatformInterface(this);
}
protected void onStart() {
super.onStart();
jPluginPlatformInterface.onStart(this);
}
protected void onStop() {
super.onStop();
jPluginPlatformInterface.onStop(this);
}
注: 参数必须为Activity,请在合适的Activity里调用该接口,onStart和onStop 接口都必须在Activity的生命周期里调用,否则可能引起内存泄漏。
4.集成结果判断
成功
打印结果如下:
I/JIGUANG-JPush: [PluginHuaweiPlatformsService] onNewToken:AOOkWX-Pg81gPcB7hneOV3928MOwA5Dm62NTocNU1DnfqvXYzubvh4rsGbVsSffmA3bZ0TZOMWhL62-BcNAyo4QPq9GmS5fK_Vz8sMZHYQW96OU8XiE2-i8YBJRmuRL6-Q
D/JIGUANG-JPush: [ActionHelper] doAction:third_action
D/JIGUANG-JPush: [ThirdPushManager] doAction,action:action_register_token,bundle:Bundle[{third_key_action=action_register_token, token=AOOkWX-Pg81gPcB7hneOV3928MOwA5Dm62NTocNU1DnfqvXYzubvh4rsGbVsSffmA3bZ0TZOMWhL62-BcNAyo4QPq9GmS5fK_Vz8sMZHYQW96OU8XiE2-i8YBJRmuRL6-Q, platform=2}],enable:true
I/JIGUANG-JPush: [ThirdPushManager] uploadRegID regid:AOOkWX-Pg81gPcB7hneOV3928MOwA5Dm62NTocNU1DnfqvXYzubvh4rsGbVsSffmA3bZ0TZOMWhL62-BcNAyo4QPq9GmS5fK_Vz8sMZHYQW96OU8XiE2-i8YBJRmuRL6-Q
失败
在华为控制台上面的应用没有开通推送服务配置配置。支持的Emui系统下会有如下打印获取不到token:
W/JIGUANG-JPush:[HWpushHelper] get token error:907122036: no right 或者是如下打印 I/JIGUANG-JPush:[HWpushHelper] token:
处理方法:华为控制台推送服务--服务状态请确认为开通,具体可以参考厂商通道相关参数申请教程--华为相关参数获取部分。
5.华为集成常见错误码
| 类型 | 返回码 | 值 | 意义 | 处理方式 |
| PUSH通用错误码
| SUCCESS
| 0 | 成功 | |
| ERROR_NO_TOKEN | 907122030 | 没有Token | 请尝试删除Token后重新申请Token。 | |
| ERROR_NO_NETWORK
| 907122031 | 没有网络 | 请检查网络连接。 | |
| ERROR_NO_TOKENSIGN
| 907122032 | Token无效 | 请尝试删除Token后重新申请Token。 | |
| ERROR_PUSH_SERVER
| 907122047 | PUSH服务端返回错误 | PUSH服务端返回错误,请联系华为方支持人员。 | |
| ERROR_UNKNOWN
| 907122045 | 未知错误 | 出现未知错误,请联系华为方支持人员。 | |
| ERROR_SERVICE_NOT_AVAILABLE
| 907122046 | PUSH不可服务 | PUSH内部出现异常,请联系华为方支持人员。 | |
| ERROR_HMS_CLIENT_API
| 907122048 | HMS无法连接PUSH | PUSH内部出现异常,请联系华为方支持人员。 | |
| ERROR_OPERATION_NOT_SUPPORTED
| 907122049 | 操作不支持,需要升级系统版本 | 请升级EMUI系统版本到10.0以上。 | |
| ERROR_MAIN_THREAD
| 907122050 | 操作不能在主线程中 | 请在子线程中操作。 | |
| ERROR_ARGUMENTS_INVALID | 907135000 | 传入的参数错误 | 请检查相关的配置信息是否正确。比如:agconnect-services.json文件中的app_id;build.gradle文件是否配置证书签名等。 | |
| ERROR_INTERNAL_ERROR
| 907135001 | 内部错误,表示内部出现异常且无法恢复 | 内部接口出现异常,请联系华为方支持人员。 | |
| ERROR_NAMING_INVALID
| 907135002 | 服务不存在,调用的接口不存在 | 请检查构建HUAWEIApiClient时设置的API是否正确。 | |
| ERROR_CLIENT_API_INVALID
| 907135003 | ApiClient对象无效 | ApiClient对象为空或ApiClient对象状态不是已连接状态,请检查构建HuaweiApiClient时设置的API是否正确。 | |
| ERROR_EXECUTE_TIMEOUT
| 907135004 | 调用AIDL超时 | 此错误码只出现在开发者直接调用await接口时,请尝试将超时时间参数加大。如果觉得已经影响业务,请联系华为方支持人员。 | |
| ERROR_NOT_IN_SERVIC
| 907135005 | 当前区域不支持此业务 | 区域不支持此业务。请联系华为方支持人员。 | |
| ERROR_SESSION_INVALID
| 907135006 | AIDL连接session无效 | 请重试,如果多次重试失败,请联系华为方支持人员。 | |
| ERROR_GET_SCOPE_ERROR
| 907135700 | 调用网关查询应用scope失败 | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果已经创建,请联系华为方支持人员。 | |
| ERROR_SCOPE_LIST_EMPTY
| 907135701 | OpenGW没有配置scope | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。 | |
| ERROR_CERT_FINGERPRINT_EMPTY
| 907135702 | OpenGW没有配置指纹证书 | 1、请检查手机网络是否可以正常访问互联网。 2、请检查是否在AppGallery Connect上配置了正确的证书指纹。具体参考开发准备-AppGallery Connect配置。 3、如果检查都正确,请联系华为方支持人员。
| |
| ERROR_PERMISSION_LIST_EMPTY
| 907135703 | OpenGW没有配置Permission | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。 | |
| ERROR_AUTH_INFO_NOT_EXIST
| 6002 | 应用的鉴权信息不存在 | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果已经创建,请联系华为方支持人员。 | |
| ERROR_CERT_FINGERPRINT_ERROR
| 6003 | 证书指纹校验:证书指纹错误 | 请检查是否在AppGallery Connect上配置了正确的证书指纹。具体参考开发准备-AppGallery Connect配置。 | |
| ERROR_PERMISSION_NOT_EXIST
| 6004 | 接口鉴权:权限不存在,未在联盟上申请 | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。 | |
| ERROR_PERMISSION_NOT_AUTHORIZE
| 6005 | 接口鉴权:未授权 | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。 | |
| ERROR_PERMISSION_EXPIRED
| 6006 | 接口鉴权:授权过期 | 请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果已经创建,请联系华为方支持人员。 | |
| ERROR_API_NOT_SPECIFIED
| 1002 | 调用未指定的API错误 | 请调用指定的API接口。 |
6.华为厂商测试方法 (测试前请务必确认华为控制台推送服务--服务状态请确认为开通,具体可以参考厂商通道相关参数申请教程--华为相关参数获取部分)
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
- 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写华为相关参数,保存后启用;

3.将集成好的App(测试版本)安装在测试机(需要运行 EMUI版本 5.0及以上的手机)上,并且运行App;
4.保持App在前台运行,尝试对设备进行推送;
5.如果应用收到消息,将App退到后台,并且杀掉所有App进程;
6.再次进行推送,如果能够收到推送,则表明厂商通道集成成功。
魅族集成指南
1、使用JCenter自动化集成步骤
确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置 就支持)
buildscript {
repositories {
jcenter()
}
......
}
allprojets {
repositories {
jcenter()
}
}
在应用 module 的 gradle 中 dependencies 节点添加如下代码:
dependencies {
implementation 'cn.jiguang.sdk.plugin:meizu:3.8.5'
// JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
}
在应用 module 的 gradle 中 defaultConfig 节点添加如下代码:
manifestPlaceholders = [ // 设置manifest.xml中的变量 MEIZU_APPKEY : "MZ-您的应用对应的魅族的APPKEY", // 魅族平台注册的appkey MEIZU_APPID : "MZ-您的应用对应的魅族的APPID", // 魅族平台注册的appid ]
2、配置AndroidManifest.xml集成步骤
注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上 步骤,您可以跳过本段)
手动集成步骤主要步骤为:
- 4.1. 增加魅族插件包及魅族推送包
- 4.2. 修改 minSdkVersion 的值
- 4.3. 配置魅族推送sdk所需要的权限
- 4.4. 配置JPush接受魅族sdk的消息接受类
- 4.5. 将MEIZUAPPKEY与MEIZUAPPID替换为在魅族后台注册对应该应用 的AppKey/AppID
(1)导入极光的插件包的jar,将极光提供的libs包中的插件包(jpush-android-plugin-meizu-v3.x.x.jar)和魅族推送包(meizu-push-x.x.x.jar)添加到工程libs目录下。
注1: 极光集成魅族通道在 JPush Android SDK 3.0.6 添加。
注2: JPush Android SDK 3.2.0添加了魅族推送包,对应的魅族sdk版本为:meizu-push-3.8.1.jar
注3: JPush Android SDK 3.6.0更新了魅族推送包,对应的魅族sdk版本为:meizu-push-3.9.0.jar
(2) 修改minSdkVersion的值
注:魅族推送会强制将minSdkVersion修改为11。如果当前app使用的minSdkVersion的值小于11,则需要使用tools避免被强制覆盖。
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...
>
<uses‐sdk
android:minSdkVersion="9"
android:targetSdkVersion="21"
tools:overrideLibrary=" cn.jpush.android.thirdpush.meizu"/>
(3)配置魅族推送sdk所需要的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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" />
(4)配置魅族推送sdk所需要的必要组件
<service
android:name="com.meizu.cloud.pushsdk.NotificationService"
android:exported="true" />
<receiver
android:name="com.meizu.cloud.pushsdk.SystemReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.meizu.cloud.pushservice.action.PUSH_SERVICE_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
(5)配置JPush接受魅族sdk的消息接受类
<receiver android:name="cn.jpush.android.service.PluginMeizuPlatformsReceiver"> <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>
(6)将MEIZUAPPKEY与MEIZUAPPID替换为在魅族后台注册对应该应用的AppKey/AppID(不要遗漏前缀MZ-)
<meta‐data
android:name="MEIZU_APPKEY"
android:value="MZ‐您的应用对应的魅族的APPKEY"/>
<meta‐data
android:name="MEIZU_APPID"
android:value="MZ‐您的应用对应的魅族的APPID"/>
(7)对于同一个应用集成了多个推送SDK,且其他SDK也使用了魅族通道的用户:
可以将这个极光内置的Receiver,换成自己定义的Receiver。
这个Receiver必须继承魅族的com.meizu.cloud.pushsdk.MzPushMessageReceiver
且在每个回调方法,都回调给极光的PluginMeizuPlatformsReceiver。类似于这样:
public class MyMZPushReceiver extends MzPushMessageReceiver {
final PluginMeizuPlatformsReceiver receiver = new PluginMeizuPlatformsReceiver();
@Override
public void onReceive(Context context, Intent intent) {
receiver.onReceive(context, intent);
}
@Override
public void onRegister(Context context, String s) {
receiver.onRegister(context, s);
}
@Override
public void onMessage(Context context, String s) {
receiver.onMessage(context, s);
}
@Override
public void onNotificationArrived(Context context, MzPushMessage mzPushMessage) {
receiver.onNotificationArrived(context, mzPushMessage);
}
@Override
public void onNotificationClicked(Context context, MzPushMessage mzPushMessage) {
receiver.onNotificationClicked(context, mzPushMessage);
}
@Override
public void onUnRegister(Context context, boolean b) {
receiver.onUnRegister(context, b);
}
@Override
public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) {
receiver.onPushStatus(context, pushSwitchStatus);
}
@Override
public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
receiver.onRegisterStatus(context, registerStatus);
}
@Override
public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) {
receiver.onUnRegisterStatus(context, unRegisterStatus);
}
@Override
public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) {
receiver.onSubTagsStatus(context, subTagsStatus);
}
@Override
public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) {
receiver.onSubAliasStatus(context, subAliasStatus);
}
@Override
public void onUpdateNotificationBuilder(PushNotificationBuilder pushNotificationBuilder) {
receiver.onUpdateNotificationBuilder(pushNotificationBuilder);
}
}
3、配置魅族通知栏小图标
通过MzPushSDK接收的通知,可设置其通知栏icon,方法如下:
在应用的工程目录res/drawable-xxxx/几个文件夹中添加对应不同分辨率的通知栏icon图标,文件名 为mz_push_notification_small_icon。如果文件名错误,将无法正确显示该应用的状态栏图 标。魅族手机状态栏icon规范请参考魅族 PushSDKDemo中的图片文件。
注:如果没有放入符合规范的icon文件,会默认使用应用图标作为通知icon。而应用图标不符合魅族的通知栏icon设计规范的话,则会导 致通知栏图标无法正确显示。
4、通知内容长度兼容
由于魅族官方的通知内容长度限制为100个字符以内(中英文都算一个),当通知内容(极光的“alert”字段的值)长度超过 100时,魅族通道会推送失败。此时调用极光api推送通知时,请在payload 中的 "notification" 的 "android" 节点的"extras"节点添 加以下字段: 功能说明
由于魅族官方的通知内容长度限制为100个字符以内(中英文都算一个),当通知内容(极光的“alert”字段的值)长度超过 100时,魅族通道会推送失败。此时调用极光api推送通知时,请在payload 中的 "notification" 的 "android" 节点的"extras"节点添 加以下字段:
| Key | 类型 | 示例 | 说明 |
| mzpns_content_forshort | String | "short content" | 通知内容(极光的“alert”字段)长度超过100个字时,请在此字段的值传入不超过100个字的通知内容。 |
json示例代码:
{
"platform":[
"android"
],
"audience":"all",
"notification":{
"android":{
"alert":"在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。如今一些手机......(省略若干字)......组件即可",
"title":"概述",
"extras":{
"mzpns_content_forshort":"在国内Android系统上推送严重依赖于应用进程的存活状态。"
}
}
}
}
5、MeizuPush SDK的编译混淆问题
如果使用了 proguard,需要在配置文件中加入,可以防止一个误报的 warning 导致无法成功编译
-dontwarn com.meizu.cloud.**
-keep class com.meizu.cloud.** { *; }
6、集成结果判断
成功
JPush集成成功,魅族sdk打印日志:
E/AbstractMessageHandler(12917):currentHandlermessageBasicPushStatus{code='200',message=''}pushId='0XC715
16b727f6c0377570f645c0c415c627857667072',Becomeinvalidafter604800seconds}
或者
E/AbstractMessageHandler(12917):currentHandlermessageBasicPushStatus{code='200',message='alreadyregisterP
ushId,dontregisterfrequently'}pushId='J04760350615d6364567a7a447f0d0f7b017f055d6759',Becomeinvalidafter60
3767seconds}
失败
MEIZU_APPKEY、MEIZU_APPID非法,打印日志如下:
E/PushPlatformManager(10154):{"code":"1005","message":"参数错误,请参考API文档","value":"","redirect":""}
04‐ 2814:55:14.627:D/AndroidNetworking(10154):executiondone:ANRequest{sequenceNumber='1,mMethod=1,mPriority=M EDIUM,mRequestType=0,mUrl=https://api‐push.meizu.com/garcia/api/client/message/registerPush}
MEIZU_APPKEY、MEIZU_APPID不是同一个魅族应用,打印日志如下:
04‐2800:13:38.685:E/PushPlatformManager(32757):registerStatusBasicPushStatus{code='1006',message='签名认证 失败'}pushId='null',Becomeinvalidafter0seconds}
04‐2800:13:38.724:I/AbstractMessageHandler(32728):startRegisterStatusHandlermatch
04‐2800:13:38.724:E/AbstractMessageHandler(32728):currentmessageTypeMESSAGE_TYPE_PUSH_REGISTER_STATUS
7.集成错误码
| 名称 | ErrorCode | 错误原因 |
| UNKNOWN_ERROR | -1 | 未知错误 |
| SUCCESS | 200 | 成功 |
| SYSTEM_ERROR | 1001 | 系统错误 |
| SYSTEM_BUSY | 1003 | 服务器忙 |
| PARAMETER_ERROR | 1005 | 参数错误,请参考API文档 |
| INVALID_SIGN | 1006 | 签名认证失败 |
| INVALID_APPLICATION_ID | 110000 | appId不合法 |
| INVALID_APPLICATION_KEY | 110001 | appKey不合法 |
| UNSUBSCRIBE_PUSHID | 110002 | pushId未注册 |
| INVALID_PUSHID | 110003 | pushId非法 |
| PARAM_BLANK | 110004 | 参数不能为空 |
| APP_IN_BLACK_LIST | 110009 | 应用被加入黑名单 |
| APP_REQUEST_EXCEED_LIMIT | 110010 | 应用请求频率过快 |
| APP_PUSH_TIME_EXCEED_LIMIT | 110051 | 超过该应用的次数限制 |
| APP_REQUEST_PUSH_LIMIT | 110019 | 超过该应用每天推送次数限制 |
| INVALID_APPLICATION_PACKAGENAME | 110031 | packageName不合法 |
| INVALID_TASK_ID | 110032 | 非法的taskId |
| INVALID_APPLICATION_SECRET | 110033 | 非法的appSecret |
8、魅族厂商通道测试方法
1. 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写魅族相关参数,保存后启用;

3. 将集成好的App(测试版本)安装在测试机(需要运行 Flyme版本 5.1.11.1及以上的手机)上,并且运行App;
4. 保持App在前台运行,尝试对设备进行推送;
5. 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
6. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。
FCM集成指南
1、手动配置集成步骤
主要步骤为:
- 1. 添加 FCM SDK 到项目中
- 2. 修改 minSdkVersion 的值
- 3. 配置 JPush 接收 FCM SDK 消息的服务类
- 4. 设置通知图标
(1)导入极光的 FCM插件包的jar,将极光提供的libs包中的插件包(jpush-android-plugin-fcm-v3.x.x.jar)添加到工程libs目录下。
(2)在 Firebase 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 google-services.json 配置文件并添加到应用的 module 目录下。
(3)在android studio 的 Project 根目录的主 gradle 中配置使用jcenter(新建的project默认已配置),具体如下:
buildscript {
repositories {
jcenter()
}
......
}
allprojets {
repositories {
jcenter()
}
}
(4)在根级 build.gradle 中添加规则,以纳入 Google 服务插件 和 Google 的 Maven 代码库,可根据 Firebase 发布的版本更新选择最新版本:
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.2.0'
}
}
allprojets {
repositories {
maven {
url "https://maven.google.com"
}
}
}
(5)在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件:
apply plugin: 'com.google.gms.google-services'
(6)在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 Firebase 发布的版本更新选择最新版本:
dependencies {
implementation 'com.google.firebase:firebase-core:17.0.0'
implementation 'com.google.firebase:firebase-messaging:20.0.0'
}
注1:极光集成 FCM 通道在 JPush Android SDK 3.1.0 添加。
注2:极光JPush Android SDK 3.6.4,对应 FCM 通道版本:messaging版本为20.0.0,firebase-core 版本为17.0.0。
注3: 添加 FCM SDK 的官方文档(https://firebase.google.com/docs/android/setup?authuser=0)
注4:编译时如果遇到类似如下错误,拉取FCM依赖失败,请在 Android Studio->SDK Manager->SDK Tools 中将 Google Play Services 和 Google Repository 更新到最新版本后再试。
Failed to resolve: com.google.firebase:firebase-core:x.x.x Error:(36, 13) Failed to resolve: com.google.firebase:firebase-messaging:x.x.x
(7)FCM 推送会强制将 minSdkVersion 修改为 14。如果当前 app 使用的 minSdkVersion 的值小于14,则需要使用 tools 避免被强制覆盖。
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" ... >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21"
tools:overrideLibrary=" com.google.android.gms.common.license,
com.google.android.gms.tasks.license,
com.google.firebase.firebase.common.license,
com.google.firebase.firebase.iid.license,
com.google.firebase.firebase.messaging.license,
com.google.firebase.measurement.impl.license,
com.google.firebase.measurement.license,
com.google.firebase.firebase_core,
com.google.firebase.measurement,
com.google.firebase.firebase_common,
com.google.firebase.messaging,
com.google.firebase.iid,
com.google.android.gms,
com.google.android.gms.tasks,
com.google.firebase.iid.internal,
com.google.firebase.analytics.connector,
com.google.android.gms.stats,
com.google.android.gms.common,
com.google.android.gms.measurement.api,
com.google.android.gms.ads_identifier,
com.google.android.gms.measurement_base,
com.google.firebase.analytics.connector.impl,
android.support.v4,
android.support.compat,
android.arch.lifecycle,
android.support.mediacompat,
android.support.coreutils,
android.support.coreui,
android.support.fragment,
com.google.firebase.measurement_impl"/>
(8)配置JPush接收的FCM SDK的消息服务类
```
<service android:name="cn.jpush.android.service.PluginFCMMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
(9)在 AndroidManifest.xml 中增加如下配置来设置 FCM 通知图标。
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/您要配置的通知图标" />
2、点击通知跳转 Activity(OPPO和FCM均适用)
- 功能说明
OPPO/FCM 允许开发者在推送通知的时候传入自定义的 intent action 字符串,当用户点击了该通知,系统会根据 action 的值过滤出匹配的 Activity ,并打开 Activity,获取推送内容。
服务端使用方式
- Push API 推送说明
在 push api 的 payload 中的 "notification" 的 "android" 节点下添加以下字段:
| 关键字 | 类型 | 示例 | 说明 | |
| uri_action | string | "com.HuananThirdPush.cn.OpenClickActivity" | 该字段用于指定开发者想要打开的 activity。值为该activity下您配置的特殊action name | |
请求json如下:
{
"platform": [
"android"
],
"audience": "all",
"notification": {
"android": {
"alert": "在线alert003",
"title": "在线title003",
"uri_action": "com.HuananThirdPush.cn.OpenClickActivity"
}
},
"message": {
"msg_content": "自定义消息内容003"
}
}
极光提供服务端JAVASDK,下载地址GitHub - jpush/jpush-api-java-client: JiGuang's officially supported Java client library for accessing JPush APIs. 极光官方支持的 Java 版本服务器端 SDK。,内含有example样例。可以拉取最新的代码自行打包,也可以直接使用libs文件夹下的jar。
示例代码如下:
注: addCustom("uri_activity","xxx")方法传递的参数在非华为/VIVO/小米机型上做无效处理;addCustom("uri_action","xxx")方法传递的参数在非OPPO/FCM机型上做无效处理
public static PushPayload buildPushObject_CustomField() {
Notification notification = Notification.newBuilder()
.addPlatformNotification(AndroidNotification.newBuilder()
.setAlert(ALERT)
.setTitle("Alert test")
.setLargeIcon("http://www.jiguang.cn/largeIcon.jpg")
.addCustom("uri_activity", "com.HuananThirdPush.cn.OpenClickActivity")
.addCustom("uri_flag", "uri_flag")
.addCustom("uri_action", "com.HuananThirdPush.cn.OpenClickActivity")
.build())
.build();
PushPayload.Builder payloadBuilder = new PushPayload.Builder()
.setPlatform(Platform.all())
.setAudience(Audience.all())
.setNotification(notification);
return payloadBuilder.build();
}
Android端配置步骤
(1)在 AndroidManifest.xml 中配置点击通知要打开的 activity
<activity android:name="您配置的activity"
android:exported="true">
<intent-filter>
<action android:name="您配置的特殊action"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
(2)取通知相关信息
在您配置的 activity 中的onCreate方法中进行处理,获取通知信息。
华为通过getIntent().getData(),小米/vivo/oppo/vivo/FCM通过 getIntent().getExtras().getString("JMessageExtra")取到Intent的数据。获取到的数据是JSON字符串,通过解析可以获得通知相关内容。
JSON 示例如下:
{
"msg_id": "123456",
"n_content": "this is content",
"n_extras": {
"key1": "value1",
"key2": "value2"
},
"n_title": "this is title",
"rom_type": 0
}
JSON 内容字段说明:
| 字段 | 取值类型 | 描述 | |
| msg_id | String | 通过此key获取到通知的msgid | |
| n_title | String | 通过此key获取到通知标题 | |
| n_content | String | 通过此key获取到通知内容 | |
| n_extras | String | 通过此key获取到通知附加字段 | |
| rom_type | byte | 通过此key获取到下发通知的平台。得到值说明:byte类型的整数,0为极光,1为小米,2为华为,3为魅族,4为OPPO,5为vivo,8为FCM。 |
注: rom_type 用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值。
通知点击上报
解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下:注: 点击上报必须传入正确的 whichPushSDK 参数,否则会造成统计数据错误。
/** * context 上下文 * msgId 消息ID * whichPushSDK 收到推送的平台,即 rom_type 字段的取值。 **/ JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);
富媒体调整
为 PushActivity 增加 <action android:name="cn.jpush.android.ui.PushActivity" />。
为 PopWinActivity 增加 <action android:name="cn.jpush.android.ui.PopWinActivity" />。
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="您的应用的包名" />
</intent-filter>
</activity>
<activity
android:name="cn.jpush.android.ui.PopWinActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@style/MyDialogStyle">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="您的应用的包名" />
<action android:name="cn.jpush.android.ui.PopWinActivity"/>
</intent-filter>
</activity>
Activity 示例代码
(华为/小米/oppo/vivo/FCM厂商均适用,魅族与基础的走极光通道的通知获取方法一致)
package com.HuananThirdPush.cn;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import cn.jpush.android.api.JPushInterface;
public class OpenClickActivity extends Activity {
private static final String TAG = "OpenClickActivity";
/**消息Id**/
private static final String KEY_MSGID = "msg_id";
/**该通知的下发通道**/
private static final String KEY_WHICH_PUSH_SDK = "rom_type";
/**通知标题**/
private static final String KEY_TITLE = "n_title";
/**通知内容**/
private static final String KEY_CONTENT = "n_content";
/**通知附加字段**/
private static final String KEY_EXTRAS = "n_extras";
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = new TextView(this);
setContentView(mTextView);
handleOpenClick();
}
/**
* 处理点击事件,当前启动配置的Activity都是使用
* Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
* 方式启动,只需要在onCreat中调用此方法进行处理
*/
private void handleOpenClick() {
Log.d(TAG, "用户点击打开了通知");
String data = null;
//获取华为平台附带的jpush信息
if (getIntent().getData() != null) {
data = getIntent().getData().toString();
}
//获取fcm/oppo/小米/vivo 平台附带的jpush信息
if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
data = getIntent().getExtras().getString("JMessageExtra");
}
Log.w(TAG, "msg content is " + String.valueOf(data));
if (TextUtils.isEmpty(data)) return;
try {
JSONObject jsonObject = new JSONObject(data);
String msgId = jsonObject.optString(KEY_MSGID);
byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
String title = jsonObject.optString(KEY_TITLE);
String content = jsonObject.optString(KEY_CONTENT);
String extras = jsonObject.optString(KEY_EXTRAS);
StringBuilder sb = new StringBuilder();
sb.append("msgId:");
sb.append(String.valueOf(msgId));
sb.append("\n");
sb.append("title:");
sb.append(String.valueOf(title));
sb.append("\n");
sb.append("content:");
sb.append(String.valueOf(content));
sb.append("\n");
sb.append("extras:");
sb.append(String.valueOf(extras));
sb.append("\n");
sb.append("platform:");
sb.append(getPushSDKName(whichPushSDK));
mTextView.setText(sb.toString());
//上报点击事件
JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
} catch (JSONException e) {
Log.w(TAG, "parse notification error");
}
}
private String getPushSDKName(byte whichPushSDK) {
String name;
switch (whichPushSDK) {
case 0:
name = "jpush";
break;
case 1:
name = "xiaomi";
break;
case 2:
name = "huawei";
break;
case 3:
name = "meizu";
break;
case 4:
name = "oppo";
break;
case 5:
name = "vivo";
break;
case 8:
name = "fcm";
break;
default:
name = "jpush";
}
return name;
}
}
3、集成成功的标志
D/JIGUANG-JPush: [FCMPushHelper] fcm token is eFPX0mIDzvs:APA91bGUAn6jCSVgT1Y83DP-2Fh_OM2cnqUIecNhUCLyUc3WAV4CalTQCvfTnJmOi900QByUiMQLdEkvi3UklY9g8X6vGLA4G9n0lpymDtTwVnAVh0LUJjdPBlfmSBc85AXhLg2e8BUu
D/JIGUANG-JPush: [ThirdPushManager] doAction,action:action_register_token,bundle:Bundle[{token=eFPX0mIDzvs:APA91bGUAn6jCSVgT1Y83DP-2Fh_OM2cnqUIecNhUCLyUc3WAV4CalTQCvfTnJmOi900QByUiMQLdEkvi3UklY9g8X6vGLA4G9n0lpymDtTwVnAVh0LUJjdPBlfmSBc85AXhLg2e8BUu, platform=8}]
I/JIGUANG-JPush: [ThirdPushManager] uploadRegID regid:eFPX0mIDzvs:APA91bGUAn6jCSVgT1Y83DP-2Fh_OM2cnqUIecNhUCLyUc3WAV4CalTQCvfTnJmOi900QByUiMQLdEkvi3UklY9g8X6vGLA4G9n0lpymDtTwVnAVh0LUJjdPBlfmSBc85AXhLg2e8BUu
上报到极光服务器成功的标志,如果没有以下上报日志,需要检查下集成代码
[PluginPlatformRidUpdate] onUpdateRidSuccess rid:2 ,pluginPlatformRegIDBean:PluginPlatformRegIDBean{pluginPlatformType=8, regid='cn5o2732Qo2bF7HuMimHPO:APA91bEYkKNcxkZjli-LSelq7o0ldXAOXd7iGcTFLQ_pQw-7liV2gc1BwWdpGq_J5VisKGTa_S7PyM8CpPn0kk39JQo87w1_eXZxPT0lOysBkDbqQw-5NXnK86SN9GLLg15QhHu34H0l', rid=2, retryCount=0}
4、FCM 测试方法
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
- 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写FCM相关参数,保存后启用;

- 将技术支持所给的debug版本的jcore替换掉项目中的版本,然后在极光初始化之后加上如下代码:
设置country需要在init之后设置,即在application的oncreate中:
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
JCoreInterface.testCountryCode("us");
- 将集成好的App(测试版本)安装在测试机(需要GooglePlay服务为系统服务且版本不低于17.3.4)上,然后翻墙,并且运行App;
- 保持App在前台运行,尝试对设备进行推送;
- 如果应用收到消息,将App退到后台(进入省电模式,或后台驻留),强行停止应用可能收不到;
- 再次进行推送,如果能够收到推送,则表明FCM通道集成成功。
OPPO集成指南
1、使用JCenter自动化集成步骤
确认androidstudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持)。
buildscript{
repositories{
jcenter()
}
}
allprojects{
repositories{
jcenter()
}
}
在应用module的gradle中dependencies节点添加如下代码:
dependencies{
implementation 'cn.jiguang.sdk.plugin:oppo:3.8.5'
// JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
}
在应用module的gradle中defaultConfig节点添加如下代码(不要遗漏前缀OP-):
manifestPlaceholders=[
JPUSH_PKGNAME:"您应用的包名",
//设置manifest.xml中的变量
OPPO_APPKEY : "OP-您的应用对应OPPO的APPKEY", // OPPO平台注册的appkey
OPPO_APPID : "OP-您的应用对应OPPO的APPID", // OPPO平台注册的appid
OPPO_APPSECRET: "OP-您的应用对应OPPO的APPSECRET",//OPPO平台注册的appsecret
]
2、配置AndroidManifest.xml集成步骤
注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上步骤,您可以跳过本段)
手动集成主要步骤为:
- 1. 增加OPPO插件包及OPPO推送包
- 2. 配置OPPO推送sdk所需要的权限
- 3. 配置OPPO必须的组件
- 4. 将OPPO_APPKEY、OPPO_APPID、OPPO_APPSECRET 替换为在OPPO后台注册对应该应用的AppKey/AppID/APPSecret
(1)导入极光的插件包以及OPPO的SDK的jar
将极光提供的libs包中的jpush-android-plugin-oppo-v3.x.x.jar( JPush 插件包)及mcssdk-x.x.x.jar (OPPO推送包)导入到工程libs/目录下。
注1:极光集成 OPPO 通道在 JPush Android SDK 3.1.5 添加。
注2:oppo推送包,在JPush 3.4.0之前为:com.coloros.mcssdk.jar。JPush 3.4.0适配OPPO SDK的升级,对应OPPO SDK更新为:mcssdk-2.0.2.jar。
注3:JPush 3.3.9版本的JPush可仅更新3.4.0的OPPO插件包即可,无需升级为JPush3.4.0。
注4:OPPO推送包 v2.1.0 版本升级为 com.heytap.msp-push-2.1.0.aar,Jpush v3.6.8 开始支持,与之前版本不兼容
注5:OPPO推送包 v2.1.0 只支持 Android 4.4 或以上版本的手机系统,minsdk 至少要求 19
(2)配置OPPO推送所需要的权限
<uses-permission android:name="com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE"/>
<uses-permission android:name="com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE"/>
(3)配置OPPO 推送的必须的组件
<!-- since JPushv3.6.8 ,oppov2.1.0 oppo 核心功能-->
<service android:name="cn.jpush.android.service.PluginOppoPushService"
android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
<intent-filter>
<action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
</intent-filter>
</service>
<!-- since JPushv3.6.8 ,oppov2.1.0 oppo 核心功能-->
<service
android:name="com.heytap.msp.push.service.DataMessageCallbackService"
android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE">
<intent-filter>
<action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE"/>
<action android:name="com.heytap.msp.push.RECEIVE_MCS_MESSAGE"/>
</intent-filter>
</service> <!--兼容Q版本-->
(4)配置OPPO 推送的相关参数(不要遗漏前缀OP-)
<meta-data android:name="OPPO_APPKEY"
android:value="OP-您的应用对应的OPPO的APPKEY" />
<meta-data android:name="OPPO_APPID"
android:value="OP-您的应用对应的OPPO的APPID" />
<meta-data android:name="OPPO_APPSECRET"
android:value="OP-您的应用对应的OPPO的APPSECRET" />
(5)在工程的build.gradle文件中添加如下配置代码
dependencies {
...
implementation fileTree(include: ['*.jar'], dir: 'libs')
...
implementation(name: 'com.heytap.msp-push-2.1.0', ext: 'aar')
...
}
android {
...
repositories {
flatDir {
dirs 'libs'
}
}
}
3、OPPO SDK的编译混淆问题
如果使用了proguard,需要在配置文件中加入,可以防止一个误报的warning导致无法成功
-dontwarn com.coloros.mcsdk.**
-keep class com.coloros.mcsdk.** { *; }
-dontwarn com.heytap.**
-keep class com.heytap.** { *; }
-dontwarn com.mcs.**
-keep class com.mcs.** { *; }
4、通知内容长度兼容
- 功能说明
由于 OPPO 官方的通知内容长度限制为200个字数以内(中英文都算一个),当通知内容(极光的“alert”字段的值)长度超过200字,OPPO 通道会推送失败。此时调用极光api推送通知,请在payload 中的 "notification" 的 "android" 节点的"extras"节点添加以下字段:
| Key | 类型 | 示例 | 说明 |
| oppns_content_forshort | String | "short content" | 通知内容(极光的“alert”字段)长度超过200个字时,请在此字段的值传入不超过200个字的通知内容。 |
json示例代码:
{
"platform": [
"android"
],
"audience": "all",
"notification": {
"android": {
"alert": "在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。如今一些手机厂家会在自家 rom 中做系统级别的推送通道,再由系统分发给各个 app,以此提高在自家 rom 上的推送送达率。JPush SDK 为了尽可能提高开发者在各类 rom 上的推送送达率,对使用 ColorOS 的设备推送,自动切换到OPPO通道。同时,为了保证 SDK 的易用性,原本 JPush 的所有接口调用逻辑都不用修改,JPush 会对自身支持的功能做兼容.只需在manifest中配置上 OPPO SDK 必须的配置组件即可.",
"title": "概述",
"uri_activity": "com.HuananThirdPush.cn.OpenClickActivity",
"extras": {
"oppns_content_forshort": "在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。"
}
}
},
"message": {
"msg_content": "自定义消息内容003"
}
}
5、点击通知跳转到指定Activity
(见FCM集成指南第2点)
6、集成结果判断
成功
JPush集成OPPO sdk成功 打印日志:
D/JIGUANG-JPush: [PluginOppoPushService] processMessage type:4105,messageID:0,taskID:null,appPackage:xxxxxxx,registerID:null,sdkVersion:null,command:12289,responseCode:0,content:CN_7a4511397d4b453e19abf6f0ada40c99 [OPushCallback] OPush registerID is CN_7a4511397d4b453e19abf6f0ada40c99
7、OPPO厂商通道测试方法
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
- 联系极光技术支持确认已在极光的后台配置好了相关的应用信息。如果开通成功了再进行下一个步骤;

- 将集成好的App(测试版本)安装在测试机(需要运行 ColorOS版本 3.1及以上的手机)上,并且运行App
- 保持App在前台运行,尝试对设备进行推送;
- 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
- 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。
vivo集成指南
1、使用JCenter自动化集成步骤
确认androidstudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持)
buildscript{
repositories{
jcenter()
}
}
allprojects{
repositories{
jcenter()
}
}
在应用module的gradle中dependencies节点添加如下码:
dependencies{
implementation 'cn.jiguang.sdk.plugin:vivo:3.8.5'
// JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
}
在应用 module 的 gradle 中 defaultConfig 节点添加如下代码:
manifestPlaceholders=
JPUSH_PKGNAME:"您的应用包名",
//设置manifest.xml中的变量
VIVO_APPKEY : "您应用对应的vivo AppKey", // VIVO平台注册的appkey
VIVO_APPID : "您应用对应的 vivo AppID", // VIVO平台注册的appid
]
2、配置AndroidManifest.xml集成步骤
注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上步骤,您可以跳过本段)
手动配置主要步骤为:
- 1. 增加VIVO插件包及VIVO推送包
- 2. 配置VIVO必须的组件
- 3. 将VIVO_APPKEY、VIVO_APPID 替换为在VIVO后台注册对应该应用的AppKey/AppID
导入极光的插件包以及vivo的SDK的jar
(1)将极光提供的libs包中的jpush-android-plugin-vivo-v3.x.x.jar (JPush插件包)及pushsdk_v2.x.x.jar (vivo推送包)导入到工程libs/目录下。
注1:极光集成 VIVO 通道在 JPush Android SDK 3.2.0 添加,vivo sdk版本为:pushsdk_v2.3.1.jar。
注2:JPush Android SDK 3.5.8 更新vivo sdk版本为:push_sdk_v2.9.0.jar。
(2)配置vivo 推送的必须的组件
<receiver android:name="cn.jpush.android.service.PluginVivoMessageReceiver">
<intent-filter>
<!-- 接收push 消息 -->
<action android:name="com.vivo.pushclient.action.RECEIVE" />
</intent-filter>
</receiver>
<service
android:name="com.vivo.push.sdk.service.CommandClientService"
android:exported="true" />
<activity
android:name="com.vivo.push.sdk.LinkProxyClientActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
(3)配置vivo 推送的相关参数
<meta-data android:name="com.vivo.push.api_key"
android:value="您应用对应的vivo的AppKey" />
<meta-data android:name="com.vivo.push.app_id"
android:value="您应用对应的vivo的AppID" />
3.vivo SDK的编译混淆问题
若需要混淆 app,请在混淆文件中添加以下说明,防止 SDK 内容被二次混淆.
-dontwarn com.vivo.push.**
-keep class com.vivo.push.**{*; }
-keep class com.vivo.vms.**{*; }
4.点击通知跳转到指定Activity
(见小米集成指南第4点)
5.集成结果判断
成功
JPush集成vivo sdk成功 打印日志:
I/JIGUANG-JPush: [PluginPlatformRidUpdate] onUpdateRidSuccess rid:18263
,pluginPlatformRegIDBean:PluginPlatformRegIDBean{pluginPlatformType=5,
regid='15480619114881085348378', rid=18263, retryCount=0}
6、vivo厂商通道测试方法
1. 在您的App中集成极光3.3.4及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图填写魅族相关参数,保存后启用;

3. 将集成好的App(测试版本)安装在测试机(需要支持vivo推送的设备)上,并且运行App;
4. 保持App在前台运行,尝试对设备进行推送;
5. 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
6. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。



















