全部产品
云市场

Android接入

更新时间:2019-09-25 11:07:23

集成准备

参照EMAS Android SDK快速集成手册,需要配置maven地址,接入EMAS插件并配置构建脚本。

gradle依赖

  1. /************基础库 START **********/
  2. compile('com.taobao.android:networksdk:3.3.7-open@jar') { transitive true }
  3. compile('com.taobao.android:tnet4android:3.1.14.6@aar') { transitive true }
  4. compile('com.taobao.android:utdid4all:1.1.5.3_proguard@jar') { transitive true }
  5. /************基础库 END **********/
  6. /************通道服务 SDK START**********/
  7. compile('com.taobao.android:accs_sdk_taobao:3.3.6.12-open') {
  8. exclude group: 'com.taobao.android', module: 'networksdk'
  9. transitive true
  10. }
  11. /************通道服务 SDK END**********/

写入Manifest

权限声明

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  5. <uses-permission android:name="android.permission.WAKE_LOCK" />
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  7. <uses-permission android:name="android.permission.GET_TASKS" />
  8. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

必要Service声明

  1. <!-- accs start -->
  2. <service
  3. android:name="com.taobao.accs.ChannelService"
  4. android:exported="true"
  5. android:process=":channel">
  6. <intent-filter>
  7. <action android:name="com.taobao.accs.intent.action.SERVICE" />
  8. </intent-filter>
  9. </service>
  10. <service
  11. android:name="com.taobao.accs.ChannelService$KernelService"
  12. android:exported="false"
  13. android:process=":channel" />
  14. <service
  15. android:name="com.taobao.accs.data.MsgDistributeService"
  16. android:exported="true">
  17. <intent-filter>
  18. <action android:name="com.taobao.accs.intent.action.RECEIVE" />
  19. </intent-filter>
  20. </service>
  21. <receiver
  22. android:name="com.taobao.accs.EventReceiver"
  23. android:process=":channel">
  24. <intent-filter>
  25. <action android:name="android.intent.action.BOOT_COMPLETED" />
  26. </intent-filter>
  27. <intent-filter>
  28. <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  29. </intent-filter>
  30. <intent-filter>
  31. <action android:name="android.intent.action.PACKAGE_REMOVED" />
  32. <data android:scheme="package" />
  33. </intent-filter>
  34. <intent-filter>
  35. <action android:name="android.intent.action.USER_PRESENT" />
  36. </intent-filter>
  37. </receiver>
  38. <receiver
  39. android:name="com.taobao.accs.ServiceReceiver"
  40. android:process=":channel">
  41. <intent-filter>
  42. <action android:name="com.taobao.accs.intent.action.COMMAND" />
  43. </intent-filter>
  44. <intent-filter>
  45. <action android:name="com.taobao.accs.intent.action.START_FROM_AGOO" />
  46. </intent-filter>
  47. </receiver>
  48. <service
  49. android:name="com.taobao.accs.internal.AccsJobService"
  50. android:permission="android.permission.BIND_JOB_SERVICE"
  51. android:process=":channel" />
  52. <!-- accs end -->

初始化SDK

初始化ACCSClient

建议异步初始化

  1. try {
  2. int env = Constants.RELEASE;
  3. int pubkey = SpdyProtocol.PUBKEY_PSEQ_EMAS;
  4. String appkey = "<your appekey>";
  5. String appsecret ="<your appsecret>"
  6. String emasHost = "<your accs host>";
  7. final AccsClientConfig clientConfig = new AccsClientConfig.Builder()
  8. .setAppKey(appkey)
  9. .setAppSecret(appsecret)
  10. .setInappHost(emasHost)
  11. .setInappPubKey(pubkey)
  12. .setChannelHost(emasHost)
  13. .setChannelPubKey(pubkey)
  14. .setTag(AccsClientConfig.DEFAULT_CONFIGTAG)
  15. .setConfigEnv(env)
  16. .build();
  17. new Thread() { //建议异步进行初始化
  18. @Override
  19. public void run() {
  20. try {
  21. ACCSClient.init(mApplication, clientConfig);
  22. ACCSClient.getAccsClient(AccsClientConfig.DEFAULT_CONFIGTAG).bindApp(mChannelID, mAppReceiver);
  23. } catch (AccsException e) {
  24. ALog.w(TAG, "initDefaultAccs", e);
  25. }
  26. }
  27. }.start();
  28. } catch (AccsException e) {
  29. ALog.w(TAG, "initDefaultAccsConfig", e);
  30. }

获取ACCSClient

  1. ACCSClient.getAccsClient(String configTag) throws AccsException

绑定APP

注册设备信息到服务端,绑定结果会在IAppReceiver中异步返回, IAppReceiver中getService()必须实现,否则消息路由不到业务service. 切记要放application里面调用,确保前台进程和后台常驻进程都能执行到, 建议异步进行bindApp操作

  1. //ttid: 渠道号 appCallback:回调接口
  2. accsClient.bindApp(String ttid, IAppReceiver appCallback);
  3. public interface IAppReceiver {
  4. String getService(String serviceId);//根据serviceid返回对应接入方的消息回调service(继承TaoBaseService的实现类)
  5. Map<String,String> getAllServices();//返回APP内接入方的消息回调service的完整路径类名
  6. void onBindApp(int errorCode);//bindapp结果回调
  7. void onUnbindApp(int errorCode);//unbindapp结果回调
  8. void onBindUser(String userId, int errorCode);//binduser结果回调
  9. void onUnbindUser(int errorCode);//unBindUser结果回调
  10. void onSendData(String dataId, int errorCode);
  11. void onData(String userId, String dataId, byte[] data);
  12. }

IAppReceiver中getService(String serviceId)接口实现范例:

  1. static {
  2. serviceMap.put("xxx", "xxx.xxx.xxx.xxxService"); //key为serviceId, value为继承TaobaseService实现的接收消息service
  3. }
  4. @Override
  5. public String getService(String serviceId) {
  6. String service = serviceMap.get(serviceId);
  7. if(!TextUtils.isEmpty(service)){
  8. return service;
  9. }
  10. return "";
  11. }

绑定/解绑用户

  • 当程序自身的用户进行登陆后, 可以使用accsClient.bindUser(String userId)方法绑定用户, 绑定结果会在IAppReceiver中异步返回, 绑定成功后可以按用户维度推送数据
  • 当用户注销时, 使用accsClient.unbindUser()方法解绑用户, 解绑结果会在会在IAppReceiver中异步返回
  • 注意同一个用户最多可以绑定20个设备,如果该用户绑定的设备数量超过该限制,会绑定失败

业务接入API

联系服务端同学获取serviceId。(如果服务端尚未完成接入,在测试阶段可以使用测试用的serviceId,即emas-test)。

编写业务消息回调类, 继承com.taobao.accs.base.TaoBaseService类并实现,例如:

  1. public class TestAccsService extends TaoBaseService {
  2. private static final String TAG = "TestAccsService";
  3. private static IAccsResponse mResponse;
  4. public interface IAccsResponse {
  5. void onResponse(int errorCode, String response);
  6. void onData(String serviceId, String dataId, String data);
  7. }
  8. public static void setIAccsResponse(IAccsResponse response) {
  9. mResponse = response;
  10. }
  11. /**
  12. * bindService回调
  13. *
  14. * @param serviceId 服务ID
  15. * @param errorCode 错误码=200为成功,其他失败
  16. * @param extraInfo
  17. */
  18. @Override
  19. public void onBind(String serviceId, int errorCode, ExtraInfo extraInfo) {
  20. ALog.d(TAG, "onBind", "serviceId", serviceId, "errorCode", errorCode);
  21. }
  22. /**
  23. * unbindService回调
  24. *
  25. * @param serviceId 服务ID
  26. * @param errorCode 错误码=200为成功,其他失败
  27. * @param extraInfo
  28. */
  29. @Override
  30. public void onUnbind(String serviceId, int errorCode, ExtraInfo extraInfo) {
  31. ALog.d(TAG, "onUnbind", "serviceId", serviceId, "errorCode", errorCode);
  32. }
  33. /**
  34. * sendData回调
  35. *
  36. * @param serviceId 服务ID
  37. * @param dataId 数据ID
  38. * @param errorCode 错误码=200为成功,其他失败
  39. * @param extraInfo
  40. */
  41. @Override
  42. public void onSendData(String serviceId, String dataId, int errorCode, ExtraInfo extraInfo) {
  43. ALog.d(TAG, "onSendData", "serviceId", serviceId, "dataId", dataId, "errorCode", errorCode);
  44. }
  45. /**
  46. * sendRequest回调
  47. *
  48. * @param serviceId 服务ID
  49. * @param dataId 数据ID
  50. * @param errorCode 错误码=200为成功,其他失败
  51. * @param bytes
  52. * @param extraInfo
  53. */
  54. @Override
  55. public void onResponse(String serviceId, String dataId, int errorCode, byte[] bytes, ExtraInfo extraInfo) {
  56. if (mResponse != null) {
  57. mResponse.onResponse(errorCode, bytes == null ? null : new String(bytes));
  58. }
  59. }
  60. /**
  61. * 下行数据回调
  62. *
  63. * @param serviceId 服务ID
  64. * @param userId 用户ID
  65. * @param dataId 数据ID
  66. * @param bytes
  67. * @param extraInfo
  68. */
  69. @Override
  70. public void onData(String serviceId, String userId, String dataId, byte[] bytes, ExtraInfo extraInfo) {
  71. if (mResponse != null) {
  72. mResponse.onData(serviceId, dataId, bytes == null ? null : new String(bytes));
  73. }
  74. }
  75. /**
  76. * 连接成功状态回调
  77. *
  78. * @param conninfo
  79. */
  80. @Override
  81. public void onConnected(ConnectInfo conninfo) {
  82. ALog.d(TAG, "onConnected", "host", conninfo.host, "isInapp", conninfo.isInapp);
  83. }
  84. /**
  85. * 连接失败状态回调
  86. *
  87. * @param conninfo
  88. */
  89. @Override
  90. public void onDisconnected(ConnectInfo conninfo) {
  91. ALog.e(TAG, "onDisconnected", "host", conninfo.host, "isInapp", conninfo.isInapp,
  92. "errorCode", conninfo.errorCode, "errorDetail", conninfo.errordetail);
  93. }
  94. }

并把该service注入到IAppReceiver的getAllServices()中, 同时在AndroidMenifest中注册这个实现的service

  1. <service android:name=".TestAccsService">
  2. <intent-filter>
  3. <action android:name="com.taobao.accs.intent.action.RECEIVE" />
  4. </intent-filter>
  5. </service>

绑定服务

绑定服务后才能接收推送消息. 需要调用bindService接口. 应用内的服务启动后, 可以使用accsClient.bindService(String serviceId)方法绑定服务,绑定结果会TaoBaseService实现类的onBind()中异步返回

发送消息

  1. 当希望上行消息时:

    使用accsClient.sendData(Context context, AccsRequest dataInfo)发送上行数据, 返回值为dataId. 发送是否成功通知会在TaoBaseService实现类的onSendData()回调接口中异步返回.

  2. 当希望上行消息并有回包(request/response模式):

    使用accsClient.sendRequest(Context context, AccsRequest dataInfo)发送上行数据, 返回值为dataId. 回包或发送失败通知会在TaoBaseService实现类的onResponse()回调接口中异步返回

AccsRequest接口参数如下:

  1. public static class AccsRequest {
  2. ...
  3. public String serviceId; //业务id (必选)
  4. public byte[] data; //数据内容 (必选)
  5. public String userId; //用户id,按用户维度上行数据(可选)
  6. public String target; //目的地址,必选,一般和业务id相同
  7. public String dataId; //数据id,可自行生成,传空accs将自动生成(可选)
  8. public int timeout; //上层设置的超时时间(可选)
  9. }