全部产品
云市场
云游戏

Android SDK 3.0配置

更新时间:2020-09-28 13:46:09

本集成文档适用于V3.0.0及以上版本。

Android参考Demo

新版Android SDK(v3.0.0及以上)支持两种集成方式

  • 1.Maven库快速集成
  • 2.手动集成

Maven库快速集成,该集成方案配置简单,不容易出问题,后续更新方便,所以强烈建议开发者采用该方案进行集成。

如果您坚持使用原有集成方案,请参考手动集成方案。


一、Maven库快速集成(远程同步)

  • 在Project根目录下build.gradle文件中配置maven库URL:
  1. allprojects {
  2. repositories {
  3. jcenter()
  4. maven {
  5. url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
  6. }
  7. }
  8. }
  • 在对应的module下的build.gradle文件中添加对应依赖
  1. android {
  2. ......
  3. defaultConfig {
  4. applicationId "com.xxx.xxx" //包名
  5. ......
  6. ndk {
  7. //选择要添加的对应cpu类型的.so库。
  8. abiFilters 'armeabi', 'x86'
  9. }
  10. ......
  11. }
  12. ......
  13. }
  14. dependencies {
  15. ......
  16. compile 'com.aliyun.ams:alicloud-android-push:3.2.2@aar'
  17. compile 'com.aliyun.ams:alicloud-android-utdid:2.5.1-proguard'
  18. compile 'com.aliyun.ams:alicloud-android-utils:1.1.6.4'
  19. compile 'com.aliyun.ams:alicloud-android-ut:5.4.4'
  20. compile 'com.aliyun.ams:alicloud-android-beacon:1.0.4.3'
  21. compile 'com.aliyun.ams:alicloud-android-agoo:4.0.0-emas'
  22. compile 'com.taobao.android:accs_sdk_taobao:4.0.0-emas'
  23. compile 'com.taobao.android:networksdk:3.5.5.2-open'
  24. compile 'com.taobao.android:tnet4android:3.1.14.7-all'
  25. // 或
  26. compile 'com.aliyun.ams:alicloud-android-push:3.2.2'
  27. ......
  28. }

注:从3.2.0版本开始,移动推送和辅助通道的sdk版本有对应关系,com.aliyun.ams:alicloud-android-push:3.2.2版本与com.aliyun.ams:alicloud-android-third-push:3.2.2版本匹配使用,两者需要同时升级

请使用固定版本号集成,不要使用动态版本号,错误示例:3.+ 或者 3.2.+
  • permission权限说明 sdk内部申请的权限如下
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  2. <uses-permission android:name="android.permission.INTERNET"/>
  3. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  4. <uses-permission android:name="android.permission.WAKE_LOCK"/>

注 : 如果在添加以上 abiFilter 配置之后android Studio出现以下提示:

  1. NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

则在 Project 根目录的gradle.properties文件中添加:

  1. android.useDeprecatedNdk=true

二、手动集成

2.1 Android studio手动集成

  • 下载SDK,目前控制台下载的SDK为aar形式,具体包括:

    1. SDK
    2. .
    3. ├── alicloud-android-accs-4.0.0-emas.aar
    4. ├── alicloud-android-agoo-4.0.0-emas.aar
    5. ├── alicloud-android-beacon-1.0.4.3.jar
    6. ├── alicloud-android-push-3.2.2.aar
    7. ├── alicloud-android-ut-5.4.4.jar
    8. ├── alicloud-android-utdid-2.5.1-proguard.jar
    9. ├── alicloud-android-utils-1.1.6.4.jar
    10. ├── networksdk-3.5.5.2-open.jar
    11. ├── tnet4android-3.1.14.7-all.aar
    12. // 以下为辅助通道需要的sdk,此处可以忽略,具体参考辅助通道配置说明
    13. ├── alicloud-android-third-push-3.2.2.aar
    14. ├── huawei-push-2.6.3.305.aar
    15. ├── huawei-push-base-2.6.3.305.aar
    16. ├── meizu-push-3.9.7.aar
    17. ├── mipush-3.7.9.jar
    18. ├── opush-2.1.0-fix.aar
    19. └── third_vivopush-2.9.0.1.aar

    可将所有SDK拷贝到libs目录下,同时在build.gradle文件中进行如下配置:

    1. android {
    2. ...
    3. repositories {
    4. flatDir {
    5. dirs 'libs' //this way we can find the .aar file in libs folder
    6. }
    7. }
    8. dependencies {
    9. compile fileTree(include: ['*.jar'], dir: 'libs')
    10. compile (name:'alicloud-android-push-xx', ext: 'aar')
    11. compile (name:'alicloud-android-accs-xx', ext: 'aar')
    12. // 等等把所有的aar都添加上
    13. }

2.2 eclipse手动集成

参见使用Eclipse如何集成Android SDK?

三、AndroidManifest配置

3.1 appKey, appSecret配置

  • 在AndroidManifest文件中设置appKey,appSecret:
  1. <application android:name="*****">
  2. <meta-data android:name="com.alibaba.app.appkey" android:value="*****"/> <!-- 请填写你自己的- appKey -->
  3. <meta-data android:name="com.alibaba.app.appsecret" android:value="****"/> <!-- 请填写你自己的appSecret -->
  4. </application>

com.alibaba.app.appkeycom.alibaba.app.appsecret为您App的对应信息,在推送控制台APP列表页的应用证书中获取。appkeyappsecret请务必写在application标签下,否则sdk会报找不到appkey错误。如果您是百川云推送用户,不能直接使用百川平台的appKey和appSecret,需要登录阿里云移动推送控制台,登录账号为您的百川平台账号,并使用阿里云平台的appKeyappSecret

3.1.1 EMAS统一接入

V3.1.2版本开始,push支持EMAS统一接入功能,接入该功能无需再在AndoridManifest文件中设置appkey, appsecret。具体配置可参考:Emas统一接入文档(Android)

3.2 Permission配置

需要考虑是否要声明如下权限

  1. <uses-permission android:name="android.permission.GET_TASKS"/>
  2. <uses-permission android:name="android.permission.REORDER_TASKS"/>

涉及功能为 通知打开方式-打开应用,如果有上述权限,当应用在后台时,点击通知会把已有的应用任务栈移到前台。如果没有上述权限,点击通知,某些Android会打开新界面,而不是把已有的任务栈移到前台。是否添加权限,用户可以自己决定

3.3 消息接收Receiver配置

创建消息接收Receiver,继承自com.alibaba.sdk.android.push.MessageReceiver,并在对应回调中添加业务处理逻辑,可参考以下代码:

  1. public class MyMessageReceiver extends MessageReceiver {
  2. // 消息接收部分的LOG_TAG
  3. public static final String REC_TAG = "receiver";
  4. @Override
  5. public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
  6. // TODO 处理推送通知
  7. Log.e("MyMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
  8. }
  9. @Override
  10. public void onMessage(Context context, CPushMessage cPushMessage) {
  11. Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
  12. }
  13. @Override
  14. public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
  15. Log.e("MyMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
  16. }
  17. @Override
  18. protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
  19. Log.e("MyMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
  20. }
  21. @Override
  22. protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
  23. Log.e("MyMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);
  24. }
  25. @Override
  26. protected void onNotificationRemoved(Context context, String messageId) {
  27. Log.e("MyMessageReceiver", "onNotificationRemoved");
  28. }
  29. }

将该receiver添加到AndroidManifest.xml中

  1. <!-- 消息接收监听器 (用户可自主扩展) -->
  2. <receiver
  3. android:name=".MyMessageReceiver"
  4. android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
  5. <intent-filter>
  6. <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
  7. </intent-filter>
  8. <intent-filter>
  9. <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
  10. </intent-filter>
  11. <intent-filter>
  12. <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
  13. </intent-filter>
  14. </receiver>
如果是从V2.3.7及以下版本升级到V3.0.0及以上版本的用户,需将<action android:name="org.agoo.android.intent.action.RECEIVE" />改为<action android:name="com.alibaba.sdk.android.push.RECEIVE" />,否则会接收不到推送。

3.4. Proguard配置

  1. -keepclasseswithmembernames class ** {
  2. native <methods>;
  3. }
  4. -keepattributes Signature
  5. -keep class sun.misc.Unsafe { *; }
  6. -keep class com.taobao.** {*;}
  7. -keep class com.alibaba.** {*;}
  8. -keep class com.alipay.** {*;}
  9. -keep class com.ut.** {*;}
  10. -keep class com.ta.** {*;}
  11. -keep class anet.**{*;}
  12. -keep class anetwork.**{*;}
  13. -keep class org.android.spdy.**{*;}
  14. -keep class org.android.agoo.**{*;}
  15. -keep class android.os.**{*;}
  16. -keep class org.json.**{*;}
  17. -dontwarn com.taobao.**
  18. -dontwarn com.alibaba.**
  19. -dontwarn com.alipay.**
  20. -dontwarn anet.**
  21. -dontwarn org.android.spdy.**
  22. -dontwarn org.android.agoo.**
  23. -dontwarn anetwork.**
  24. -dontwarn com.ut.**
  25. -dontwarn com.ta.**

3.5. 在应用中注册和启动移动推送

  • 首先通过PushServiceFactory获取到CloudPushService,然后调用register()初始化并注册云推送通道,并确保Application上下文中进行初始化工作。
  • 请参照以下代码段进行初始化:
  1. import android.app.Application;
  2. import android.content.Context;
  3. import android.util.Log;
  4. import com.alibaba.sdk.android.push.CloudPushService;
  5. import com.alibaba.sdk.android.push.CommonCallback;
  6. import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;
  7. public class MainApplication extends Application {
  8. private static final String TAG = "Init";
  9. @Override
  10. public void onCreate() {
  11. super.onCreate();
  12. initCloudChannel(this);
  13. }
  14. /**
  15. * 初始化云推送通道
  16. * @param applicationContext
  17. */
  18. private void initCloudChannel(Context applicationContext) {
  19. PushServiceFactory.init(applicationContext);
  20. CloudPushService pushService = PushServiceFactory.getCloudPushService();
  21. pushService.register(applicationContext, new CommonCallback() {
  22. @Override
  23. public void onSuccess(String response) {
  24. Log.d(TAG, "init cloudchannel success");
  25. }
  26. @Override
  27. public void onFailed(String errorCode, String errorMessage) {
  28. Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
  29. }
  30. });
  31. }
  32. }

【注意】:

  • 移动推送的初始化必须在Application主线程中,不能放到Activity中执行,也不能异步初始化。移动推送在初始化过程中将启动后台进程channel,必须保证应用进程和channel进程都执行到推送初始化代码。
  • 如果设备成功注册,将回调callback.onSuccess()方法。
  • 但如果注册服务器连接失败,则调用callback.onFailed方法,并且自动进行重新注册,直到onSuccess为止。(重试规则会由网络切换等时间自动触发。)
  • 请在网络通畅的情况下进行相关的初始化调试,如果网络不通,或者App信息配置错误,在onFailed方法中,会有相应的错误码返回,可参考错误处理

启动正常确认方法:

  • 回调方法callback.onSuccess()被调用。以上文接入代码为例,logcat将会打印以下日志:
  1. 11-24 12:55:51.096 15235-15535/com.alibaba.xxxx D/YourApp init cloudchannel success
  • 确认cloudchannel初始化正常,在logcat日志中:输入awcn关键字:
  1. 11-24 12:53:51.036 15235-15556/com.alibaba.xxxx E/awcn |[seq:AWCN1_1] AUTH httpStatusCode: 200
  2. 11-24 12:53:51.036 15235-15556/com.alibaba.xxxx E/awcn |[seq:AWCN1_1] status:AUTH_SUCC

3.6. Android 8.0 及以上 NotificationChannel 机制

请参照 移动推送Android SDK: Android 8.0 以上设备通知接收不到

3.7. Android 9.0 及以上需要设置允许 http 请求

请参照 移动推送 Android : 只在Android 9+系统报错 errorCode:10109