增加阿里云推送

This commit is contained in:
2025-04-24 19:07:21 +08:00
parent 6c4b3ffc8e
commit d913676e60
7 changed files with 343 additions and 4 deletions

View File

@@ -159,12 +159,15 @@ dependencies {
implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0' implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'
implementation 'com.jeremyliao:live-event-bus-x:1.7.3' implementation 'com.jeremyliao:live-event-bus-x:1.7.3'
//MMKV //MMKV
implementation 'com.tencent:mmkv-static:1.2.14' implementation 'com.tencent:mmkv-static:1.2.14'
//bugly //bugly
implementation 'com.tencent.bugly:crashreport:4.1.9.2' implementation 'com.tencent.bugly:crashreport:4.1.9.2'
//xcrash //xcrash
implementation 'com.iqiyi.xcrash:xcrash-android-lib:3.1.0' implementation 'com.iqiyi.xcrash:xcrash-android-lib:3.1.0'
//阿里云推送
implementation 'com.aliyun.ams:alicloud-android-push:3.9.3'
//工具类 //工具类
implementation 'com.blankj:utilcodex:1.31.1' implementation 'com.blankj:utilcodex:1.31.1'
@@ -177,4 +180,6 @@ dependencies {
//沉浸状态栏 //沉浸状态栏
implementation 'com.gitee.zackratos:UltimateBarX:0.8.0' implementation 'com.gitee.zackratos:UltimateBarX:0.8.0'
implementation 'com.github.andywu91:XAPKInstaller:1.0.0' implementation 'com.github.andywu91:XAPKInstaller:1.0.0'
//Java WebSocket
implementation "org.java-websocket:Java-WebSocket:1.5.3"
} }

View File

@@ -44,10 +44,11 @@
<activity <activity
android:name=".activity.upload.UploadActivity" android:name=".activity.upload.UploadActivity"
android:launchMode="singleTask" /> android:launchMode="singleTask" />
<activity android:name=".activity.install.InstallActivity" <activity
android:name=".activity.install.InstallActivity"
android:enabled="true" android:enabled="true"
android:launchMode="singleTop" android:exported="true"
android:exported="true"/> android:launchMode="singleTop" />
<receiver <receiver
android:name=".receiver.InstallResultReceiver" android:name=".receiver.InstallResultReceiver"
@@ -63,6 +64,47 @@
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" /> android:resource="@xml/file_paths" />
</provider> </provider>
<!-- &lt;!&ndash; 消息接收监听器 (用户可自主扩展) &ndash;&gt;-->
<!-- <receiver-->
<!-- android:name=".push.alipush.AliyunMessageReceiver"-->
<!-- android:exported="false">-->
<!-- <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>-->
<service
android:name=".push.alipush.AliMessageIntentService"
android:exported="false">
<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>
</service>
<!-- 请填写你自己的appKey -->
<meta-data
android:name="com.alibaba.app.appkey"
android:value="335514186" />
<!-- 请填写你自己的appSecret -->
<meta-data
android:name="com.alibaba.app.appsecret"
android:value="dc39560b76c54c408ece7dce2f21464f" />
</application> </application>
</manifest> </manifest>

View File

@@ -5,26 +5,49 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.util.Log; 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;
import com.example.mir4updater.BuildConfig; import com.example.mir4updater.BuildConfig;
import com.example.mir4updater.config.CommonConfig;
import com.example.mir4updater.push.alipush.AliMessageIntentService;
import com.example.mir4updater.utils.DevicesUtils;
import com.hjq.toast.Toaster; import com.hjq.toast.Toaster;
import com.tencent.mmkv.MMKV; import com.tencent.mmkv.MMKV;
public class BaseApplication extends Application { public class BaseApplication extends Application implements CommonCallback {
private static final String TAG = BaseApplication.class.getSimpleName(); private static final String TAG = BaseApplication.class.getSimpleName();
CloudPushService mCloudPushService;
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
catchException(); catchException();
} }
String rootDir = MMKV.initialize(this); String rootDir = MMKV.initialize(this);
Log.e(TAG, "mmkv root: " + rootDir); Log.e(TAG, "mmkv root: " + rootDir);
Log.e(TAG, "onCreate: getUuid = " + DevicesUtils.getUuid());
// CrashReport.initCrashReport(getApplicationContext(), "8db7b63e60", false); // CrashReport.initCrashReport(getApplicationContext(), "8db7b63e60", false);
xcrash.XCrash.init(this); xcrash.XCrash.init(this);
Toaster.init(this); Toaster.init(this);
initAliyunPush();
}
private void initAliyunPush() {
PushServiceFactory.init(this);
mCloudPushService = PushServiceFactory.getCloudPushService();
//收到通知不回调logcat有日志加这行代码
mCloudPushService.setPushIntentService(AliMessageIntentService.class); //在这里替换成您自己的service
// if (BuildConfig.DEBUG) {
//仅适用于Debug包正式包不需要此行
mCloudPushService.setLogLevel(CloudPushService.LOG_DEBUG);
// }
mCloudPushService.register(this, this);
} }
private void catchException() { private void catchException() {
@@ -34,6 +57,7 @@ public class BaseApplication extends Application {
public void uncaughtException(Thread t, Throwable e) { public void uncaughtException(Thread t, Throwable e) {
Log.e("捕获异常子线程:", Thread.currentThread().getName() + Log.e("捕获异常子线程:", Thread.currentThread().getName() +
"在:" + e.getStackTrace()[0].getClassName()); "在:" + e.getStackTrace()[0].getClassName());
e.printStackTrace();
} }
} }
); );
@@ -54,4 +78,40 @@ public class BaseApplication extends Application {
} }
@Override
public void onSuccess(String response) {
Log.e("AliyunPush", "init cloudchannel success");
Log.e("AliyunPush", "init cloudchannel success DeviceId = " + mCloudPushService.getDeviceId());
String sn = DevicesUtils.getUuid();
mCloudPushService.bindAccount(sn, new CommonCallback() {
@Override
public void onSuccess(String s) {
Log.e("AliyunPush", "bind account " + sn + " success\n");
}
@Override
public void onFailed(String errorCode, String errorMsg) {
Log.e("AliyunPush", "bind account " + sn + " failed." +
"errorCode: " + errorCode + ", errorMsg:" + errorMsg);
}
});
mCloudPushService.addAlias(sn, new CommonCallback() {
@Override
public void onSuccess(String s) {
Log.e("AliyunPush", "add alias " + sn + " success\n");
}
@Override
public void onFailed(String errorCode, String errorMsg) {
Log.e("AliyunPush", "add alias " + sn + " failed." +
"errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");
}
});
}
@Override
public void onFailed(String errorCode, String errorMessage) {
Log.e("AliyunPush", "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
}
} }

View File

@@ -2,6 +2,9 @@ package com.example.mir4updater.config;
public class CommonConfig { public class CommonConfig {
public static final String MMKV_ID = "InterProcessKV"; public static final String MMKV_ID = "InterProcessKV";
public static final String DEVICE_UUID_KEY = "device_uuid";
public static final String MIR4_PACKAGE_NAME ="com.wemade.mir4global"; public static final String MIR4_PACKAGE_NAME ="com.wemade.mir4global";
public static final String MIR4_CONTENT_PATH = "content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata%2Fcom.wemade.mir4global%2Ffiles"; public static final String MIR4_CONTENT_PATH = "content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata%2Fcom.wemade.mir4global%2Ffiles";

View File

@@ -0,0 +1,102 @@
package com.example.mir4updater.push.alipush;
import android.content.Context;
import android.util.Log;
import com.alibaba.sdk.android.push.AliyunMessageIntentService;
import com.alibaba.sdk.android.push.notification.CPushMessage;
import java.util.Map;
/**
* Created by liyazhou on 17/8/22.
* 为避免推送广播被系统拦截的小概率事件,我们推荐用户通过IntentService处理消息互调,接入步骤:
* 1. 创建IntentService并继承AliyunMessageIntentService
* 2. 覆写相关方法,并在Manifest的注册该Service
* 3. 调用接口CloudPushService.setPushIntentService
* 详细用户可参考:https://help.aliyun.com/document_detail/30066.html#h2-2-messagereceiver-aliyunmessageintentservice
*/
public class AliMessageIntentService extends AliyunMessageIntentService {
private static final String TAG = "AliyunMessageIntentService";
/**
* 推送通知的回调方法
*
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
protected void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
Log.i(TAG, "收到一条推送通知 " + title + ", summary:" + summary);
}
/**
* 推送消息的回调方法
*
* @param context
* @param cPushMessage
*/
@Override
protected void onMessage(Context context, CPushMessage cPushMessage) {
Log.i(TAG, "收到一条推送消息 " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
String title = cPushMessage.getTitle();
String content = cPushMessage.getContent();
}
/**
* 从通知栏打开通知的扩展处理
*
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
protected void onNotificationOpened(Context context, String title, String summary, String extraMap) {
Log.i(TAG, "onNotificationOpened " + " : " + title + " : " + summary + " : " + extraMap);
}
/**
* 无动作通知点击回调。当在后台或阿里云控制台指定的通知动作为无逻辑跳转时,通知点击回调为onNotificationClickedWithNoAction而不是onNotificationOpened
*
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
Log.i(TAG, "onNotificationClickedWithNoAction " + " : " + title + " : " + summary + " : " + extraMap);
}
/**
* 通知删除回调
*
* @param context
* @param messageId
*/
@Override
protected void onNotificationRemoved(Context context, String messageId) {
Log.i(TAG, "onNotificationRemoved " + messageId);
}
/**
* 应用处于前台时通知到达回调。注意:该方法仅对自定义样式通知有效,相关详情请参考https://help.aliyun.com/document_detail/30066.html#h3-3-4-basiccustompushnotification-api
*
* @param context
* @param title
* @param summary
* @param extraMap
* @param openType
* @param openActivity
* @param openUrl
*/
@Override
protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
Log.i(TAG, "onNotificationReceivedInApp " + " : " + title + " : " + summary + " " + extraMap + " : " + openType + " : " + openActivity + " : " + openUrl);
}
}

View File

@@ -0,0 +1,105 @@
package com.example.mir4updater.push.alipush;
import android.content.Context;
import android.util.Log;
import com.alibaba.sdk.android.push.MessageReceiver;
import com.alibaba.sdk.android.push.notification.CPushMessage;
import java.util.Map;
/**
* @author: 正纬
* @since: 15/4/9
* @version: 1.1
* @feature: 用于接收推送的通知和消息
*/
public class AliyunMessageReceiver extends MessageReceiver {
// 消息接收部分的LOG_TAG
public static final String TAG = "AliyunMessageReceiver";
/**
* 推送通知的回调方法
*
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
// TODO 处理推送通知
if (null != extraMap) {
for (Map.Entry<String, String> entry : extraMap.entrySet()) {
Log.i(TAG, "@Get diy param : Key=" + entry.getKey() + " , Value=" + entry.getValue());
}
} else {
Log.i(TAG, "@收到通知 && 自定义消息为空");
}
Log.i(TAG, "收到一条推送通知 " + title + ", summary:" + summary);
}
/**
* 应用处于前台时通知到达回调。注意:该方法仅对自定义样式通知有效,相关详情请参考https://help.aliyun.com/document_detail/30066.html?spm=5176.product30047.6.620.wjcC87#h3-3-4-basiccustompushnotification-api
*
* @param context
* @param title
* @param summary
* @param extraMap
* @param openType
* @param openActivity
* @param openUrl
*/
@Override
protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
Log.i(TAG, "onNotificationReceivedInApp " + " : " + title + " : " + summary + " " + extraMap + " : " + openType + " : " + openActivity + " : " + openUrl);
}
/**
* 推送消息的回调方法
*
* @param context
* @param cPushMessage
*/
@Override
public void onMessage(Context context, CPushMessage cPushMessage) {
Log.i(TAG, "收到一条推送消息 " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
}
/**
* 从通知栏打开通知的扩展处理
*
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
Log.i(TAG, "onNotificationOpened " + " : " + title + " : " + summary + " : " + extraMap);
}
/**
* 通知删除回调
*
* @param context
* @param messageId
*/
@Override
public void onNotificationRemoved(Context context, String messageId) {
Log.i(TAG, "onNotificationRemoved " + messageId);
}
/**
* 无动作通知点击回调。当在后台或阿里云控制台指定的通知动作为无逻辑跳转时,通知点击回调为onNotificationClickedWithNoAction而不是onNotificationOpened
*
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
Log.i(TAG, "onNotificationClickedWithNoAction " + " : " + title + " : " + summary + " : " + extraMap);
}
}

View File

@@ -0,0 +1,22 @@
package com.example.mir4updater.utils;
import android.text.TextUtils;
import com.example.mir4updater.config.CommonConfig;
import com.tencent.mmkv.MMKV;
import java.util.UUID;
public class DevicesUtils {
public static String getUuid() {
MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
String uuid = mmkv.decodeString(CommonConfig.DEVICE_UUID_KEY, "");
if (TextUtils.isEmpty(uuid)) {
String id = UUID.randomUUID().toString().replace("-", ""); // 生成无连字符的32位UUID
mmkv.encode(CommonConfig.DEVICE_UUID_KEY, id);
return id;
} else {
return uuid;
}
}
}