集成小米的推送其实很简单,小米官方的SDK上说明的也很清楚,我们只要一步一步来就没有一点问题:
下面是一些详细的集成步骤:
首先:你要从小米官方网站下载demo和SDK,把SDK的jar包引进项目内,以下为小米官方网站:
(在这之前你要做的是注册一个小米账号)
第二:在你的Application类里面,进行注册push服务
public class DomeApplication extends Application {
private static final String APP_ID = "你小米注册的ID";
private static final String APP_KEY = "你小米注册的KEY";
public static final String TAG = "TAG";
@Override
public void onCreate() {
super.onCreate();
// 注册push服务,注册成功后会向MessageReceiver发送广播
// 可以从MessageReceiver的onCommandResult方法中MiPushCommandMessage对象参数中获取注册信息
if (shouldInit()) {
MiPushClient.registerPush(this, APP_ID, APP_KEY);
}
}
//判断是否开启了APP
private boolean shouldInit() {
ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
List<RunningAppProcessInfo> processInfos = 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
/**
* @author ahai
* 接受推送消息处理的广播类
*/
public class MessageReceiver 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;
/**
* 透传消息到达客户端时调用
* 作用:可通过参数message从而获得透传消息,具体请看官方SDK文档
* @param context
* @param message
*/
@Override
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
mMessage = message.getContent();
Log.e(DogApplication.TAG,"onReceivePassThroughMessage:"+mMessage);
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();
}
}
/**
* 用户手动点击通知栏消息时调用
* 注:应用在前台时不弹出通知的通知消息到达客户端时也会回调函数
* 作用:1. 通过参数message从而获得通知消息,2. 设置用户点击消息后打开应用 or 网页 or 其他页面
* @param context
* @param message
*/
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
mMessage = message.getContent();
Log.e(DogApplication.TAG,"onNotificationMessageClicked:"+mMessage);
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();
}
}
/**
* 通知消息到达客户端时调用
* 注:应用在前台时不弹出通知的通知消息到达客户端时也会回调函数
* 作用:通过参数message从而获得通知消息
* @param context
* @param message
*/
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
Log.e(DogApplication.TAG,"onNotificationMessageArrived:"+message.toString());
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();
Log.e(DogApplication.TAG,"onCommandResult:"+command);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
//打印信息便于测试注册成功与否
Log.e(DogApplication.TAG,"注册成功");
} else {
Log.e(DogApplication.TAG,"注册失败");
}
}
List<String> 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;
}
} 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;
}
}
}
/**
*用于接收客户端向服务器发送注册命令后的响应结果
* @param context
* @param message
*/
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
String command = message.getCommand();
Log.e(DogApplication.TAG,"onReceiveRegisterResult:"+command);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
//打印日志:注册成功
Log.e(DogApplication.TAG,"注册成功");
} else {
//打印日志:注册失败
Log.e(DogApplication.TAG,"注册失败");
}
} else {
Log.e(DogApplication.TAG,"其他情况:"+message.getReason());
}
List<String> 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;
}
}
}
@Override
public void onRequirePermissions(Context context, String[] permissions) {
super.onRequirePermissions(context, permissions);
Log.e(DogApplication.TAG,"onRequirePermissions");
if (Build.VERSION.SDK_INT >= 23 && context.getApplicationInfo().targetSdkVersion >= 23) {
Intent intent = new Intent();
intent.putExtra("permissions", permissions);
intent.setComponent(new ComponentName(context.getPackageName(), PermissionActivity.class.getCanonicalName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);
}
}
@SuppressLint("SimpleDateFormat")
private static String getSimpleDate() {
return new SimpleDateFormat("MM-dd hh:mm:ss").format(new Date());
}
public String arrayToString(String[] strings) {
String result = " ";
for (String str : strings) {
result = result + str + " ";
}
return result;
}
}
可以建立一个获取权限的类:
**
* @author ahai
* 获取权限的类
*/
public class PermissionActivity extends Activity{
private static final int PERMISSION_REQUEST = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= 23) {
Intent intent = getIntent();
String permissions[] = intent.getStringArrayExtra("permissions");
for (int i = 0; i < permissions.length; ++i) {
if (checkSelfPermission(permissions[i]) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(permissions, PERMISSION_REQUEST);
break;
}
}
}
}
@Override
public void onRequestPermissionsResult (int requestCode,
String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSION_REQUEST) {
boolean granted = false;
for (int i = 0; i < grantResults.length; ++i) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
granted = true;
}
}
if (granted) {
Log.w("PermissionActivity", "Permissions granted:");
//DemoApplication.reInitPush(this);
}
finish();
}
}
}
第四步:清单文件进行注册
<!-- *************************** 小米推送配置权限 *************************** -->
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="26" />
<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.GET_TASKS" />
<permission
android:name="你自己注册的包名.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="你自己注册的包名.permission.MIPUSH_RECEIVE" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- *************************** 小米推送配置权限 *************************** -->
<application
android:name="你自己的Application"
............
<!-- *************************** 小米具体推送配置 *************************** -->
<activity
android:name=".push.PermissionActivity"
android:label="" />
<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.push.service.XMPushService"
android:enabled="true"
android:process=":pushservice" />
<service
android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
android:enabled="true"
android:exported="true" />
<service
android:name="com.xiaomi.mipush.sdk.MessageHandleService"
android:enabled="true" />
<receiver
android:name="你自己注册的广播类名"
android:exported="true">
<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>
<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>
<!-- *************************** 小米具体推送配置 *************************** -->
</application>
最后:运行无错误下就可以在小米平台进行推送消息了