xiaoMi推送Android端集成

SDK说明

Android的SDK以jar形式提供,客户端在注册成功后,会得到服务器颁发的regId,之后可以通过订阅topic、设置alias等方式来接收推送消息。

小米推送目前支持两种消息传递方式:透传方式和通知栏方式。

  • 透传消息到达手机端后,SDK会将消息通过广播方式传给AndroidManifest中注册的PushMessageReceiver的子类的onReceivePassThroughMessage。
  • 对于通知栏消息,SDK会根据消息中设置的信息弹出通知栏通知,通知消息到达时会到达PushMessageReceiver子类的onNotificationMessageArrived方法,用户点击之后再传给您的PushMessageReceiver的子类的onNotificationMessageClicked方法。对于应用在前台时不弹出通知的通知消息,SDK会将消息通过广播方式传给AndroidManifest中注册的PushMessageReceiver的子类的onNotificationMessageArrived方法(在MIUI上,如果没有收到onNotificationMessageArrived回调,是因为使用的MIUI版本还不支持该特性,需要升级到MIUI7之后。非MIUI手机都可以收到这个回调)。

SDK集成

1.导入推送jar包

MiPush_SDK_Client_3_8_2.jar拷贝到您的工程的libs文件夹中。

2.引用jar包到工程

在android项目app目录下的build.gradle中添加jar依赖。

dependencies {
	//...
    implementation fileTree(dir: 'libs', include: ['*.jar'])
	implementation fileTree(include: ['*.aar'], dir: 'libs')
}

下载地址:http://dev.xiaomi.com/mipush/downpage/ 。

配置AndroidManifest.xml文件

推送服务需要的权限列表:
<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.car.cartechpro.permission.MIPUSH_RECEIVE"
    android:protectionLevel="signature" /> <!--这里com.xiaomi.mipushdemo改成app的包名-->

<uses-permission android:name="com.car.cartechpro.permission.MIPUSH_RECEIVE" /><!--这里com.xiaomi.mipushdemo改成app的包名-->
推送服务需要配置的service和receiver:
	<activity android:name=".push.xiaoMiPush.activity.XiaoMiPushActivity"></activity>

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

    <receiver
        android:name=".push.xiaoMiPush.receiver.XiaoMiMessageReceiver"
        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>

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

注册小米推送

为了提高push的注册率,您可以在Application的onCreate中初始化push。您也可以根据需要,在其他地方初始化push。 代码如下:

 /**
 * 小米
 */
private static void initMiui(Context context) {
    // 小米设备
    LogTool.i(TAG, "initMiui");
    if (shouldInit(context)) {
        MiPushClient.registerPush(context, AppParam.XIAO_MI.APP_ID, AppParam.XIAO_MI.APP_KEY);
        LogTool.f("xiaoMi regId:" + MiPushClient.getRegId(context));
    }
}
 private static boolean shouldInit(Context context) {
    ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE));
    List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
    String mainProcessName = context.getPackageName();
    int myPid = Process.myPid();
    for (ActivityManager.RunningAppProcessInfo info : processInfos) {
        if (info.pid == myPid && mainProcessName.equals(info.processName)) {
            return true;
        }
    }
    return false;
}

添加混淆

如果你的应用使用了混淆,你需要keep自定义的BroadcastReceiver。自定义的BroadcastReceiver继承PushMessageReceiver,使用下面的代码是不行的。
-keep public class * extends android.content.BroadcastReceiver
你需要使用下面的代码keep自定义的BroadcastReceiver。
这里com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定义的完整类名
-keep class com.xiaomi.mipush.sdk.DemoMessageReceiver {*;}

#xiaoMi
-keep class com.car.cartechpro.push.xiaoMiPush.receiver.XiaoMiMessageReceiver {*;}

自定义一个BroadcastReceiver类

为了接收消息,您需要自定义一个继承自PushMessageReceiver类的BroadcastReceiver,
实现其中的onReceivePassThroughMessage,onNotificationMessageClicked,onNotificationMessageArrived,onCommandResult和onReceiveRegisterResult方法,然后把该receiver注册到AndroidManifest.xml文件中。

onReceivePassThroughMessage用来接收服务器发送的透传消息,
onNotificationMessageClicked用来接收服务器发来的通知栏消息(用户点击通知栏时触发),
onNotificationMessageArrived用来接收服务器发来的通知栏消息(消息到达客户端时触发,并且可以接收应用在前台时不弹出通知的通知消息),
onCommandResult用来接收客户端向服务器发送命令消息后返回的响应,onReceiveRegisterResult用来接受客户端向服务器发送注册命令消息后返回的响应。

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import com.xiaomi.mipush.sdk.ErrorCode;
import com.xiaomi.mipush.sdk.MiPushClient;
import com.xiaomi.mipush.sdk.MiPushCommandMessage;
import com.xiaomi.mipush.sdk.MiPushMessage;
import com.xiaomi.mipush.sdk.PushMessageReceiver;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class XiaoMiMessageReceiver extends PushMessageReceiver {

    private String mRegId;
    private String mTopic;
    private String mAlias;
    private String mAccount;
    private String mStartTime;
    private String mEndTime;

    public static final String TAG = "XiaoMiMessageReceiver_eeee";

    /**
     * 用来接收服务器发送的透传消息
     * @param context
     * @param message
     */
    @SuppressLint("LongLogTag")
    @Override
    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
        LogTool.f("onReceivePassThroughMessage is called. " + message.toString());
        String log = context.getString(R.string.recv_passthrough_message, message.getContent());
        Log.i(getSimpleDate() + " " + log);

        if (!TextUtils.isEmpty(message.getTopic())) {
            mTopic = message.getTopic();
        } else if (!TextUtils.isEmpty(message.getAlias())) {
            mAlias = message.getAlias();
        }else if(!TextUtils.isEmpty(message.getUserAccount())) {
            mAccount = message.getUserAccount();
        }

    }

    /**
     * 接收服务器向客户端发送的通知消息,这个回调方法会在用户手动点击通知后触发。
     * @param context
     * @param message
     */
    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        LogTool.f("onNotificationMessageClicked is called. " + message.toString());
        String log = context.getString(R.string.click_notification_message, message.getContent());
        Log.i(getSimpleDate() + " " + log);

        if (!TextUtils.isEmpty(message.getTopic())) {
            mTopic = message.getTopic();
        } else if (!TextUtils.isEmpty(message.getAlias())) {
            mAlias = message.getAlias();
        }
    }

    /**
     * 方接收服务器向客户端发送的通知消息,这个回调方法是在通知消息到达客户端时触发。
     * 另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数
     * @param context
     * @param message
     */
    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        LogTool.f("onNotificationMessageArrived is called. " + message.toString());

        String log = context.getString(R.string.arrive_notification_message, message.getContent());
        Log.i(getSimpleDate() + " " + log);

        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) {
        LogTool.f("onNotificationMessageArrived is called. " + message.toString());
        String command = message.getCommand();
        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);
        String log;
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
                log = context.getString(R.string.register_success);
            } else {
                log = context.getString(R.string.register_fail);
            }
        } else if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAlias = cmdArg1;
                log = context.getString(R.string.set_alias_success, mAlias);
            } else {
                log = context.getString(R.string.set_alias_fail, message.getReason());
            }
        } else if (MiPushClient.COMMAND_UNSET_ALIAS.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAlias = cmdArg1;
                log = context.getString(R.string.unset_alias_success, mAlias);
            } else {
                log = context.getString(R.string.unset_alias_fail, message.getReason());
            }
        } else if (MiPushClient.COMMAND_SET_ACCOUNT.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAccount = cmdArg1;
                log = context.getString(R.string.set_account_success, mAccount);
            } else {
                log = context.getString(R.string.set_account_fail, message.getReason());
            }
        } else if (MiPushClient.COMMAND_UNSET_ACCOUNT.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAccount = cmdArg1;
                log = context.getString(R.string.unset_account_success, mAccount);
            } else {
                log = context.getString(R.string.unset_account_fail, message.getReason());
            }
        } else if (MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mTopic = cmdArg1;
                log = context.getString(R.string.subscribe_topic_success, mTopic);
            } else {
                log = context.getString(R.string.subscribe_topic_fail, message.getReason());
            }
        } else if (MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mTopic = cmdArg1;
                log = context.getString(R.string.unsubscribe_topic_success, mTopic);
            } else {
                log = context.getString(R.string.unsubscribe_topic_fail, message.getReason());
            }
        } else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mStartTime = cmdArg1;
                mEndTime = cmdArg2;
                log = context.getString(R.string.set_accept_time_success, mStartTime, mEndTime);
            } else {
                log = context.getString(R.string.set_accept_time_fail, message.getReason());
            }
        } else {
            log = message.getReason();
        }
        Log.i(getSimpleDate() + " " + log);
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        LogTool.f("onNotificationMessageArrived is called. " + message.toString());
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
        String log;
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
                log = context.getString(R.string.register_success);
            } else {
                log = context.getString(R.string.register_fail);
            }
        } else {
            log = message.getReason();
        }
        Log.i(getSimpleDate() + " " + log);
    }

    @SuppressLint("SimpleDateFormat")
    private static String getSimpleDate() {
        return new SimpleDateFormat("MM-dd hh:mm:ss").format(new Date());
    }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要进行小米推送的测试,可以按照以下步骤进行操作: 1. 首先,加载小米推送SDK。可以使用以下代码加载SDK: ``` include_once(dirname(__FILE__) . '/../XiaoMiSdk/autoload.php'); ``` 2. 在代码中添加必要的引用。可以使用以下代码添加引用: ``` use xmpush\Builder; use xmpush\Constants; use xmpush\Sender; ``` 3. 设置常量。在调用`new Sender()`方法之前,需要设置一些常量。可以使用以下代码设置常量: ``` $secret = self::$config\['AppSecret'\]; $package = self::$config\['package'\]; Constants::setPackage($package); Constants::setSecret($secret); ``` 4. 创建消息对象并设置相关参数。可以使用以下代码创建消息对象并设置相关参数: ``` $sender = new Sender(); $message1 = new Builder(); $message1->title($data\['title'\]); // 通知栏的标题 $message1->description($data\['description'\]); // 通知栏的说明 $message1->passThrough($data\['passThrough'\]??0); // 是否透传消息 $message1->payload($data\['payload'\]); // 携带的数据 $message1->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知 $message1->notifyId($data\['notifyId'\]??2); // 通知类型 $message1->build(); ``` 5. 发送推送消息。根据需要,可以选择单推或多推。如果`$data\['regId'\]`是一个字符串,则进行单推;如果`$data\['regId'\]`是一个数组,则进行多推。可以使用以下代码发送推送消息: ``` if(is_array($data\['regId'\])){ return $sender->sendToIds($message1, $data\['regId'\])->getRaw(); } else { return $sender->send($message1, $data\['regId'\])->getRaw(); } ``` 6. 进行测试。可以使用以下代码进行测试: ``` $data = \[ 'title' => '两只母老虎', // 标题 'description' => '两只母老虎', // 说明 'payload' => '', // 发送的消息内容 'regId' => '' // 指定设备regId,传一个字符串进行单推,传数组进行多推 \]; $class::push($data); ``` 请根据实际情况修改代码中的参数,并确保已正确配置小米推送的相关信息。 #### 引用[.reference_title] - *1* *2* *3* [Laravel 小米推送](https://blog.csdn.net/qq_877128013/article/details/125282088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值