android中关于实现小米消息推送

由于公司调研发现小米手机会屏蔽非小米推送的消息,且产品安卓用户主要使用小米设备,因此决定实施小米消息推送方案,以确保消息能推送到任意Android手机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     开题先说明写这个推送的原因,据公司调研,小米会屏蔽其它推送发送过来的消息,而我们产品的安卓端80%以上用户都是小米,因此公司决议做小米的消息推送,而且小米可以推送到任意一款android手机上。

先给一段代码,代码中有详细解释。
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 mStartTime;
	private String mEndTime;

	// 用来接收服务器向客户端发送的消息
	@Override
	public void onReceiveMessage(Context context, MiPushMessage message) {
		Log.v(DemoApplication.TAG,
				"onReceiveMessage is called. " + message.toString());
		mMessage = message.getContent();
		if (!TextUtils.isEmpty(message.getTopic())) {
			mTopic = message.getTopic();
		} else if (!TextUtils.isEmpty(message.getAlias())) {
			mAlias = message.getAlias();
		}
	}
	
	// 用来接收客户端向服务器发送命令消息后返回的响应
	@Override
	public void onCommandResult(Context context, MiPushCommandMessage message) {
		Log.v(DemoApplication.TAG,
				"onCommandResult is called. " + message.toString());
		String command = message.getCommand();
		List<String> arguments = message.getCommandArguments();
		if (arguments != null) {
			if (MiPushClient.COMMAND_REGISTER.equals(command)
					&& arguments.size() == 1) {
				mRegId = arguments.get(0);
			} else if ((MiPushClient.COMMAND_SET_ALIAS.equals(command) || MiPushClient.COMMAND_UNSET_ALIAS
					.equals(command)) && arguments.size() == 1) {
				mAlias = arguments.get(0);
			} else if ((MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command) || MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC
					.equals(command)) && arguments.size() == 1) {
				mTopic = arguments.get(0);
			} else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)
					&& arguments.size() == 2) {
				mStartTime = arguments.get(0);
				mEndTime = arguments.get(1);
			}

			// 设置别名alias   这个方法调用成功后会执行到onCommandResult方法,为了避免死循环执行,加了下面判断
			if (mAlias.equals(""))
				MiPushClient.setAlias(context, "shangqi", null);
			// 指定标签   其它同上
			// MiPushClient.subscribe(getApplicationContext(), "haokang", null);
		}
		mResultCode = message.getResultCode();
		mReason = message.getReason();

	}
以上是个广播

再来一段代码
public class DemoApplication extends Application {

	// user your appid the key.
	public static final String APP_ID = "2882303761517159864";
	// user your appid the key.
	public static final String APP_KEY = "5261715955864";

	// 此TAG在adb logcat中检索自己所需要的信息, 只需在命令行终端输入 adb logcat | grep
	// com.xiaomi.mipushdemo
	public static final String TAG = "com.xiaomi.mipushdemo";

	private static DemoHandler handler = null;

	@Override
	public void onCreate() {
		super.onCreate();

		// 小米推送
		Constants.useOfficial(); // 使用正式环境。
		// Constants.useSandbox(); // 使用测试环境。
		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);
		if (handler == null)
			handler = new DemoHandler(getApplicationContext());

		// 注册push服务,注册成功后会向DemoMessageReceiver发送广播
		// 可以从DemoMessageReceiver的onCommandResult方法中MiPushCommandMessage对象参数中获取注册信息
		if (shouldInit()) {
			MiPushClient.registerPush(this, APP_ID, APP_KEY);
		}

	}

	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;
	}
这个是官方给的,我没做修改,只是把其中的APP_ID, APP_KEY换成自己项目所申请到的。
最后要说一下权限的问题
<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" />
    <!-- the following 2 com.xiaomi.mipushdemo should be changed to your package name -->
    <permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE"
        android:protectionLevel="signatureOrSystem" />
    <uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" />
    <uses-permission android:name="android.permission.VIBRATE"/>

除了权限,还要注册一些东西进去
<service
            android:enabled="true"
            android:process=":pushservice"
            android:name="com.xiaomi.push.service.XMPushService"/>
        <service
            android:enabled="true"
            android:exported="true"
            android:name="com.xiaomi.mipush.sdk.PushMessageHandler" />

        <receiver
            android:exported="true"
            android:name="com.xiaomi.mipushdemo.DemoMessageReceiver">
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.ERROR" />
            </intent-filter>
        </receiver>

        <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>

以上代码便可实现你所想要的推送效果。
如果我的代码太分散导致你看不明白,没关系,官方有提供的demo,而且还有官方文档。这里我要提醒大家一些使用上面的问题。
1.APP_ID, APP_KEY必须替换,这个需要去官网申请,首先申请开发者账号,然后发项目上去等待审核,过程大约两三天,不定。
2.把demo中的一些包名改为自己项目的包名,小米demo的handle目前看没什么作用,可以删除这一块。
3.小米demo给的MIPushDemoActivity类我们可以不用,因为在我们项目中有很多类,你也不知道用到哪里。但这两个方法是有用的,我们是必须写进去的。这个就必须是MiPushClient.registerPush(this, APP_ID, APP_KEY);执行成功后才能使用,不然你感觉是很成功的,但是就出不来效果,建议写在onCommandResult方法里,怎么写我上面有提到,把该注意的注意到就ok了。
然后你就可以去你的开发者账户中的项目下面点击推送工具,在里面试着发送一条消息了,发送与接收到信息的效果图如下。记住,发送的时候看清是线上环境还是测试环境,我代码里面也有对这块进行标注。
                 最后再提醒大家一个小知识,在设置标签或别名时最好设置成你应用的用户名,那样后台推送的选择性更强一些。还错过了最关键的一步,就是一定要架包,不然你的类名都会报错。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值