Android 集成阿里云移动推送

该博客不为学术讨论,仅是记录,方便以后用到快速集成开发,有兴趣者可以mark一下以备使用。当然也为推送的小白提供方便。

因为公司内部有第三方安全检测机构,所以用某光推送时,因为极光推送原理是会通过其他集成了某光推送的App通道来推送,所以经常审核被pass,所以采用了阿里云移动推送。

前置步骤:

1. 登录阿里云官网,开通服务

 2. 创建工作空间

这里随便输入工作空间名字,看你自己的想法

 3.添加应用

 这个就不用过多累述了吧,输入应用名称,包名,图标(后期建议不要更改了,不然还得改配置文件)

 记得下载这个  aliyun-emas-services.json 配置文件

 

 二、Android端集成(总算进入代码部分)

1.各种集成

在外部的build.gradle中添加如下代码 , 自己比着添加吧,不要傻傻都复制

buildscript {
    repositories {
        google()
        mavenCentral()
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.2"
        //添加emas-services插件
        classpath "com.aliyun.ams:emas-services:1.0.1"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() 
        //分界线
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
        // 配置HMS Core SDK的Maven仓地址。
        maven {
            url 'https://developer.huawei.com/repo/'
        }
    }
}

2. gradle.properties文件添加如下

android.useDeprecatedNdk=true
//下面这个看情况,我是用于 我这边构建的时候总会提示AndroidMainfest.xml merge错误,需要在
//application 下添加 tools:replace="allowBackup",与这个配合就行了,正常情况下不需要加下面这行
android.enableJetifier=true

3. 把之前下载的aliyun-emas-services.json放到app目录下

 4. 在app目录下的buildl.gradle下配置如下

plugins {
    id 'com.android.application'
    //配置阿里云插件
    id 'com.aliyun.ams.emas-services'
}

android {
    compileSdkVersion 30

    defaultConfig {
        ...
        //配置ndk
        ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi-v8a','armeabi','armeabi-v7a','mips','mips64','x86','x86_64'
        }
    }

    ...
}

dependencies {

    ...
    //添加阿里云推送依赖,版本看你现在用的是多少版本
    compile 'com.aliyun.ams:alicloud-android-push:3.4.0'
}

 5. 编写MyApplication,用于软件一启动初始化并注册推送


import android.app.Application;
import android.content.Context;
import android.util.Log;
import com.alibaba.sdk.android.push.CloudPushService;
import com.alibaba.sdk.android.push.CommonCallback;
import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;

public class MyApplication 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);
            }
        });
    }
}

6. 编写接收者MyMessageReceiver


import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.util.Log;

import com.alibaba.sdk.android.push.MessageReceiver;
import com.alibaba.sdk.android.push.notification.CPushMessage;

import java.util.Map;

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);
            //这里是针对高版本安卓部分7.0以上和8.0以上收不到通知的做法,加入channel渠道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            // 通知渠道的id。
            String id = "1";
            // 用户可以看到的通知渠道的名字。
            CharSequence name = "notification channel";
            // 用户可以看到的通知渠道的描述。
            String description = "notification description";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel mChannel = new NotificationChannel(id, name, importance);
            // 配置通知渠道的属性。
            mChannel.setDescription(description);
            // 设置通知出现时的闪灯(如果Android设备支持的话)。
            mChannel.enableLights(true);
            mChannel.setLightColor(Color.RED);
            // 设置通知出现时的震动(如果Android设备支持的话)。
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            // 最后在notificationmanager中创建该通知渠道。
            mNotificationManager.createNotificationChannel(mChannel);
        }
    }
    @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");
    }
}

7. 最后在清单文件AndroidMainfest.xml中配置,权限可配可不配,因为依赖中已经申请了这些权限,注意:对于oppo手机和vivo手机,我记得通知默认是不打开的,所以需要开启后测试

<!-- 阿里云推送相关权限 -->
    <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.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.REORDER_TASKS"/>
    <!-- 接收推送主要权限 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

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

   ...
   <!-- 消息接收监听器 (用户可自主扩展) -->
        <receiver
            android:name=".receiver.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>
    </application>

到此全部结束,至于你的秘钥在哪,到阿里云控制台,点击一下你的应用就能看到了

三、测试

还要一点要注意,推送通知里,由于高版本需要设置channelId,所以选择推送通知里的高级设置输入chennelId即可,在上面代码里,我写的channelId是1

记得看下它的定价:

本人个人原创,如有雷同,纯属巧合,或者与本人联系,做改动。请转载或者CV组合标明出处,谢谢!(如有疑问或错误欢迎指出,本人QQ:752231513)

猜你喜欢

转载自blog.csdn.net/qq_30548105/article/details/120021178