云通訊 SDK在5.4.0之后開始支持小米推送。開發者需要根據小米官網文檔集成小米推送。 小米推送服務集成
登錄小米開發者網站,注冊app,申請AppId,AppKey。
AppId和AppKey是客戶端的身份標識,在客戶端SDK初始化時使用。然后下載安卓sdk并導入,小米sdk下載。
注冊完成后,需要在云通訊開發者后臺上傳推送證書,云通訊管理控制臺—>IM基礎功能配置—>推送證書,然后輸入你在小米開放后臺創建的應用的APPID、APPKey及包名。
(1) 小米推送服務SDK支持的最低安卓版本為2.2。
//如下 <uses-sdk android:minSdkVersion="8"/>
(2) 推送服務需要的權限列表。
//必選 <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"/> <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的包名
(3) 推送服務需要配置的service和receiver。
//小米 <service android:enabled="true" android:process=":pushservice" android:name="com.xiaomi.push.service.XMPushService"/> <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必須在3.0.1版本以后(包括3.0.1版本)加入 <service android:enabled="true" android:exported="true" android:name="com.xiaomi.mipush.sdk.PushMessageHandler" /> <service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" /> //注:此service必須在2.2.5版本以后(包括2.2.5版本)加入 <receiver android:exported="true" android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <receiver android:exported="false" android:process=":pushservice" android:name="com.xiaomi.push.service.receivers.PingReceiver" > <intent-filter> <action android:name="com.xiaomi.push.PING_TIMER" /> </intent-filter> </receiver>
備注:
這里將XMPushService和PingReceiver定義在了pushservice進程中,您也可以配置其運行在任意進程。如果沒有配置android:process這個屬性,那么它們將運行在應用的主進程中。要在調試程序時檢查AndroidManifest.xml是否符合上述配置,使用3.4.15所述的API:checkManifest(Context) 。
通過調用MiPushClient.registerPush來初始化小米推送服務。注冊成功后,您可以在自定義的onCommandResult和onReceiveRegisterResult中收到注冊結果,其中的regId即是當前設備上當前app的唯一標示。您可以將regId上傳到自己的服務器,方便向其發消息。
為了提高push的注冊率,你可以在Application的onCreate中初始化push。你也可以根據需要,在其他地方初始化push。代碼如下:
public class DemoApplication extends Application { public static final String APP_ID = "your appid"; public static final String APP_KEY = "your appkey"; public static final String TAG = "your packagename"; @Override public void onCreate() { super.onCreate();//初始化push推送服務 if(shouldInit()) { MiPushClient.registerPush(this, APP_ID, APP_KEY); } //打開Log LoggerInterface newLogger = new LoggerInterface() { @Override public void setTag(String tag) { // ignore } @Override public void log(String content, Throwable t) { Log.d(TAG, content, t); } @Override public void log(String content) { Log.d(TAG, content); } }; Logger.setLogger(this, newLogger); } private boolean shouldInit() { ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)); ListprocessInfos = am.getRunningAppProcesses(); String mainProcessName = getPackageName(); int myPid = Process.myPid(); for (RunningAppProcessInfo info : processInfos) { if (info.pid == myPid && mainProcessName.equals(info.processName)) { return true; } } return false; } }
為了接收消息,您需要自定義一個繼承自PushMessageReceiver類的BroadcastReceiver, 實現其中的onReceivePassThroughMessage,onNotificationMessageClicked,onNotificationMessageArrived, onCommandResult和onReceiveRegisterResult方法,然后把該receiver注冊到AndroidManifest.xml文件中。 onReceivePassThroughMessage用來接收服務器發送的透傳消息,onNotificationMessageClicked用來接收服務器發來的通知欄消息(用戶點擊通知欄時觸發), onNotificationMessageArrived用來接收服務器發來的通知欄消息(消息到達客戶端時觸發,并且可以接收應用在前臺時不彈出通知的通知消息), onCommandResult用來接收客戶端向服務器發送命令消息后返回的響應,onReceiveRegisterResult用來接受客戶端向服務器發送注冊命令消息后返回的響應。
例如:自定義的BroadcastReceiver
public class DemoMessageReceiver extends PushMessageReceiver { private String mRegId; private long mResultCode = -1; private String mReason; private String mCommand; private String mMessage; private String mTopic; private String mAlias; private String mUserAccount; private String mStartTime; private String mEndTime; @Override public void onReceivePassThroughMessage(Context context, MiPushMessage message) { mMessage = message.getContent(); if(!TextUtils.isEmpty(message.getTopic())) { mTopic=message.getTopic(); } else if(!TextUtils.isEmpty(message.getAlias())) { mAlias=message.getAlias(); } else if(!TextUtils.isEmpty(message.getUserAccount())) { mUserAccount=message.getUserAccount(); } } @Override public void onNotificationMessageClicked(Context context, MiPushMessage message) { mMessage = message.getContent(); if(!TextUtils.isEmpty(message.getTopic())) { mTopic=message.getTopic(); } else if(!TextUtils.isEmpty(message.getAlias())) { mAlias=message.getAlias(); } else if(!TextUtils.isEmpty(message.getUserAccount())) { mUserAccount=message.getUserAccount(); } } @Override public void onNotificationMessageArrived(Context context, MiPushMessage message) { mMessage = message.getContent(); if(!TextUtils.isEmpty(message.getTopic())) { mTopic=message.getTopic(); } else if(!TextUtils.isEmpty(message.getAlias())) { mAlias=message.getAlias(); } else if(!TextUtils.isEmpty(message.getUserAccount())) { mUserAccount=message.getUserAccount(); } } @Override public void onCommandResult(Context context, MiPushCommandMessage message) { String command = message.getCommand(); Listarguments = message.getCommandArguments(); String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null); String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null); if (MiPushClient.COMMAND_REGISTER.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mRegId = cmdArg1; } } else if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mAlias = cmdArg1; } } else if (MiPushClient.COMMAND_UNSET_ALIAS.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mAlias = cmdArg1; } } else if (MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mTopic = cmdArg1; } } else if (MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mTopic = cmdArg1; } } else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mStartTime = cmdArg1; mEndTime = cmdArg2; } } } @Override public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) { String command = message.getCommand(); List arguments = message.getCommandArguments(); String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null); String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null); if (MiPushClient.COMMAND_REGISTER.equals(command)) { if (message.getResultCode() == ErrorCode.SUCCESS) { mRegId = cmdArg1; } } } } 將自定義的BroadcastReceiver注冊到AndroidManifest.xml文件中 <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>
將獲取到的Token,上報云通訊SDK。在云通訊SDK初始化登錄成功之后調用。
//上報小米Token ECDevice.reportXiaoMiToken(token);
文檔更新時間:2017年9月21日