现在,搭建直播平台需要在用户离线的情况下,推送平台或私人的消息,而由于一些原因,国内的Android推送环境不像IOS一般简单、统一,这就引出了今天我们要讲的话题——通过腾讯IM来实现不同厂商的推送。

由于篇幅原因,这里以小米推送为例,演示直播平台源码如何实现,其他厂商的接入流程也大同小异,使用者可借鉴这此处经验快速接入。

在搭建直播平台前,在厂商平台、腾讯平台注册开发者账号,并申请相关权限,创建推送服务,并绑定应用信息,获取推送证书、密码、密钥等信息。然后,将即时通讯IM的SDK与厂商推送SDK分别集成到自己的项目。

接下来,就是相关直播平台源码的配置:

  1. 配置AndroidManifest.xml 文件,进行一系列的权限申请,由于是基本操作,此处不再赘述
  2. 配置小米推送服务需要的 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: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>
  1. 自定义一个 BroadcastReceiver 类为了接收消息,您需要自定义一个继承自PushMessageReceiver类的 BroadcastReceiver,并实现其中的onReceiveRegisterResult方法,然后将此 receiver 注册到 AndroidManifest.xml 中。
public class XiaomiMsgReceiver extends PushMessageReceiver {
    private static final String TAG = "XiaomiMsgReceiver";
    private String mRegId;

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage miPushCommandMessage) {
        Log.d(TAG, "onReceiveRegisterResult is called. " + miPushCommandMessage.toString());
        String command = miPushCommandMessage.getCommand();
        List<String> arguments = miPushCommandMessage.getCommandArguments();
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);

        Log.d(TAG, "cmd: " + command + " | arg: " + cmdArg1
                + " | result: " + miPushCommandMessage.getResultCode() + " | reason: " + miPushCommandMessage.getReason());

        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (miPushCommandMessage.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
            }
        }
        Log.d(TAG, "regId: " + mRegId);
        ThirdPushTokenMgr.getInstance().setThirdPushToken(mRegId);
 // regId 在此处传入,后续推送信息上报时需要使用
        ThirdPushTokenMgr.getInstance().setPushTokenToTIM();
    }

}
  1. 启用小米离线推送,需要向小米服务器注册推送服务,通过调用MiPushClient.registerPush来对小米推送服务进行初始化MiPushClient.registerPush可在任意地方调用。注册成功后,您将在自定义的 BroadcastReceiver 的onReceiveRegisterResult中收到注册结果。其中regId为当前设备上当前 App 的唯一标识,请记录regId信息。
if(IMFunc.isBrandXiaoMi()){
                // 小米离线推送的直播平台源码
                MiPushClient.registerPush(this, Constants.XM_PUSH_APPID, Constants.XM_PUSH_APPKEY);
            }
6)上报推送信息至即时通信 IM 服务端
/**
* 在 ThirdPushTokenMgr.java 中对推送的证书 ID 及设备信息进行上报操作
*/
public class ThirdPushTokenMgr {
  private static final String TAG = "ThirdPushTokenMgr";
  private String mThirdPushToken;

  public static ThirdPushTokenMgr getInstance () {
      return ThirdPushTokenHolder.instance;
  }

  private static class ThirdPushTokenHolder {
      private static final ThirdPushTokenMgr instance = new ThirdPushTokenMgr();
  }

  public void setThirdPushToken(String mThirdPushToken) {
      this.mThirdPushToken = mThirdPushToken;  // regId 在此处传值,结合上文自定义 BroadcastReciever 类文档说明
  }

  public void setPushTokenToTIM(){
      String token = ThirdPushTokenMgr.getInstance().getThirdPushToken();
      if(TextUtils.isEmpty(token)){
          QLog.i(TAG, "setPushTokenToTIM third token is empty");
          return;
      }
      TIMOfflinePushToken param = null;
      if(IMFunc.isBrandXiaoMi()){ //判断厂商品牌,根据不同厂商选择不同的推送服务
          param = new TIMOfflinePushToken(Constants.XM_PUSH_BUZID, token);
      }
      TIMManager.getInstance().setOfflinePushToken(param, new TIMCallBack() {
          @Override
          public void onError(int code, String desc) {
              Log.d(TAG, "setOfflinePushToken err code = " + code);
          }
          @Override
          public void onSuccess() {
              Log.d(TAG, "setOfflinePushToken success");
              mIsTokenSet = true;
          }
      });
  }
}
  1. 以上操作已经完成了配置,接下来介绍发送端设置自定义内容
//直播平台源码设置推送内容
String extContent = "ext content";
TIMMessageOfflinePushSettings settings = new TIMMessageOfflinePushSettings();
settings.setExt(extContent.getBytes());
timMessage.setOfflinePushSettings(settings);
mConversation.sendMessage(false, timMessage, callback);
接收到小米推送的内容时,会触发小米推送 SDK 的 onNotificationMessageClicked(Context context, MiPushMessage miPushMessage) 回调,自定义内容可以从 miPushMessage 中获取。
Map extra = miPushMessage.getExtra();
String extContent = extra.get("ext");

到这里,直播平台源码中对小米推送的配置就可以正常使用了,如果在搭建直播平台时遇到报错信息,可以查看小米推送文档,或者腾讯IM文档来进行排查问题。