Android 集成华为推送,集成小米推送,集成OPPO推送,集成vivo推送

最近有时间在我们的应用中集成了华为,小米,OPPO,vivo四大平台的推送,一切顺利。

这里做一个记录,

开撸:

一、华为推送

1、下载HMS Agent套件解压如下:

找到GetHMSAgent_cn.bat 打开如下,按照提示输入包名,appid等信息,按enter键下一项,因为我这里只需要推送功能,所以除了最后的“是否需要推送服务”输入了1外,其他的我都是否。

 完成后会在原来的目录下找到一个叫copysrc的文件夹,如下图:

 然后打开copysrc-->java 把com整个文件复制到我们的项目工程中,位置:app->java文件中,如出现错误,请检查复制到的目录是否正确如下:

2、build文件配置,在app的build文件中找到allprojedts-->repositories添加:

maven { url 'http://developer.huawei.com/repo/' }

如下图:

同时,在build中dependencies添加依赖:implementation 'com.huawei.android.hms:push:xxxx'

xxxx替换为你下载到的套件的版本号,如我下载的是HMSAgent_2.6.3.306,则是:

implementation 'com.huawei.android.hms:push:2.6.3.306'

3、配置AndroidManifest.xml文件,添加以下内容:

<!--华为推送相关权限-->
<!-- 接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 xxx 要替换上您应用的包名 -->
<permission
    android:name="xxx .permission.PROCESS_PUSH_MSG"
    android:protectionLevel="signatureOrSystem" />
<!--接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 xxx 要替换上您应用的包名 -->
<uses-permission android:name="xxx.permission.PROCESS_PUSH_MSG" />

在application的节点下添加以下内容,把以下的“你的appid”替换为你的appid,xxx替换为你的包名

<!--华为推送.......................................开始 ...................................................... -->
<meta-data
    android:name="com.huawei.hms.client.appid"
    android:value="appid=你的appid" />

<provider
    android:name="com.huawei.hms.update.provider.UpdateProvider"
    android:authorities="xxx.hms.update.provider"
    android:exported="false"
    android:grantUriPermissions="true" />

<provider
    android:name="com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider"
    android:authorities="xxx.updateSdk.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true" />

<activity
    android:name="com.huawei.android.hms.agent.common.HMSAgentActivity"
    android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
    android:excludeFromRecents="true"
    android:exported="false"
    android:hardwareAccelerated="true"
    android:theme="@android:style/Theme.Translucent">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<activity
    android:name="com.huawei.hms.activity.BridgeActivity"
    android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
    android:excludeFromRecents="true"
    android:exported="false"
    android:hardwareAccelerated="true"
    android:theme="@android:style/Theme.Translucent">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>

<activity
    android:name="com.huawei.updatesdk.service.otaupdate.AppUpdateActivity"
    android:configChanges="orientation|screenSize"
    android:exported="false"
    android:theme="@style/upsdkDlDialog">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent.NoTitleBar" />
</activity>

<activity
    android:name="com.huawei.updatesdk.support.pm.PackageInstallerActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:exported="false"
    android:theme="@style/upsdkDlDialog">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>

<receiver
    android:name=".server.HuaweiPushRevicer"
    android:permission="xxx.permission.PROCESS_PUSH_MSG">
    <intent-filter>
        <!-- 必须,用于接收token -->
        <action android:name="com.huawei.android.push.intent.REGISTRATION" />
        <!-- 必须, 用于接收透传消息 -->
        <action android:name="com.huawei.android.push.intent.RECEIVE" />
        <!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
        <action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY" />
    </intent-filter>
</receiver>

<service
    android:name="com.huawei.hms.support.api.push.service.HmsMsgService"
    android:enabled="true"
    android:exported="true"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.huawei.push.msg.NOTIFY_MSG" />
        <action android:name="com.huawei.push.msg.PASSBY_MSG" />
    </intent-filter>
</service>
<!--华为推送.......................................结束...................................................... -->
上面的HuaweiPushRevicer为自定义的一个广播接收器,如下:
public class HuaweiPushRevicer extends PushReceiver {

    public static final String TAG = "HuaweiPushRevicer";

    public static final String ACTION_UPDATEUI = "action.updateUI";
    public static final String ACTION_TOKEN = "action.updateToken";

    private static List<IPushCallback> pushCallbacks = new ArrayList<IPushCallback>();
    private static final Object CALLBACK_LOCK = new Object();

    public interface IPushCallback {
        void onReceive(Intent intent);
    }

    public static void registerPushCallback(IPushCallback callback) {
        synchronized (CALLBACK_LOCK) {
            pushCallbacks.add(callback);
        }
    }

    public static void unRegisterPushCallback(IPushCallback callback) {
        synchronized (CALLBACK_LOCK) {
            pushCallbacks.remove(callback);
        }
    }

    @Override
    public void onToken(Context context, String tokenIn, Bundle extras) {
        Log.e("onToken:", tokenIn);

        String belongId = extras.getString("belongId");
        Intent intent = new Intent();
        intent.setAction(ACTION_TOKEN);
        intent.putExtra(ACTION_TOKEN, tokenIn);
        callBack(intent);

        intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);
        intent.putExtra("log", "belongId is:" + belongId + " Token is:" + tokenIn);
        callBack(intent);
    }

    @Override
    public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {

        Log.e("onPushMsg:", "接收消息");
        try {
            //CP可以自己解析消息内容,然后做相应的处理 | CP can parse message content on its own, and then do the appropriate processing
            String content = new String(msg, "UTF-8");
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
            intent.putExtra("log", "Receive a push pass message with the message:" + content);
            callBack(intent);
        } catch (Exception e) {
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
            intent.putExtra("log", "Receive push pass message, exception:" + e.getMessage());
            callBack(intent);
        }
        return false;
    }

    public void onEvent(Context context, Event event, Bundle extras) {
        Log.e("onEvent:", "事件");
        Intent intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);

        int notifyId = 0;
        if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
            notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
            if (0 != notifyId) {
                NotificationManager manager = (NotificationManager) context
                        .getSystemService(Context.NOTIFICATION_SERVICE);
                manager.cancel(notifyId);
            }
        }

        String message = extras.getString(BOUND_KEY.pushMsgKey);
        intent.putExtra("log", "Received event,notifyId:" + notifyId + " msg:" + message);
        callBack(intent);
        super.onEvent(context, event, extras);
    }

    @Override
    public void onPushState(Context context, boolean pushState) {
        Log.e("onPushState:", "接收状态");
        Intent intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);
        intent.putExtra("log", "The Push connection status is:" + pushState);
        callBack(intent);
    }

    private static void callBack(Intent intent) {
        synchronized (CALLBACK_LOCK) {
            for (IPushCallback callback : pushCallbacks) {
                if (callback != null) {
                    callback.onReceive(intent);
                }
            }
        }
    }

4、在Application的onCreate()方法中初始化:

      HMSAgent.init(this);

5、连接华为通道,获取唯一token

在主activity中实现HuaweiPushRevicer.IPushCallback 接口,

同时:在onCreate()方法中

HuaweiPushRevicer.registerPushCallback(this);
HMSAgent.connect(this, new ConnectHandler() {
    @Override
    public void onConnect(int rst) {
        Log.e("HuaWeiRegister:", "HMS connect end:" + rst);
    }
});

然后我们就可以在实现的onReceive方法中拿到token了...如下:

@Override
public void onReceive(Intent intent) {
    if (intent != null) {
        String action = intent.getAction();
        Bundle b = intent.getExtras();
        if (b != null && "action.updateToken".equals(action)) {
            String token = b.getString("action.updateToken");
            Log.d("HuaWeiRegister", "华为连接成功token:" + token);
        }
    }
}

华为推送结束。

二、小米推送

1、下载Android SDK,解压后把sdk文件下的jar包拷贝到项目的libs下。

2、在AndroidManifest文件添加以下内容:

权限:

<uses-permission android:name="android.permission.GET_TASKS" />//好像可以不加
<!--xiaomi推送.....................................开始.......................................................-->
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":pushservice" />

<receiver
    android:name=".server.XiaomiPushReceiver"
    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>
<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:name="com.xiaomi.mipush.sdk.PushMessageHandler"
    android:enabled="true"
    android:exported="true" />

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

上面的XiaomiPushReceiver为自定义的广播接收器,当我们配置完成后就可以在onCommandResult()方法中拿到token

如下:

public class XiaomiPushReceiver extends PushMessageReceiver {

    @Override
    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
    }

    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
    }

    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {

    }

    @Override
    public void onCommandResult(Context context, MiPushCommandMessage message) {
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                String mRegID = arguments.get(0);
                Log.d("小米registerID", mRegID)
            }
        }
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
    }

    @Override
    public void onRequirePermissions(Context context, String[] permissions) {
        super.onRequirePermissions(context, permissions);
    }

    @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;
    }
}

3、在Application的onCreate()方法中初始化:

MiPushClient.registerPush(this, "你的AppID", "你的AppKey");

然后就可以在XiaomiPushReceiver中拿到registerID了

小米push结束。

三、OPPO推送

1、下载Android SDK,解压后把jar拷贝到我们项目的libs下。

2、在AndroidManifest文件添加以下内容:

<!--OPPO推送.......................................开始 ...................................................... -->
<service
    android:name="com.coloros.mcssdk.PushService"
    android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
    <intent-filter>
        <action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
    </intent-filter>
</service>
<!--OPPO推送.......................................结束 ...................................................... -->

3、在Application的onCreate()方法中初始化,初始化成功后会拿到registerId:

PushManager.getInstance().register(this, "你的appkey", "你的appsecret", new PushCallback() {
    @Override
    public void onRegister(int code, String s) {
        if (code == 0) {
            Log.d("oppo注册成功", "registerId:" + s);
            setOPPOPushPassageway();
        } else {
            Log.d("oppo注册失败", "code=" + code + ",msg=" + s);
        }
    }

    @Override
    public void onUnRegister(int i) {

    }

    @Override
    public void onGetAliases(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onSetAliases(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onUnsetAliases(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onSetUserAccounts(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onUnsetUserAccounts(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onGetUserAccounts(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onSetTags(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onUnsetTags(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onGetTags(int i, List<SubscribeResult> list) {

    }

    @Override
    public void onGetPushStatus(int i, int i1) {

    }

    @Override
    public void onSetPushTime(int i, String s) {

    }

    @Override
    public void onGetNotificationStatus(int i, int i1) {

    }
});

OPPO在android 8.0版本后需要创建通道:

//oppo推送通道配置
private void setOPPOPushPassageway() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && PushManager.isSupportPush(this)) {
        String channelId = "oppoPush";//记住此channelId ,可自定义
        String channelName = "通知消息";//记住此channelName ,可自定义
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
    }
}
在客户端创建好通道之后,服务端则需要根据此通道ID来推送消息。在手机上需要把通道的允许通知权限也打开才能收到消息。

四、vivo推送

1、下载sdk,下载Android SDK,解压后把libs下的jar包拷贝到我们项目的libs下。

2、在AndroidManifest文件添加以下内容,同时拿到你应用的apikey和appid对应替换:

<!--vivo推送.......................................开始.......................................................-->
<meta-data
    android:name="com.vivo.push.api_key"
    android:value="你的apiKey"/>
<meta-data
    android:name="com.vivo.push.app_id"
    android:value="你的AppID" />

<receiver android:name=".server.VivoPushMessageReceiver">
    <intent-filter>
        <!-- 接收push消息 -->
        <action android:name="com.vivo.pushclient.action.RECEIVE" />
    </intent-filter>
</receiver>
<service
    android:name="com.vivo.push.sdk.service.CommandClientService"
    android:exported="true" />
<activity
    android:name="com.vivo.push.sdk.LinkProxyClientActivity"
    android:exported="false"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!--vivo推送.......................................结束.......................................................-->

VivoPushMessageReceiver为自定义的广播接收器:

public class VivoPushMessageReceiver extends OpenClientPushMessageReceiver {
    @Override
    public void onNotificationMessageClicked(Context context, UPSNotificationMessage upsNotificationMessage) {
        long msgId;
        String customeContent = "";
        if (upsNotificationMessage != null) {
            msgId = upsNotificationMessage.getMsgId();
            customeContent = upsNotificationMessage.getSkipContent();
            Log.e("NPL", "获取通知内容如下:msgId = " + msgId + ";customeContent=" + customeContent);
        }
    }

    @Override
    public void onReceiveRegId(Context context, String s) {
        if (TextUtils.isEmpty(s)) {
            //获取regId失败
            Log.e("NPL", "获取RegId失败");
        } else {
            Log.e("NPL", "获取registerId成功,registerId= " + s);
        }
    }

3、在Application的onCreate()方法中初始化,初始化成功后就可以在VivoPushMessageReceiver中拿到registerId:

PushClient.getInstance(this).initialize();
PushClient.getInstance(this).turnOnPush(new IPushActionListener() {
    @Override
    public void onStateChanged(int i) {
        if (i == 0) {
            Log.e("NPL", "打开推送服务成功");
        } else {
            Log.e("NPL", "打开推送服务失败");
        }
    }
});

vivo推送特别注意:

上面的appid不是下图的id:

  而是下图的appid,appkey也是下图的:

完成。.

发布了21 篇原创文章 · 获赞 22 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m13984458297/article/details/102586955