需要先在根目录下添加华为后台配置好的JSON文件
具体JSON配置看官方文档https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started#h1-1577930217114

![]()
//厂商通道
implementation 'cn.jiguang.sdk.plugin:vivo:3.6.0'
implementation 'cn.jiguang.sdk.plugin:xiaomi:3.6.0'
implementation 'cn.jiguang.sdk.plugin:huawei:3.6.0'
implementation 'cn.jiguang.sdk.plugin:meizu:3.6.0'
implementation 'cn.jiguang.sdk.plugin:oppo:3.6.0'
implementation 'com.huawei.hms:push:4.0.2.300'
implementation 'com.huawei.agconnect:agconnect-core:1.2.1.301'
// 极光核心组件
implementation 'cn.jiguang.sdk:jpush:3.6.0'
implementation 'cn.jiguang.sdk:jcore:2.3.4'
implementation 'com.huawei.hms:push:4.0.2.300' 要添加 否则一直报错找不到配置项


其他厂商通道也要相应的改变下,随着手机权限的提高,高版本是收不到open推送动作,需要我们自己设置自定义JPUSH动作
之前版本中我们都是接收open动作获取点击悬浮事件在传递,升级到高版本后都统一放到自定义JPUSH里
***示例:***
```
demo manifest配置:
<activity android:name="com.example.jpushdemo.OpenClickActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
请求json如下:
{
"platform": [
"android"
],
"audience": "all",
"notification": {
"android": {
"alert": "在线alert003",
"title": "在线title003",
"uri_activity": "com.example.jpushdemo.OpenClickActivity",
}
},
"message": {
"msg_content": "自定义消息内容003"
}
}
```
####SDK 端配置
##### 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().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 用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值。
##### 3.通知点击上报
解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下:
```
/**
* context 上下文
* msgId 消息ID
* whichPushSDK 收到推送的平台,即 rom_type 字段的取值。
**/
JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);
```
***注:*** 点击上报必须传入正确的 whichPushSDK 参数,否则会造成统计数据错误。
##### 4.Activity 示例代码
```
package com.example.jpushdemo;
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;
/**
* Created by jiguang on 17/7/5.
*/
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 6:
name = "asus";
break;
case 8:
name = "fcm";
break;
default:
name = "jpush";
}
return name;
}
}
本文详细介绍了在Android10上处理华为推送的问题,包括在根目录添加JSON配置文件,更新HMS Push SDK至4.0.2.300,以及如何处理高版本收不到open推送动作的问题。同时,文章提供了配置示例代码,解释了如何配置AndroidManifest.xml,解析通知内容,上报通知点击事件,以及处理不同厂商通道的通知。
1434

被折叠的 条评论
为什么被折叠?



