咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Android集成小米推送

一、 开通开发者

省略

二、 创建应用

省略,创建完应用,到“推送服务”开启你的应用推送服务。

三、 集成到Android项目

《Android客户端SDK集成指南》
小米的SDK集成还算简单,小米提供了一个简单的Demo,非常简单。

0. 引入jar包依赖

Android的SDK以jar形式提供,放到libs目录即可。

1. 推送服务需要的权限列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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.VIBRATE"/>

<permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" /> <!--这里com.xiaomi.mipushdemo改成app的包名-->

<uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" /><!--这里com.xiaomi.mipushdemo改成app的包名-->

2. 推送服务需要配置的service和receiver:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<service
android:name="com.xiaomi.push.service.XMPushService"
android:enabled="true"
android:process=":pushservice" />

<!--注:此service必须在3.0.1版本以后(包括3.0.1版本)加入-->
<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.mipush.sdk.PushMessageHandler"
android:enabled="true"
android:exported="true" />

<!--注:此service必须在2.2.5版本以后(包括2.2.5版本)加入-->
<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>

这里将XMPushService和PingReceiver定义在了pushservice进程中,您也可以配置其运行在任意进程。如果没有配置android:process这个属性,那么它们将运行在应用的主进程中。

2. 自定义一个BroadcastReceiver类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class MyMiPushMessageReceiver : PushMessageReceiver() {
/**
* 接收客户端向服务器发送注册命令后的响应结果
*/
override fun onReceiveRegisterResult(context: Context, message: MiPushCommandMessage) {
Log.i(TAG, "onReceiveRegisterResult is called. $message")

}


/**
* 透传消息
*/
override fun onReceivePassThroughMessage(context: Context, message: MiPushMessage) {
Log.v(TAG,"onReceivePassThroughMessage is called. $message")
}

/**
* 通知消息,
* 这个回调方法会在用户手动点击通知后触发
*/
override fun onNotificationMessageClicked(context: Context, message: MiPushMessage) {
Log.v(TAG,"onNotificationMessageClicked is called. $message")
}

/**
* 通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数
*/
override fun onNotificationMessageArrived(context: Context, message: MiPushMessage) {
Log.v(TAG,"onNotificationMessageArrived is called. $message")
}

/**
* 接收客户端向服务器发送命令后的响应结果
*/
override fun onCommandResult(context: Context, message: MiPushCommandMessage) {
Log.d(TAG, "onCommandResult is called. $message")
}
}
3. 将自定义的BroadcastReceiver注册到AndroidManifest.xml文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<receiver
android:exported="true"
android:name="com.xiaomi.mipushdemo.DemoMessageReceiver">
<!--这里com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定义的完整类名-->
<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>
4. 代码混淆
1
-keep class com.xiaomi.mipush.sdk.DemoMessageReceiver {*;}
5. 注册推送
1
2

MiPushClient.registerPush(this, APP_ID, APP_KEY);

注册成功在回调中有regid,可以根据regid推送给指定的设备。

四、 后台推送

小米有提供SDK,也有HTTP API,这里直接用API就可以。API的授权也是很简单,只需要应用的秘钥就行。

五、 预定义通知栏消息的点击行为

通过设置extra.notify_effect的值以得到不同的预定义点击行为。

  • “1″:通知栏点击后打开app的Launcher Activity。
  • “2″:通知栏点击后打开app的任一Activity(开发者还需要传入extra.intent_uri)。
  • “3″:通知栏点击后打开网页(开发者还需要传入extra.web_uri)。

extra.notify_effect为“2”时,可以定义extra.intent_uri,生成uri代码如下:

1
2
3
4
5
Intent intent = new Intent();
intent.setAction("com.xiaomi.mipushdemo.news");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.toUri(Intent.URI_INTENT_SCHEME);
结果:intent:#Intent;action=com.test.action.message;end

经过我的小米手机测试,无法打开此action。但如果定义extra.intent_uri为以下格式的Activity,是可以打开:

1
intent:#Intent;component=com.xiaomi.mipushdemo/.NewsActivity;end

只是设置的parentActivityName没有效果,打开NewsActivity点击返回就退出了,如果想退出NewsActivity进入主页则不行。

但还有一种方法可以实现,就是onNotificationMessageClicked函数,这个函数是点击通知栏消息的回调函数,如果没有被小米SDK处理掉的话,就会触发,我们就可以执行相关的代码。
如:

1
2
3
4
5
Intent intent = new Intent();
//这个标志位一定要加,否则无法启动(此处Context没有Activity栈)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(message.getExtra().get("intent_uri"));
context.startActivity(intent);

推送时,extra.notify_effect这个参数要删掉
intent_uri参数填:com.xiaomi.mipushdemo.news

这样就可以启动Action了,parentActivityName也是有效的。

六、 定制通知栏通知的图标

  1. 非MIUI中
  • 如果app中同时存在名为 mipush_notificationmipush_small_notification 的drawable文件,则使用mipush_notification的drawable作为通知的大图标,mipush_small_notification的drawable作为通知的小图标。
  • 如果app中只存在其中一个drawable文件,则使用该drawable作为通知的图标。
  • 如果app中不存在这两个drawable文件,则使用app的icon作为通知的图标。

注意:
mipush_notification 要求PNG/JPG/JPEG格式图片,尺寸120×120px,小于200KB。
mipush_small_notification 建议尺寸 60 x 60px。

  1. MIUI中:

通知栏图标统一显示为app的icon,不可以定制 (2021-07-22无语)。

MIUI经过了几次的修改,参考文章:《知乎》

  1. 推送消息时指定图标

从小米的推送调试工具来看,可以上传一个定制的icon,但这也太麻烦了。

总结:也就是说,目前通知栏的图标无法定制,不用折腾了(非MIUI根本不会用小米推送好吧?),当然app中可以提前适配定制,万一明天小米又改回来了呢?

七、 透传消息

小米的透传消息要求应用在后台常驻,则无法用来做离线推送。