天天看点

Android 之 阿里百川 -- 云消息推送服务

Android SDK 3.0配置

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

Android参考Demo。

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

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

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

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

1.在Project根目录下build.gradle文件中配置maven库URL:

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}
           

2.在对应的module下的build.gradle文件中添加对应依赖

android {
    ......
    defaultConfig {
        applicationId "com.xxx.xxx" //包名
        ......
        ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi', 'x86'
        }
        ......
    }
    ......
}
dependencies {
    ......
    compile 'com.aliyun.ams:alicloud-android-push:[email protected]'
    compile 'com.aliyun.ams:alicloud-android-utdid:1.1.5.3'
    compile 'com.aliyun.ams:alicloud-android-ut:5.1.0'
    ......
}
           

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

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

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

二、手动集成

1.手动拷贝libs/armeabi,libs/x86,alisdk-ut.jar,utdid4all.jar,alicloud-android-push.jar到工程下libs目录

2.APP工程的build.gradle中配置jniLibs的目录

3.aar文件引入

Android 之 阿里百川 -- 云消息推送服务
android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
repositories {
    flatDir {
        dirs 'libs' //this way we can find the .aar file in libs folder
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile(name: 'huawei-xiaomi-support-3.0.0', ext: 'aar')
    compile files('libs/alicloud-android-push-sdk-3.0.11.jar')
}
           

三、AndroidManifest配置

3.1 appKey, appSecret配置

在AndroidManifest文件中设置appKey,appSecret:

<application android:name="*****">
    <meta-data android:name="com.alibaba.app.appkey"
     android:value="*****"/> <!-- 请填写你自己的- appKey -->
    <meta-data android:name="com.alibaba.app.appsecret" 
    android:value="****"/> <!-- 请填写你自己的appSecret -->
</application>
           

如果您是百川云推送用户,不能直接使用百川平台的appKey和appSecret,需要登录阿里云移动推送控制台,登录账号为您的百川平台账号,并使用阿里云平台的appKey,appSecret。

3.2 Permission配置(Maven库快速集成可跳过)

<!-- 阿里云推送相关权限 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
           

3.3 其他组件配置(Maven库快速集成可跳过)

<!-- Push SDK 相关组件,required-->
        <!-- 消息接收服务 -->
        <service
            android:name="com.alibaba.sdk.android.push.MsgService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.alibaba.sdk.android.push.NOTIFY_ACTION" />
            </intent-filter>
        </service>
        <service android:name="com.alibaba.sdk.android.push.channel.CheckService"
            android:process=":channel">
            <intent-filter>
                <action android:name="com.alibaba.sdk.android.push.CHECK_SERVICE" />
            </intent-filter>
        </service>
        <service android:name="com.taobao.accs.ChannelService"
            android:exported="true" android:process=":channel">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.SERVICE"/>
            </intent-filter>
        </service>
        <service
            android:name="com.taobao.accs.ChannelService$KernelService"
            android:exported="false"
            android:process=":channel" >
        </service>
        <service android:name="com.taobao.accs.data.MsgDistributeService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.RECEIVE" />
            </intent-filter>
        </service>
        <receiver android:name="com.taobao.accs.EventReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.taobao.accs.ServiceReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.COMMAND"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.START_FROM_AGOO"/>
            </intent-filter>
        </receiver>
        <service android:name="org.android.agoo.accs.AgooService"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.RECEIVE" />
            </intent-filter>
        </service>
        <service android:name="com.alibaba.sdk.android.push.AliyunPushIntentService"
            android:exported="true"
            >
            <intent-filter>
                <action <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
            </intent-filter>
        </service>
        <receiver
            android:name="com.taobao.agoo.AgooCommondReceiver"
            android:process=":channel"
            android:exported="true" >
            <intent-filter>
                <action android:name="${applicationId}.intent.action.COMMAND" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <service
            android:name="com.alibaba.sdk.android.push.channel.TaobaoRecvService"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="org.android.agoo.client.MessageReceiverService" />
            </intent-filter>
        </service>
        <!-- V3.0.7及以上版本需配置 -->
        <service android:name="com.alibaba.sdk.android.push.channel.KeepChannelService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":channel" />
        <receiver android:name="com.alibaba.sdk.android.push.SystemEventReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
            </intent-filter>
        </receiver>
        <!-- V3.0.9及以上版本需配置 -->
        <activity
            android:name="com.alibaba.sdk.android.push.keeplive.PushExtActivity"
            android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
            android:excludeFromRecents="true"
            android:exported="false"
            android:finishOnTaskLaunch="false"
            android:launchMode="singleInstance"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
            android:process=":channel"
            >
        </activity>
           

3.4 消息接收Receiver配置

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

public class MyMessageReceiver extends MessageReceiver {
    // 消息接收部分的LOG_TAG
    public static final String REC_TAG = "receiver";
    @Override
    public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
        // TODO 处理推送通知
        Log.e("MyMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
    }
    @Override
    public void onMessage(Context context, CPushMessage cPushMessage) {
            Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
    }
    @Override
    public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
        Log.e("MyMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
    }
    @Override
    protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
        Log.e("MyMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
    }
    @Override
    protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
        Log.e("MyMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);
    }
    @Override
    protected void onNotificationRemoved(Context context, String messageId) {
        Log.e("MyMessageReceiver", "onNotificationRemoved");
    }
}
           

将该receiver添加到AndroidManifest.xml中

<!-- 消息接收监听器 (用户可自主扩展) -->
<receiver
    android:name=".MyMessageReceiver"
    android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
    </intent-filter>
</receiver>
           

3.5. Proguard配置

-keepclasseswithmembernames class ** {
    native <methods>;
}
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-keep class com.ut.** {*;}
-keep class com.ta.** {*;}
-keep class anet.**{*;}
-keep class anetwork.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-keep class android.os.**{*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.**
-dontwarn com.ta.**
           

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

首先通过PushServiceFactory获取到CloudPushService,然后调用register()初始化并注册云推送通道,并确保Application上下文中进行初始化工作。

请参照以下代码段进行初始化:

public class MainApplication extends Application {
    private static final String TAG = "Init";
    @Override
    public void onCreate() {
        super.onCreate();
        initCloudChannel(this);
    }
    /**
     * 初始化云推送通道
     * @param applicationContext
     */
    private void initCloudChannel(Context applicationContext) {
        PushServiceFactory.init(applicationContext);
        CloudPushService pushService = PushServiceFactory.getCloudPushService();
        pushService.register(applicationContext, new CommonCallback() {
            @Override
            public void onSuccess(String response) {
                Log.d(TAG, "init cloudchannel success");
            }
            @Override
            public void onFailed(String errorCode, String errorMessage) {
                Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
            }
        });
    }
}
           

【注意】:

1.移动推送的初始化必须在Application中,不能放到Activity中执行。移动推送在初始化过程中将启动后台进程channel,必须保证应用进程和channel进程都执行到推送初始化代码。

2.如果设备成功注册,将回调callback.onSuccess()方法。

3.但如果注册服务器连接失败,则调用callback.onFailed方法,并且自动进行重新注册,直到onSuccess为止。(重试规则会由网络切换等时间自动触发。)

4.请在网络通畅的情况下进行相关的初始化调试,如果网络不通,或者App信息配置错误,在onFailed方法中,会有相应的错误码返回,可参考错误处理。

ERROR CODE:

https://help.aliyun.com/document_detail/42633.html?spm=5176.doc51056.2.12.3hH3lU