集成华为推送客户端笔记

折腾了一天总算集成并测通了, 根据官方文档来弄基本都可以测通,下面记录哈我遇到的一些问题的解决方法,以防以后忘掉。

写在前面

我所使用的IDE是AS3.1.4,按理来说我需要根据官方文档android studio的集成方式来弄就行,但是考虑到我后期需要作为一个独立模块来提供使用,所以我的集成方式是根据eclipse的方式来弄的。

1、下载SDK

这里我下了HMSAgent_2.6.3.301hmssdk-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模块的方法:

  1. 首先双击 GetHMSAgent_cn.bat 文件,根据提示操作就行(比较简单)
  2. 然后提取出来的文件会在同级目录下的copysre文件夹下,点击进去将com目录下的huawei文件拷贝到自己项目的com目录下,注意这里需要拷贝到com目录下否则会报错。
  3. 另外如果需要使用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值
在这里插入图片描述
手机端:
在这里插入图片描述
到这就完成了。如有不对的地方欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值