折腾了一天总算集成并测通了, 根据官方文档来弄基本都可以测通,下面记录哈我遇到的一些问题的解决方法,以防以后忘掉。
写在前面
我所使用的IDE是AS3.1.4,按理来说我需要根据官方文档android studio的集成方式来弄就行,但是考虑到我后期需要作为一个独立模块来提供使用,所以我的集成方式是根据eclipse的方式来弄的。
1、下载SDK
这里我下了HMSAgent_2.6.3.301 和 hmssdk-eclipse-2.6.3.301.zip,这两个包主要是提起我们所需要的模块、jar还有一些资源文件。
2、添加所需要的jar包和资源文件
hmssdk-eclipse-2.6.3.301.zip解压后:
由于只需要push模块,所以只需要HMSSdkPush和HMSSdkBass文件下的jar和资源就行,将它们libs目录下的jar和res下的资源文件拷贝到自己项目下就可以,其中value必须要拷,剩下的是其它语言的配置可以不用拷(values-zh-rCN 为中文)。
3、提起所需要的模块
HMSAgent_2.6.3.301下载并解压后有一大堆文件:
其中你必须看readme.txt文件,它主要介绍这些目录的作用,其中就有提到怎么提起自己所需要的模块。在hmsagents文件包括了支付模块、游戏模块、账户模块、push模块、公共模块和消息模块总六个模块,我只需要push模块。下面是提起push模块的方法:
- 首先双击 GetHMSAgent_cn.bat 文件,根据提示操作就行(比较简单)
- 然后提取出来的文件会在同级目录下的copysre文件夹下,点击进去将com目录下的huawei文件拷贝到自己项目的com目录下,注意这里需要拷贝到com目录下否则会报错。
- 另外如果需要使用jar,第一步已经把需要的class文件弄出来,只需在运行Buildcopysrc2jar.bat 文件,根据提示输入自己的SDK的android.jar文件所在的路径,回车执行即可,成功后同样会在copysrc目录下生成jar包(官方不推荐)。
到这这里算是都集成完了,下面就是些配置了。
4、配置manifest文件
这里就不多说了,直接上代码:
XXX 的地方为包名,需要替换成自己的包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XXX">
<!--HMS-SDK引导升级HMS功能,访问OTA服务器需要网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--HMS-SDK引导升级HMS功能,保存下载的升级包需要SD卡写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--检测网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--检测wifi状态-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--为了获取用户手机的IMEI,用来唯一的标识用户。-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--如果是安卓8.0,应用编译配置的targetSdkVersion>=26,请务必添加以下权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- 接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 ${PACKAGE_NAME} 要替换上您应用的包名 -->
<permission
android:name="XXX.permission.PROCESS_PUSH_MSG"
android:protectionLevel="signatureOrSystem"/>
<!--接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 ${PACKAGE_NAME} 要替换上您应用的包名 -->
<uses-permission android:name="XXX.permission.PROCESS_PUSH_MSG" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="appid=100563283">
</meta-data>
<activity
android:name="com.huawei.hms.activity.BridgeActivity"
android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
android:excludeFromRecents="true"
android:exported="false"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Translucent" >
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<activity
android:name="com.huawei.updatesdk.service.otaupdate.AppUpdateActivity"
android:configChanges="orientation|screenSize"
android:exported="false"
android:theme="@style/upsdkDlDialog" >
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent.NoTitleBar" />
</activity>
<activity
android:name="com.huawei.updatesdk.support.pm.PackageInstallerActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:theme="@style/upsdkDlDialog" >
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<provider
android:name="com.huawei.hms.update.provider.UpdateProvider"
android:authorities="xxx.xxx.xxx.hms.update.provider"
android:exported="false"
android:grantUriPermissions="true" >
</provider>
<!-- 应用下载服务 -->
<service android:name="com.huawei.updatesdk.service.deamon.download.DownloadService"
android:exported="false"/>
<!--接收Push消息(注册、透传消息、通知栏点击事件)广播-->
<receiver android:name=".HuaweiPushRevicerQB"
android:permission="XXX.permission.PROCESS_PUSH_MSG">
<intent-filter>
<!-- 必须,用于接收token -->
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<!-- 必须, 用于接收透传消息 -->
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
<action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY"/>
</intent-filter>
</receiver>
<!--get接收Push消息(点击通知栏或通知栏上的按钮后触发onEvent回调、查看push通道是否连接)广播-->
<receiver android:name=".HuaweiPushRevicerQBG">
<intent-filter>
<!-- 用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
<action android:name="com.huawei.android.push.intent.CLICK" />
<!-- 查看push通道是否连接, 不查看则不需要 -->
<action android:name="com.huawei.intent.action.PUSH_STATE"/>
</intent-filter>
</receiver>
<service
android:name="com.huawei.hms.support.api.push.service.HmsMsgService"
android:enabled="true"
android:exported="true"
android:process=":pushservice">
<intent-filter>
<action android:name="com.huawei.push.msg.NOTIFY_MSG" />
<action android:name="com.huawei.push.msg.PASSBY_MSG" />
</intent-filter>
</service>
<activity
android:name="com.huawei.android.hms.agent.common.HMSAgentActivity"
android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
android:excludeFromRecents="true"
android:exported="false"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Translucent" >
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<meta-data
android:name="com.huawei.hms.version"
android:value="2.6.1">
</meta-data>
</application>
</manifest>
其中 HuaweiPushRevicerQBG 类和 HuaweiPushRevicerQBG 类需要自己创建并继承 PushReceiver,因为后面需要监听发送的通知或者是 透传消息的广播。
5、初始化并连接
初始成功连接成功后就可以进行我们所需要的操作了,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context=getApplicationContext();
setContentView(R.layout.activity_main);
button=findViewById(R.id.getpushstart_btn);
button.setOnClickListener(this);
Boolean dg= HMSAgent.init(this); // 初始化
Log.d(TAG, "init: "+dg); //返回 true 说明初始化成功
HMSAgent.connect(this, new ConnectHandler() { // 连接
@Override
public void onConnect(int rst) {
Log.d(TAG, "connect: "+rst); // 返回 0 连接才算成功
}
});
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.getpushstart_btn:
getToken();
break;
}
}
/**
* 获取token
*/
private void getToken() {
HMSAgent.Push.getToken(new GetTokenHandler() {
@Override
public void onResult(int rst) {
Toast.makeText(context,rst+"个",Toast.LENGTH_SHORT).show();
Log.d(TAG, "getToken: "+rst);
}
});
}
注意:如果不使用release版的签名文件测试的话,这里一般都是连接不成功,会出现6003(指纹不匹配的问题)
。需要在app目录下配置build.gradle,配置内容如下:
android {
signingConfigs {
release {
keyAlias 'xxx' //别名
keyPassword 'xxxx' //key密码
storeFile file('E:/desktop/dd/huaweidemo/demo.jks') // jks路径
storePassword 'xxxx' //store密码
}
}
......
6、测试
首先需要了解一下:
务必读下官方文档:https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_faq_agent 。
发送消息分为两类,一类是发送通知,通知的样式开发者是没办法自定义的,另一类是透传消息,这个开发者可以自定义。
6.1获取token
首先 重写PushReceiver类onPushMsg、onPushState、onToken、onEvent方法,获取token在这里接收到后台发过来token。
//<!--接收Push消息(注册、透传消息、通知栏点击事件)广播-->
public class HuaweiPushRevicerQB extends PushReceiver {
private static final String TAG = "华为广播1";
/**
* 透传消息会执行这个方法
* @param context
* @param bytes 消息的内容
* @param s Token
*/
@Override
public void onPushMsg(Context context, byte[] bytes, String s) {
super.onPushMsg(context, bytes, s);
Charset charset = Charset.defaultCharset();
ByteBuffer buf = ByteBuffer.wrap(bytes);
CharBuffer cBuf = charset.decode(buf);;
Log.d(TAG, "onPushMsg: "+s+"---"+ cBuf.toString());
}
/**
* 连接状态的回调方法
* @param context
* @param b
*/
@Override
public void onPushState(Context context, boolean b) {
super.onPushState(context, b);
Log.d(TAG, "onPushState: ");
}
/**
* getToken获取token值
* @param context
* @param s
* @param bundle
*/
@Override
public void onToken(Context context, String s, Bundle bundle) {
super.onToken(context, s, bundle);
String belongId = bundle.getString("belongId");
Log.d(TAG, "token:"+s+",belongId:"+belongId);
}
@Override
public void onEvent(Context context, Event event, Bundle bundle) {
Log.d(TAG, "onEvent: ");
if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
int notifyId = bundle.getInt(BOUND_KEY.pushNotifyId, 0);
Log.i(TAG, "收到通知栏消息点击事件,notifyId:" + notifyId);
if (0 != notifyId) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notifyId);
}
}
String message = bundle.getString(BOUND_KEY.pushMsgKey);
super.onEvent(context, event, bundle);
}
}
写好接收广播后,就可以开始token请求了,执行HMSAgent.Push.getToken 返回0则说明请求成功,这时候HuaweiPushRevicerQB 就会收到广播并执行onToken,在onToken就能获取token值。
6.2发送消息
新增推送,消息类型选择通知,指定用户就是刚获取的token值
手机端:
到这就完成了。如有不对的地方欢迎指正。