From 03437c35a42d072975789a633418f3068ef347e5 Mon Sep 17 00:00:00 2001 From: wangxiang <1827945911@qq.com> Date: Tue, 9 Jan 2024 17:15:38 +0800 Subject: [PATCH] test --- app/build.gradle | 8 - app/proguard-app.pro | 13 +- app/src/main/AndroidManifest.xml | 49 +---- .../com/kanglai/push/app/AppApplication.java | 41 +--- .../kanglai/push/constant/CacheConstant.java | 10 +- .../kanglai/push/constant/CommonConstant.java | 6 +- .../push/offline/HuaWeiHmsMessageService.java | 201 ------------------ .../push/ui/activity/AuroraActivity.java | 31 --- .../push/ui/activity/InstantActivity.java | 16 +- .../push/ui/activity/MfrMessageActivity.java | 72 ------- .../push/ui/activity/PushTypeActivity.java | 13 -- .../fragment/DemoAppKeepActiveFragment.java | 131 ------------ .../push/ui/fragment/MessageFragment.java | 4 +- .../push/ui/fragment/UserFragment.java | 4 - app/src/main/res/layout/activity_aurora.xml | 21 -- .../main/res/layout/activity_push_type.xml | 14 -- .../main/res/layout/mfr_message_layout.xml | 25 --- config.gradle | 22 -- library/core/proguard-core.pro | 22 -- library/core/src/main/AndroidManifest.xml | 12 -- .../dolphin/core/constant/AppConstant.java | 12 -- .../com/dolphin/core/entity/DolphinUser.java | 119 ----------- .../dolphin/core/service/AppKeepActive.java | 174 --------------- .../BackgroundKeepActiveFrontService.java | 99 --------- library/core/src/main/res/raw/media_lock.wav | Bin 441044 -> 0 bytes library/umeng/build.gradle | 10 - library/umeng/src/main/AndroidManifest.xml | 22 -- .../java/com/dolphin/umeng/UmengClient.java | 87 ++++---- .../com/dolphin/umeng/entity/ChatMsg.java | 50 ----- .../com/dolphin/umeng/entity/CustomMsg.java | 81 ------- .../dolphin/umeng/entity/CustomMsgDemo.java | 56 ----- .../dolphin/umeng/entity/PushChatMessage.java | 65 ++++++ .../com/dolphin/umeng/util/BaiduTtsUtil.java | 92 ++++++++ .../dolphin/umeng/util/MultimediaUtil.java | 42 ++++ .../dolphin/umeng/util/PushTypeHandle.java | 105 --------- .../dolphin/umeng/util/TtsSyntherizer.java | 116 ---------- library/umeng/src/main/res/xml/file_paths.xml | 3 - maven.gradle | 1 - 38 files changed, 253 insertions(+), 1596 deletions(-) delete mode 100644 app/src/main/java/com/kanglai/push/offline/HuaWeiHmsMessageService.java delete mode 100644 app/src/main/java/com/kanglai/push/ui/activity/AuroraActivity.java delete mode 100644 app/src/main/java/com/kanglai/push/ui/activity/MfrMessageActivity.java delete mode 100644 app/src/main/java/com/kanglai/push/ui/fragment/DemoAppKeepActiveFragment.java delete mode 100644 app/src/main/res/layout/activity_aurora.xml delete mode 100644 app/src/main/res/layout/mfr_message_layout.xml delete mode 100644 library/core/src/main/java/com/dolphin/core/entity/DolphinUser.java delete mode 100644 library/core/src/main/java/com/dolphin/core/service/AppKeepActive.java delete mode 100644 library/core/src/main/java/com/dolphin/core/service/BackgroundKeepActiveFrontService.java delete mode 100644 library/core/src/main/res/raw/media_lock.wav delete mode 100644 library/umeng/src/main/java/com/dolphin/umeng/entity/ChatMsg.java delete mode 100644 library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsg.java delete mode 100644 library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsgDemo.java create mode 100644 library/umeng/src/main/java/com/dolphin/umeng/entity/PushChatMessage.java create mode 100644 library/umeng/src/main/java/com/dolphin/umeng/util/BaiduTtsUtil.java create mode 100644 library/umeng/src/main/java/com/dolphin/umeng/util/MultimediaUtil.java delete mode 100644 library/umeng/src/main/java/com/dolphin/umeng/util/PushTypeHandle.java delete mode 100644 library/umeng/src/main/java/com/dolphin/umeng/util/TtsSyntherizer.java diff --git a/app/build.gradle b/app/build.gradle index 2a75cf8..0531e8e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,12 +12,6 @@ android { // 混淆配置 proguardFiles 'proguard-app.pro' - - // 清单占位符 - addManifestPlaceholders([ - 'AMAP_KEY' : AMAP_KEY, - 'HUAWEI_APP_ID' : HUAWEI_APP_ID - ]) } // 签名参考: https://www.jianshu.com/p/a1f8e5896aa2 @@ -123,6 +117,4 @@ dependencies { implementation DEPENDENCIES['x-banner'] implementation DEPENDENCIES['switch-button'] implementation DEPENDENCIES['aurora-imui'] - implementation 'com.umeng.umsdk:huawei-umengaccs:2.0.0' - implementation 'com.huawei.hms:push:6.9.0.300' } diff --git a/app/proguard-app.pro b/app/proguard-app.pro index 5c93ab1..fcd56cb 100644 --- a/app/proguard-app.pro +++ b/app/proguard-app.pro @@ -71,15 +71,4 @@ # 禁止类名混淆,否则通过类名称找不到类 -keep class com.kanglai.push.entity.**{*;} -keep class com.kanglai.push.ui.activity.**{*;} --keep class com.kanglai.push.ui.fragment.**{*;} - -# 禁止华为厂商混淆 --ignorewarnings --keepattributes *Annotation* --keepattributes Exceptions --keepattributes InnerClasses --keepattributes Signature --keepattributes SourceFile,LineNumberTable --keep class com.huawei.hianalytics.**{*;} --keep class com.huawei.updatesdk.**{*;} --keep class com.huawei.hms.**{*;} \ No newline at end of file +-keep class com.kanglai.push.ui.fragment.**{*;} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 35668a3..caed283 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ package="com.kanglai.push"> + @@ -24,17 +25,9 @@ - - - - - - - - @@ -54,18 +47,6 @@ tools:replace="android:label" tools:targetApi="q"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/kanglai/push/app/AppApplication.java b/app/src/main/java/com/kanglai/push/app/AppApplication.java index c762503..4c85d9d 100644 --- a/app/src/main/java/com/kanglai/push/app/AppApplication.java +++ b/app/src/main/java/com/kanglai/push/app/AppApplication.java @@ -1,24 +1,15 @@ package com.kanglai.push.app; -import android.content.Intent; -import android.text.TextUtils; - import androidx.core.content.ContextCompat; -import com.blankj.utilcode.util.CacheDiskUtils; -import com.blankj.utilcode.util.LogUtils; import com.bumptech.glide.Glide; import com.dolphin.core.BuildConfig; import com.dolphin.core.base.BaseApplication; import com.dolphin.core.crash.CaocConfig; import com.dolphin.umeng.UmengClient; -import com.huawei.hms.aaid.HmsInstanceId; -import com.huawei.hms.common.ApiException; import com.kanglai.push.R; -import com.kanglai.push.constant.CacheConstant; import com.kanglai.push.di.component.AppComponent; import com.kanglai.push.di.component.DaggerAppComponent; -import com.kanglai.push.offline.HuaWeiHmsMessageService; import com.kanglai.push.ui.activity.LoginActivity; import com.kanglai.push.util.TimeFormatUtil; import com.kongzue.dialogx.DialogX; @@ -28,8 +19,6 @@ import com.scwang.smart.refresh.header.ClassicsHeader; import com.scwang.smart.refresh.layout.SmartRefreshLayout; import com.tencent.bugly.crashreport.CrashReport; -import org.android.agoo.huawei.HuaWeiRegister; - import javax.inject.Inject; import io.github.inflationx.calligraphy3.CalligraphyConfig; @@ -113,7 +102,8 @@ public class AppApplication extends BaseApplication { .setPrimaryColor(ContextCompat.getColor(this, R.color.common_app_them)) .setAccentColor(ContextCompat.getColor(this, R.color.white)); }); - // 第三方 Kongzue DialogX 初始化 + + // 第三方 DialogX 初始化 // https://github.com/kongzue/DialogX/wiki/ DialogX.init(this); DialogX.DEBUGMODE = true; // 开启调试模式 @@ -123,33 +113,6 @@ public class AppApplication extends BaseApplication { DialogX.enterAnimDuration = 100; DialogX.exitAnimDuration = 100; // 动画完成时间 - // 检查华为token - String huawei_token = CacheDiskUtils.getInstance().getString(CacheConstant.HUAWEI_TOKEN, ""); - - if (TextUtils.isEmpty(huawei_token)) HuaweiPushUtils(); // 当华为token为空时才申请华为token - } - - private void HuaweiPushUtils() { - // 获取华为设备token - // https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References/hms-instanceid-0000001050255634#section1796315281618 - new Thread(new Runnable() { - @Override - public void run() { - HmsInstanceId instanceId = HmsInstanceId.getInstance(AppApplication.this); - try { - String huawei_token = instanceId.getToken("108750031", "HCM"); - if (!TextUtils.isEmpty(huawei_token)) { - // 当设备为华为时 才会有华为token 设备token不为空时启动服务 - LogUtils.d("HUAWEI_HMS_TOKEN " + huawei_token); - CacheDiskUtils.getInstance().put(CacheConstant.HUAWEI_TOKEN, huawei_token); - Intent serviceIntent = new Intent(getApplicationContext(), HuaWeiHmsMessageService.class); - getApplicationContext().startForegroundService(serviceIntent); - } - } catch (ApiException e) { - e.printStackTrace(); - } - } - }).start(); } @Override diff --git a/app/src/main/java/com/kanglai/push/constant/CacheConstant.java b/app/src/main/java/com/kanglai/push/constant/CacheConstant.java index 797baa3..80a35a1 100644 --- a/app/src/main/java/com/kanglai/push/constant/CacheConstant.java +++ b/app/src/main/java/com/kanglai/push/constant/CacheConstant.java @@ -1,9 +1,5 @@ package com.kanglai.push.constant; -import com.blankj.utilcode.util.CacheDiskUtils; -import com.kanglai.push.entity.User; -import com.tencent.mmkv.MMKV; - /** *

* 缓存常量 @@ -13,6 +9,7 @@ import com.tencent.mmkv.MMKV; * @since: 2022/10/21 */ public interface CacheConstant { + /** 登录名称存储键 */ String LOGIN_USERNAME = "LOGIN_USERNAME"; @@ -25,9 +22,4 @@ public interface CacheConstant { /** 当前用户信息 */ String USER_INFO = "USER_INFO"; - /** 华为token存储键 只有应用安装后调用一次 */ - String HUAWEI_TOKEN = "HUAWEI_TOKEN"; - - /** 通知设置-app内消息弹窗 - 默认打开*/ - String NOTIFICATION_APP_POP_UP = "NOTIFICATION_APP_POP_UP"; } diff --git a/app/src/main/java/com/kanglai/push/constant/CommonConstant.java b/app/src/main/java/com/kanglai/push/constant/CommonConstant.java index 9aa6b60..c79bc8c 100644 --- a/app/src/main/java/com/kanglai/push/constant/CommonConstant.java +++ b/app/src/main/java/com/kanglai/push/constant/CommonConstant.java @@ -18,9 +18,6 @@ public interface CommonConstant { /** oss文件预览地址 */ String OSS_FILE_URL = BuildConfig.HOST_URL+"system_proxy/system/file/getFile/%s/%s"; - /** 路线规划经纬度 */ - String ROUTE_PLAN_LAT_POINT = "ROUTE_PLAN_LAT_POINT"; - /** 基础用户id */ String USER_LINK_ID = "USER_LINK_ID"; @@ -32,9 +29,12 @@ public interface CommonConstant { */ String USER_LINK_TYPE = "USER_LINK_TYPE"; + /** app 端登录租户id 默认为长沙康来租户id */ String MULTI_TENANT_ID = "1510456530575347712"; + /** app 端登录用户类型 */ String ID_ENTITY_PROVIDER = "app"; + } diff --git a/app/src/main/java/com/kanglai/push/offline/HuaWeiHmsMessageService.java b/app/src/main/java/com/kanglai/push/offline/HuaWeiHmsMessageService.java deleted file mode 100644 index 1c53c29..0000000 --- a/app/src/main/java/com/kanglai/push/offline/HuaWeiHmsMessageService.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.kanglai.push.offline; - -import android.content.Intent; -import android.widget.RemoteViews; - -import com.blankj.utilcode.util.LogUtils; -import com.dolphin.core.util.NotificationUtil; -import com.huawei.hms.push.HmsMessageService; -import com.huawei.hms.push.RemoteMessage; -import com.huawei.hms.push.SendException; - -import java.util.Arrays; - -/** - * 华为离线服务 - * - * 仅用于接收透传消息、获取Token(可删除) - * @Author: liusixiang007 - * @since: 2023/7/24 - */ -public class HuaWeiHmsMessageService extends HmsMessageService { - private static final String TAG = "HuaWeiHmsMessageServiceLog"; - private final static String CODELABS_ACTION = "com.dolphin.umeng.service.action"; - - @Override - public void onNewToken(String token) { - super.onNewToken(token); - LogUtils.d(TAG, "received refresh token:" + token); - if (token == null) { - // 这个方法回调必须在10秒内完成。否则,您需要启动一个新的Job进行回调处理。 - refreshedTokenToServer(token); - } - - LogUtils.d("huaweiseriver-onNewToken"); - Intent intent = new Intent(); - intent.setAction(CODELABS_ACTION); - intent.putExtra("method", "onNewToken"); - intent.putExtra("msg", "onNewToken called, token: " + token); - sendBroadcast(intent); // 进行广播通讯 - } - - private void refreshedTokenToServer(String token) { - LogUtils.i(TAG, "sending token to server. token:" + token); - } - - /** - * 接收服务端推送的透传消息 - * - * 该方法回调必须在10秒内完成。否则,需要启动一个新的Job进行回调处理。 - * @param message - */ - @Override - public void onMessageReceived(RemoteMessage message) { - super.onMessageReceived(message); - - // 判断消息是否为空 - if (message == null) { - LogUtils.e(TAG, "接收的华为推送数据为空!"); - return; - } - // 透传的消息数据 - LogUtils.i(TAG, "get Data: " + message.getData() - + "\n getFrom: " + message.getFrom() - + "\n getTo: " + message.getTo() - + "\n getMessageId: " + message.getMessageId() - + "\n getSentTime: " + message.getSentTime() - + "\n getDataMap: " + message.getDataOfMap() - + "\n getMessageType: " + message.getMessageType() - + "\n getTtl: " + message.getTtl() - + "\n getToken: " + message.getToken()); - -// LogUtils.i(TAG, "getCollapseKey: " + message.getCollapseKey() -// + "\n getData: " + message.getData() -// + "\n getFrom: " + message.getFrom() -// + "\n getTo: " + message.getTo() -// + "\n getMessageId: " + message.getMessageId() -// + "\n getMessageType: " + message.getMessageType() -// + "\n getSendTime: " + message.getSentTime() -// + "\n getTtl: " + message.getTtl() -// + "\n getSendMode: " + message.getSendMode() -// + "\n getReceiptMode: " + message.getReceiptMode() -// + "\n getOriginalUrgency: " + message.getOriginalUrgency() -// + "\n getUrgency: " + message.getUrgency() -// + "\n getToken: " + message.getToken()); - // getBody()获取消息的显示内容 - // getTitle()获取消息的标题 - // getTitleLocalizationKey()获取通知消息显示标题的键。 - // getTitleLocalizationArgs()获取消息显示标题的可变参数 - // getBodyLocalizationkey() - // 获取消息显示内容的密钥getBodyLocalizationArgs() - // 获取消息显示内容的可变参数getIcon() - // 从消息中获取图标getSound() - // 从消息中获取声音getTag() - // 从消息中获取用于消息覆盖的标记 - // getColor()获取消息中图标的颜色 - // getClickAction()获取由消息点击触发的操作 - // getChannelId()获取支持显示消息的通道的 - // idgetImageUr1()从消息中获取图像 - // URLgetLink()从消息获取要访问的URL - // getNotifyId()获取消息的唯一ID - - RemoteMessage.Notification notification = message.getNotification(); - if (notification != null) { - LogUtils.i(TAG, "\n getTitle: " + notification.getTitle() - + "\n getTitleLocalizationKey: " + notification.getTitleLocalizationKey() - + "\n getTitleLocalizationArgs: " + Arrays.toString(notification.getTitleLocalizationArgs()) - + "\n getBody: " + notification.getBody() - + "\n getBodyLocalizationKey: " + notification.getBodyLocalizationKey() - + "\n getBodyLocalizationArgs: " + Arrays.toString(notification.getBodyLocalizationArgs()) - + "\n getIcon: " + notification.getIcon() - + "\n getImageUrl: " + notification.getImageUrl() - + "\n getSound: " + notification.getSound() - + "\n getTag: " + notification.getTag() - + "\n getColor: " + notification.getColor() - + "\n getClickAction: " + notification.getClickAction() - + "\n getIntentUri: " + notification.getIntentUri() - + "\n getChannelId: " + notification.getChannelId() - + "\n getLink: " + notification.getLink() - + "\n getNotifyId: " + notification.getNotifyId() - + "\n isDefaultLight: " + notification.isDefaultLight() - + "\n isDefaultSound: " + notification.isDefaultSound() - + "\n isDefaultVibrate: " + notification.isDefaultVibrate() - + "\n getWhen: " + notification.getWhen() - + "\n getLightSettings: " + Arrays.toString(notification.getLightSettings()) - + "\n isLocalOnly: " + notification.isLocalOnly() - + "\n getBadgeNumber: " + notification.getBadgeNumber() - + "\n isAutoCancel: " + notification.isAutoCancel() - + "\n getImportance: " + notification.getImportance() - + "\n getTicker: " + notification.getTicker() - + "\n getVibrateConfig: " + Arrays.toString(notification.getVibrateConfig()) - + "\n getVisibility: " + notification.getVisibility()); - } - - RemoteViews customNotificationView = new RemoteViews(getApplicationContext().getPackageName(), com.dolphin.umeng.R.layout.layout_notification_view); - customNotificationView.setTextViewText(com.dolphin.umeng.R.id.notification_title, notification.getTitle()); - customNotificationView.setTextViewText(com.dolphin.umeng.R.id.notification_text, notification.getBody()); -// customNotificationView.setImageViewBitmap(com.dolphin.umeng.R.id.notification_large_icon, getLargeIcon(context, msg)); -// customNotificationView.setImageViewResource(com.dolphin.umeng.R.id.notification_small_icon, getSmallIconId(context, msg)); - NotificationUtil.defaultNotificationBuilder().setCustomHeadsUpContentView(customNotificationView).build(); - - Intent intents = new Intent(); - intents.setAction(CODELABS_ACTION); - intents.putExtra("method", "onMessageReceived"); - intents.putExtra("msg", "onMessageReceived called, message id:" + message.getMessageId() + ", payload data:" + message.getData()); - - sendBroadcast(intents); - - Boolean judgeWhetherIn10s = false; - - // 如果10秒内没有处理完消息,应用程序需要使用WorkManager进行处理。 - if (judgeWhetherIn10s) { - startWorkManagerJob(message); - } else { - // 10秒内处理消息 - processWithin10s(message); - } - } - - private void processWithin10s(RemoteMessage message) { - LogUtils.d(TAG, "Processing now."); - } - - private void startWorkManagerJob(RemoteMessage message) { - LogUtils.d(TAG, "Start new Job processing."); - } - - @Override - public void onMessageSent(String msgId) { - LogUtils.i(TAG, "onMessageSent called, Message id:" + msgId); - super.onMessageSent(msgId); - LogUtils.d("huaweiseriver-onNewToken"); - Intent intent = new Intent(); - intent.setAction(CODELABS_ACTION); - intent.putExtra("method", "onMessageSent"); - intent.putExtra("msg", "onMessageSent called, Message id:" + msgId); - sendBroadcast(intent); - } - - @Override - public void onSendError(String s, Exception e) { - super.onSendError(s, e); - LogUtils.i(TAG, "onSendError called, message id:" + s + ", ErrCode:" - + ((SendException) e).getErrorCode() + ", description:" + e.getMessage()); - - LogUtils.d("huaweiseriver-onNewToken"); - Intent intent = new Intent(); - intent.setAction(CODELABS_ACTION); - intent.putExtra("method", "onSendError"); - intent.putExtra("msg", "onSendError called, message id:" + s + ", ErrCode:" - + ((SendException) e).getErrorCode() + ", description:" + e.getMessage()); - - sendBroadcast(intent); - } - - @Override - public void onTokenError(Exception e) { - super.onTokenError(e); - // 获取失败触发 - LogUtils.d("onTokenError:"+e); - } -} diff --git a/app/src/main/java/com/kanglai/push/ui/activity/AuroraActivity.java b/app/src/main/java/com/kanglai/push/ui/activity/AuroraActivity.java deleted file mode 100644 index 197d252..0000000 --- a/app/src/main/java/com/kanglai/push/ui/activity/AuroraActivity.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.kanglai.push.ui.activity; - -import android.os.Bundle; -import android.os.PersistableBundle; - -import androidx.annotation.Nullable; -import androidx.databinding.library.baseAdapters.BR; - -import com.dolphin.core.base.BaseActivity; -import com.kanglai.push.R; -import com.kanglai.push.databinding.ActivityAuroraBinding; -import com.kanglai.push.ui.vm.AuroraViewModel; - -public class AuroraActivity extends BaseActivity { - - - @Override - public int setContentView(Bundle savedInstanceState) { - return R.layout.activity_aurora; - } - - @Override - public int setVariableId() { - return BR.viewModel; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { - super.onCreate(savedInstanceState, persistentState); - } -} diff --git a/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java b/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java index 6379c23..cb07633 100644 --- a/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java +++ b/app/src/main/java/com/kanglai/push/ui/activity/InstantActivity.java @@ -2,32 +2,24 @@ package com.kanglai.push.ui.activity; import android.content.Context; import android.os.Bundle; -import android.text.Editable; import android.text.InputFilter; -import android.text.TextUtils; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.GridLayout; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.ScrollView; import android.widget.TextView; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.blankj.utilcode.util.CacheDiskUtils; -import com.blankj.utilcode.util.CollectionUtils; -import com.blankj.utilcode.util.LogUtils; import com.dolphin.core.base.BaseActivity; import com.dolphin.core.bus.RxBus; import com.dolphin.core.bus.RxSubscriptions; import com.dolphin.core.util.RxUtil; -import com.dolphin.core.util.ToastUtil; -import com.dolphin.umeng.entity.ChatMsg; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.kanglai.push.BR; import com.kanglai.push.R; import com.kanglai.push.constant.CacheConstant; @@ -39,15 +31,11 @@ import com.kanglai.push.ui.adapter.SoloChatRoomAdapter; import com.kanglai.push.ui.vm.InstantViewModel; import com.kanglai.push.util.ViewFilterUtil; import com.scwang.smart.refresh.layout.api.RefreshLayout; -import com.taobao.accs.utl.u; import org.json.JSONObject; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -import java.util.OptionalInt; -import java.util.stream.IntStream; import io.reactivex.disposables.Disposable; @@ -90,7 +78,7 @@ public class InstantActivity extends BaseActivity{ @@ -99,7 +87,7 @@ public class InstantActivity extends BaseActivity - * - * - * - * - * - * - * @Author: liusixiang007 - * @since: 2023/7/31 - */ -public class MfrMessageActivity - extends Activity { - private static final String TAG = "MfrMessageActivity"; - - private final UmengNotifyClick mNotificationClick = new UmengNotifyClick() { - @Override - public void onMessage(UMessage msg) { - final String body = msg.getRaw().toString(); - Log.d(TAG, "body: " + body); - if (!TextUtils.isEmpty(body)) { - runOnUiThread(new Runnable() { - @Override - public void run() { - ((TextView) findViewById(R.id.tv_body)).setText(body); - Intent intent = new Intent(getApplicationContext(), LoginActivity.class); - intent.putExtra(CommonConstant.USER_LINK_TYPE, 1); - startActivity(intent); - } - }); - } - } - }; - - - @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); - setContentView(R.layout.mfr_message_layout); - mNotificationClick.onCreate(this, getIntent()); - } - - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - mNotificationClick.onNewIntent(intent); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kanglai/push/ui/activity/PushTypeActivity.java b/app/src/main/java/com/kanglai/push/ui/activity/PushTypeActivity.java index 6b96f79..68bdc8f 100644 --- a/app/src/main/java/com/kanglai/push/ui/activity/PushTypeActivity.java +++ b/app/src/main/java/com/kanglai/push/ui/activity/PushTypeActivity.java @@ -15,12 +15,10 @@ import androidx.databinding.library.baseAdapters.BR; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.blankj.utilcode.util.CacheDiskUtils; import com.blankj.utilcode.util.CollectionUtils; import com.blankj.utilcode.util.LogUtils; import com.dolphin.core.base.BaseActivity; import com.kanglai.push.R; -import com.kanglai.push.constant.CacheConstant; import com.kanglai.push.databinding.ActivityPushTypeBinding; import com.kanglai.push.entity.PushType; import com.kanglai.push.ui.adapter.PushTypeRecyclerAdapter; @@ -41,8 +39,6 @@ public class PushTypeActivity extends BaseActivity - * 应用后台持续活跃 - * 支持熄屏,app退入后台,保证后台任务不被杀死 - *

- * - * @Author: wangxiang4 - * @since: 2023/2/7 - */ -public class DemoAppKeepActiveFragment extends BaseFragment implements DemoRecyclerAdapter.EventListener { - - private RecyclerView mRecyclerView; - private DemoRecyclerAdapter mAdapter; - private AppKeepActive appKeepActive; - /** 持续保持活跃任务广播 */ - private BroadcastReceiver backgroundKeepActiveTask; - - @Override - public int setContentView(LayoutInflater inflater, @Nullable ViewGroup parentContainer, @Nullable Bundle savedInstanceState) { - return R.layout.fragment_demo; - } - - @Override - public int setVariableId() { - return BR.viewModel; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - appKeepActive = new AppKeepActive(TabBarActivity.class); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mViewModel.setTitleText("应用后台持续活跃"); - mRecyclerView = getView().findViewById(R.id.demo_recycler_view); - List list = CollectionUtils.newArrayList( - new DemoRecyclerAdapter.Entity().setCode("1").setTitle("启动后台免杀持续活跃"), - new DemoRecyclerAdapter.Entity().setCode("2").setTitle("停止后台免杀持续活跃") - ); - final DemoRecyclerAdapter demoRecyclerAdapter = new DemoRecyclerAdapter(list); - demoRecyclerAdapter.setEventListener(this); - mAdapter = demoRecyclerAdapter; - RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); - mRecyclerView.setLayoutManager(mLayoutManager); - mRecyclerView.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(requireContext(), R.color.common_divider_color))); - mRecyclerView.setAdapter(mAdapter); - } - - @Override - public void onItemViewClicked(DemoRecyclerAdapter.Entity entity) { - switch (entity.code) { - case "1": - registerReceiver(); - appKeepActive.registerService(); - ToastUtil.showCenter("启动成功"); - break; - case "2": - unregisterReceiver(); - appKeepActive.unregisterService(); - ToastUtil.showCenter("停止成功"); - break; - } - } - - public void registerReceiver () { - if (null == backgroundKeepActiveTask) { - backgroundKeepActiveTask = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(AppConstant.BACKGROUND_KEEP_ACTIVE_TASK_SCHEDULING)) { - ToastUtil.show("APP进入后台执行任务逻辑!"); - LogUtils.i("APP进入后台执行任务逻辑!"); - } - } - }; - } - IntentFilter filter = new IntentFilter(); - filter.addAction(AppConstant.BACKGROUND_KEEP_ACTIVE_TASK_SCHEDULING); - getActivity().registerReceiver(backgroundKeepActiveTask, filter); - } - - public void unregisterReceiver() { - if (null != backgroundKeepActiveTask) getActivity().unregisterReceiver(backgroundKeepActiveTask); - } - - @Override - public void onStart() { - super.onStart(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - -} diff --git a/app/src/main/java/com/kanglai/push/ui/fragment/MessageFragment.java b/app/src/main/java/com/kanglai/push/ui/fragment/MessageFragment.java index b2168ca..d657ec5 100644 --- a/app/src/main/java/com/kanglai/push/ui/fragment/MessageFragment.java +++ b/app/src/main/java/com/kanglai/push/ui/fragment/MessageFragment.java @@ -19,7 +19,7 @@ import com.dolphin.core.base.BaseFragment; import com.dolphin.core.bus.RxBus; import com.dolphin.core.bus.RxSubscriptions; import com.dolphin.core.util.RxUtil; -import com.dolphin.umeng.entity.CustomMsg; +import com.dolphin.umeng.entity.PushChatMessage; import com.google.gson.Gson; import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator; @@ -78,7 +78,7 @@ public class MessageFragment extends BaseFragment { diff --git a/app/src/main/java/com/kanglai/push/ui/fragment/UserFragment.java b/app/src/main/java/com/kanglai/push/ui/fragment/UserFragment.java index f1bb1b3..8389d6c 100644 --- a/app/src/main/java/com/kanglai/push/ui/fragment/UserFragment.java +++ b/app/src/main/java/com/kanglai/push/ui/fragment/UserFragment.java @@ -1,6 +1,5 @@ package com.kanglai.push.ui.fragment; -import android.graphics.Color; import android.os.Bundle; import android.text.TextUtils; import android.util.Patterns; @@ -14,10 +13,8 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.afollestad.materialdialogs.MaterialDialog; import com.blankj.utilcode.util.CacheDiskUtils; import com.blankj.utilcode.util.CollectionUtils; -import com.blankj.utilcode.util.LogUtils; import com.bumptech.glide.Glide; import com.dolphin.core.BuildConfig; import com.dolphin.core.base.BaseFragment; @@ -28,7 +25,6 @@ import com.kanglai.push.constant.CacheConstant; import com.kanglai.push.databinding.FragmentUserBinding; import com.kanglai.push.entity.User; import com.kanglai.push.ui.activity.AboutActivity; -import com.kanglai.push.ui.activity.AuroraActivity; import com.kanglai.push.ui.activity.LoginSurveyActivity; import com.kanglai.push.ui.activity.PushTypeActivity; import com.kanglai.push.ui.adapter.UserRecyclerAdapter; diff --git a/app/src/main/res/layout/activity_aurora.xml b/app/src/main/res/layout/activity_aurora.xml deleted file mode 100644 index 4abfbde..0000000 --- a/app/src/main/res/layout/activity_aurora.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_push_type.xml b/app/src/main/res/layout/activity_push_type.xml index 695f017..8ccd6f6 100644 --- a/app/src/main/res/layout/activity_push_type.xml +++ b/app/src/main/res/layout/activity_push_type.xml @@ -13,20 +13,6 @@ android:id="@+id/include" layout="@layout/layout_toolbar" binding:toolbarViewModel="@{viewModel.toolbarViewModel}" /> - - - - - - - - - - - - - \ No newline at end of file diff --git a/config.gradle b/config.gradle index 6956f01..a36328c 100644 --- a/config.gradle +++ b/config.gradle @@ -33,21 +33,11 @@ ext { // 友盟消息推送 Secret UMENG_MESSAGE_SECRET = '5plfnl3z4gyebwgzqjbvipciytdkx008' - // 申请 https://connect.qq.com - // QQ AppId - QQ_APP_ID = '101830139' - // QQ Secret - QQ_APP_SECRET = '5d63ae8858f1caab67715ccd6c18d7a5' - // 申请 https://open.weixin.qq.com // 微信 AppId WX_APP_ID = 'wxdc1e388c3822c80b' // 微信 Secret WX_APP_SECRET = '3baf1193c85774b3fd9d18447d76cab0' - // 高德地图 AppKey - AMAP_KEY = '5c32b5bc83e99b3ccc05d5e2eefc3c8b' - // 华为应用AppID - HUAWEI_APP_ID = '108750031' switch(serverType) { case SERVER_TYPE_DEV: @@ -57,7 +47,6 @@ ext { case SERVER_TYPE_PRO: BUGLY_ID = '8bfb5c4a07' HOST_URL = 'http://kicc.kanglailab.com:9999/' -// HOST_URL = 'http://139.9.72.189:9999/' break } @@ -169,13 +158,6 @@ ext { 'umeng-share' : 'com.umeng.umsdk:share-core:7.2.1', // 友盟微信分享 'umeng-share-wx' : 'com.umeng.umsdk:share-wx:7.2.1', - // 友盟QQ分享 - 'umeng-share-qq' : 'com.umeng.umsdk:share-qq:7.2.1', - - // 华为厂商通道 - 'huawei-push' : 'com.huawei.hms:push:6.9.0.300', - // 华为移动服务 - 'huawei-umengaccs' : 'com.umeng.umsdk:huawei-umengaccs:2.0.0', // 微信官方依赖库 // https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html @@ -231,10 +213,6 @@ ext { // ----------------------- 后续新增依赖框架 ----------------------------- - // 多级树形结构 - // https://github.com/bmelnychuk/AndroidTreeView -// 'android-tree-view' : 'com.github.bmelnychuk:atv:1.2.+', - // 带索引的回收视图 // IndexableRecyclerView 库的androidx版本 // https://gitee.com/androidx_xy/IndexableRecyclerViewX diff --git a/library/core/proguard-core.pro b/library/core/proguard-core.pro index 65d1b7b..03c7782 100644 --- a/library/core/proguard-core.pro +++ b/library/core/proguard-core.pro @@ -55,27 +55,5 @@ @android.webkit.JavascriptInterface ; } -# 3D 地图 V5.0.0之后 --keep class com.amap.api.maps.**{*;} --keep class com.autonavi.**{*;} --keep class com.amap.api.trace.**{*;} - -# 定位 --keep class com.amap.api.location.**{*;} --keep class com.amap.api.fence.**{*;} --keep class com.loc.**{*;} --keep class com.autonavi.aps.amapapi.model.**{*;} - -# 搜索 --keep class com.amap.api.services.**{*;} - -# 导航 --keep class com.amap.api.navi.**{*;} --keep class com.autonavi.**{*;} --keep class com.alibaba.idst.nui.**{*;} - -# 高德api --keep class com.amap.api.**{*;} - # 禁止类名混淆,否则通过类名称找不到类 -keep class com.dolphin.core.entity.**{*;} \ No newline at end of file diff --git a/library/core/src/main/AndroidManifest.xml b/library/core/src/main/AndroidManifest.xml index 128e49b..1a445b6 100644 --- a/library/core/src/main/AndroidManifest.xml +++ b/library/core/src/main/AndroidManifest.xml @@ -6,18 +6,6 @@ - - - - - - - - - - - - diff --git a/library/core/src/main/java/com/dolphin/core/constant/AppConstant.java b/library/core/src/main/java/com/dolphin/core/constant/AppConstant.java index 5faa595..5fc56a1 100644 --- a/library/core/src/main/java/com/dolphin/core/constant/AppConstant.java +++ b/library/core/src/main/java/com/dolphin/core/constant/AppConstant.java @@ -25,18 +25,6 @@ public interface AppConstant { /** 通用权限请求码(可以自定义请求权限对应各自的请求码) */ Integer PERMISSION_REQUEST_CODE = 0; - /** 后台持续活跃定位任务间隔时间(默认5秒) */ - Long KEEP_ACTIVE_TASK_INTERVAL_TIME = 5 * 1000L; - - /** 后台持续活跃前台服务通知ID */ - Integer KEEP_ACTIVE_FRONT_SERVICE_NOTIFICATION_ID = 2023; - - /** 后台持续活跃广播调度 */ - String BACKGROUND_KEEP_ACTIVE_TASK_SCHEDULING = "BACKGROUND_KEEP_ACTIVE_TASK_SCHEDULING"; - - /** 默认线程池数量 */ - Integer DEFAULT_THREAD_POOL_SIZE = 3; - /** 底部标签栏默认选择下标 */ String TAB_BAR_DEFAULT_INDEX = "TAB_BAR_DEFAULT_INDEX"; diff --git a/library/core/src/main/java/com/dolphin/core/entity/DolphinUser.java b/library/core/src/main/java/com/dolphin/core/entity/DolphinUser.java deleted file mode 100644 index 23f030f..0000000 --- a/library/core/src/main/java/com/dolphin/core/entity/DolphinUser.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.dolphin.core.entity; - -import android.os.Parcel; -import android.os.Parcelable; - -import java.util.List; -import java.util.Map; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - *

- * 扩展安全框架用户信息 - *

- * - * @Author: entfrm开发团队-王翔 - * @Date: 2022/6/28 - */ -@Data -@Accessors -public class DolphinUser implements Parcelable { - - /** 用户id */ - private String id; - - /** 用户名称 */ - private String username; - - /** 用户密码 */ - private String password; - - /** 部门ID */ - private String deptId; - - /** 用户手机号 */ - private String phone; - - /** 账户是否被冻结 */ - private Boolean enabled; - - /** 多租户ID */ - private String tenantId; - - /** 用户按钮权限 */ - private List> authorities; - - /** 帐户未锁定 */ - private Boolean accountNonLocked; - - /** 帐户未过期 */ - private Boolean accountNonExpired; - - /** 凭证未过期 */ - private Boolean credentialsNonExpired; - - public DolphinUser() { - } - - /** 内存反序列化对象 */ - protected DolphinUser(Parcel in) { - id = in.readString(); - username = in.readString(); - password = in.readString(); - deptId = in.readString(); - phone = in.readString(); - enabled = in.readBoolean(); - tenantId = in.readString(); - authorities = in.readArrayList(Map.class.getClassLoader()); - accountNonLocked = in.readBoolean(); - accountNonExpired = in.readBoolean(); - credentialsNonExpired = in.readBoolean(); - } - - /** - * 内存序列化对象 - * @param dest 序列化对象 (包含序列化的一些操作) - * @param flags 0或1 (1表示当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0) - * @return void - */ - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(id); - dest.writeString(username); - dest.writeString(password); - dest.writeString(deptId); - dest.writeString(phone); - dest.writeBoolean(enabled); - dest.writeString(tenantId); - dest.writeList(authorities); - dest.writeBoolean(accountNonLocked); - dest.writeBoolean(accountNonExpired); - dest.writeBoolean(credentialsNonExpired); - } - - /** - * unix系统文件描述符,一般情况下为0就行 - * 0:标准输入文件stdin - * 1:标准输出文件stdout - * 2:标准错误输出文件stderr - */ - @Override - public int describeContents() { - return 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public DolphinUser createFromParcel(Parcel in) { - return new DolphinUser(in); - } - - @Override - public DolphinUser[] newArray(int size) { - return new DolphinUser[size]; - } - }; - -} diff --git a/library/core/src/main/java/com/dolphin/core/service/AppKeepActive.java b/library/core/src/main/java/com/dolphin/core/service/AppKeepActive.java deleted file mode 100644 index ea2d6f5..0000000 --- a/library/core/src/main/java/com/dolphin/core/service/AppKeepActive.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.dolphin.core.service; - -import android.app.AlarmManager; -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.graphics.BitmapFactory; -import android.os.PowerManager; -import android.os.SystemClock; - -import com.blankj.utilcode.util.Utils; -import com.dolphin.core.R; -import com.dolphin.core.constant.AppConstant; -import com.dolphin.core.util.NotificationUtil; - -/** - *

- * 应用保持活跃 - *

- * - * @Author: wangxiang4 - * @since: 2023/2/6 - */ -public class AppKeepActive { - - /** 活动上下文 */ - private Context mContext; - - /** 前台服务通知 */ - public static volatile Notification notification; - - /** 保持后台活跃服务意图 */ - private Intent backgroundKeepActiveFrontServiceIntent; - - /** 系统警报提醒服务 */ - private AlarmManager alarmManager; - - /** 警报待定异步意图 */ - private PendingIntent alarmPendingIntent; - - /** 屏幕唤醒锁定屏幕接收 */ - private BroadcastReceiver wakeLockScreenReceiver; - - /** 判断屏幕唤醒锁定屏幕接收是否注册 */ - private Boolean isRegisterPowerWakeLockReceiver = false; - - /** 手机电源管理 */ - private PowerManager powerManager; - - /** 屏幕唤醒 */ - private PowerManager.WakeLock wakeLock; - - /** 前台服务通知点击启动活动 */ - private Class notificationClickStartClass; - - public AppKeepActive(Class notificationClickStartClass) { - this(Utils.getApp(), notificationClickStartClass); - } - - public AppKeepActive(Context mContext, Class notificationClickStartClass) { - this.mContext = mContext; - this.notificationClickStartClass = notificationClickStartClass; - powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - notification = buildNotification(); - } - - /** 注册电源锁屏监听广播 */ - public void registerPowerWakeLockReceiver() { - if (isRegisterPowerWakeLockReceiver) return; - isRegisterPowerWakeLockReceiver = true; - if (null == wakeLock) wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "dolphin:keep-active"); - if (null == wakeLockScreenReceiver) { - wakeLockScreenReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (null == wakeLock) return; - String action = intent.getAction(); - if (Intent.ACTION_SCREEN_OFF.equals(action) && !wakeLock.isHeld()) { - wakeLock.acquire(); - if (null != alarmPendingIntent) return; - // 支持后台熄屏,定时执行后台持续活跃任务 - Intent alarmIntent = new Intent(); - alarmIntent.setAction(AppConstant.BACKGROUND_KEEP_ACTIVE_TASK_SCHEDULING); - // https://www.cnblogs.com/endv/p/11576121.html - alarmPendingIntent = PendingIntent.getBroadcast(mContext, AppConstant.PERMISSION_REQUEST_CODE, alarmIntent, PendingIntent.FLAG_IMMUTABLE); - // 获取系统警报提醒服务 - alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE); - // 设置一个闹钟,1秒之后每隔一段时间执行启动一次后台持续活跃任务,防止冻结后台任务 - alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1 * 1000, AppConstant.KEEP_ACTIVE_TASK_INTERVAL_TIME, alarmPendingIntent); - } else if (Intent.ACTION_USER_PRESENT.equals(action) && wakeLock.isHeld()) { - wakeLock.release(); - if (null == alarmManager) return; - alarmManager.cancel(alarmPendingIntent); - alarmPendingIntent = null; - alarmManager = null; - } - } - }; - } - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(Intent.ACTION_USER_PRESENT); - mContext.registerReceiver(wakeLockScreenReceiver, filter); - } - - /** 取消电源锁屏监听广播 */ - public void unregisterPowerWakeLockReceiver() { - if (!isRegisterPowerWakeLockReceiver) return; - if (null != wakeLockScreenReceiver) mContext.unregisterReceiver(wakeLockScreenReceiver); - isRegisterPowerWakeLockReceiver = false; - } - - /** 启动后台活跃前台服务 */ - public void startBackgroundKeepActiveFrontService() { - BackgroundKeepActiveFrontService.startBackgroundKeepActiveTask = true; - backgroundKeepActiveFrontServiceIntent = new Intent(mContext, BackgroundKeepActiveFrontService.class); - mContext.startForegroundService(backgroundKeepActiveFrontServiceIntent); - } - - /** 关闭后台活跃前台服务 */ - public void closeBackgroundKeepActiveFrontService() { - BackgroundKeepActiveFrontService.startBackgroundKeepActiveTask = false; - if (null != backgroundKeepActiveFrontServiceIntent) mContext.stopService(backgroundKeepActiveFrontServiceIntent); - } - - /** 注册应用保持活跃服务 */ - public void registerService() { - startBackgroundKeepActiveFrontService(); - registerPowerWakeLockReceiver(); - } - - /** 解绑应用保持活跃服务 */ - public void unregisterService() { - closeBackgroundKeepActiveFrontService(); - unregisterPowerWakeLockReceiver(); - } - - /** 构建前台服务通知 */ - private Notification buildNotification() { - NotificationUtil.notificationManager.createNotificationChannel(NotificationUtil.defaultNotificationChannel()); - PendingIntent pendingIntent = PendingIntent.getActivity(mContext, AppConstant.PERMISSION_REQUEST_CODE, new Intent(mContext, notificationClickStartClass), PendingIntent.FLAG_MUTABLE); - Notification notification = NotificationUtil.defaultNotificationBuilder() - .setContentTitle(mContext.getString(R.string.app_name)) - .setContentText("正在后台运行") - .setOngoing(true) - .setOnlyAlertOnce(true) - .setContentIntent(pendingIntent).build(); - // 通知栏以不能清除的方式展示 - notification.flags |= Notification.FLAG_NO_CLEAR; - return notification; - } - - public PowerManager getPowerManager() { - return powerManager; - } - - public void setPowerManager(PowerManager powerManager) { - this.powerManager = powerManager; - } - - public PowerManager.WakeLock getWakeLock() { - return wakeLock; - } - - public void setWakeLock(PowerManager.WakeLock wakeLock) { - this.wakeLock = wakeLock; - } - -} diff --git a/library/core/src/main/java/com/dolphin/core/service/BackgroundKeepActiveFrontService.java b/library/core/src/main/java/com/dolphin/core/service/BackgroundKeepActiveFrontService.java deleted file mode 100644 index 78ed12c..0000000 --- a/library/core/src/main/java/com/dolphin/core/service/BackgroundKeepActiveFrontService.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dolphin.core.service; - -import android.app.ActivityManager; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.media.MediaPlayer; -import android.os.IBinder; -import android.os.PowerManager; - -import com.blankj.utilcode.util.ThreadUtils; -import com.blankj.utilcode.util.Utils; -import com.dolphin.core.R; -import com.dolphin.core.constant.AppConstant; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - *

- * 前台服务 - * 采用媒体锁持续保持后台活跃 - * https://developer.android.com/guide/components/services?hl=zh-cn - *

- * - * @Author: wangxiang4 - * @since: 2023/2/6 - */ -public class BackgroundKeepActiveFrontService extends Service { - - /** 流媒体播放器 */ - private MediaPlayer mediaPlayer; - - /** 启动服务异步处理任务 */ - public static volatile Boolean startBackgroundKeepActiveTask = false; - - /** 判断APP当前是否处于后台运行 */ - private boolean isAppBackstage() { - ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - List appProcesses = activityManager.getRunningAppProcesses(); - for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { - if (appProcess.processName.equals(getPackageName())) { - if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { - return true; - } else { - return false; - } - } - } - return false; - } - - @Override - public void onCreate() { - super.onCreate(); - mediaPlayer = MediaPlayer.create(this, R.raw.media_lock); - // 禁止播放程序进入休眠,熄灭屏幕后唤醒cpu - mediaPlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK); - mediaPlayer.setLooping(true); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if (mediaPlayer != null) mediaPlayer.start(); - ThreadUtils.executeByFixedAtFixRate(AppConstant.DEFAULT_THREAD_POOL_SIZE, - backgroundKeepActiveTask, AppConstant.KEEP_ACTIVE_TASK_INTERVAL_TIME, TimeUnit.MILLISECONDS); - return super.onStartCommand(intent, flags, startId); - } - - /** 后台异步处理持续活跃任务 */ - ThreadUtils.Task backgroundKeepActiveTask = new Utils.Task(result -> {}) { - @Override - public String doInBackground() { - // 设置线程取消 - if (!startBackgroundKeepActiveTask) cancel(); - if(isAppBackstage()){ - Intent intent = new Intent(); - intent.setAction(AppConstant.BACKGROUND_KEEP_ACTIVE_TASK_SCHEDULING); - sendBroadcast(intent); - } - startForeground(AppConstant.KEEP_ACTIVE_FRONT_SERVICE_NOTIFICATION_ID, AppKeepActive.notification); - return null; - } - }; - - @Override - public void onDestroy() { - super.onDestroy(); - mediaPlayer.stop(); - mediaPlayer.release(); - stopForeground(true); - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - -} diff --git a/library/core/src/main/res/raw/media_lock.wav b/library/core/src/main/res/raw/media_lock.wav deleted file mode 100644 index 27142e27c1a902060c05df14720f6aa6ede4b9f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441044 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

B@*E>nsGoWDo`tMndAe3FV<2zU9J@)V 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 z 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

U{NOjiV%ZHYEMilDxieleLEXpJt+&Os6 znmANPSxMjYk)OZ0YxP^DsU8;9t2G6F&#nJIQ2snMy6ZoW zj`aU)>}{0YT6*Nl_Qb@v-~Va-6JgI?THoqKkyP7^5V={q3P>aps3Omi^!9DDTU_Or z_i3W2e(eJ4^W_nIDLSSX+s!?=hB_pwK#sj{d{tbvR}Um#p4?JL92nJW7tTa;^PLKA zeaL~i%LZ|Yn5=4Polw?$pC-%_vzG^Rs%D%fyaKs|3Ajn zvy`Rt~qL zTEExL;LiBJS-vrWJVf`ZIYgI&top@EHELHYci!~}y6=0gkvS`lHTF+t+uQw#kLMCF zEYd3F^U*rRNE_h$0W->jRBko`hV ztoPeaf94p>;rFp6X#~|}!o|(g)`tJ#>b=_lidVmvbc@KZ) z%=g7}ql}v(Omp=~yNmd4wr+IQkv5ohqqzKmBTw#6>MWc$_E&91%_v-X!oYLthXwi8 zV=VYCjLvCa{IlfGDrRR*&Aa}WCR_FU^;@HAL7Y~WJ2J7~y}2x!!Nmz{MwZ6v?pS8* z?yV{lY*j`3;q~=09Xnzlb48dU{brzDv8=_BTEd1HZr#YOBl4Tg`UdaEdDvBw`ZXfG z&qF9WzY(Rj;zo(%L3}j_iMX=|cvYf;Ec^rB% zdk&D%%dEZRvyZ?AsI4V@YP~DjRv-4BcunzF-CEM3SVe#iTP=r+z)v0Vqh>$9lO1o^ zPSqjzZn4I>I>!$>P(kjI*0Sm#3f9NsG_w=4`U_!d+^Te{AIAA#&i}`s-(SIQi2PqC z^8~|Y43+h#Q?Q7b)2zOsWJC_@?qx3qnBl__5y69u-A={4p=ft4$HN*!Wt}^oP3}+O zr=omW5!R8NA%FN1nfdgtV_-FcxZU{b*jYW3;a|Nc3s_|C^2&%fjdQV?N%z)Ht&BN7 zWwm}v6ld6dE&u#`9iBhb&Xg>2X6J($yi2#C*P?eWYP;F1Z|#9dRQsMl|3(z{+fnqJ z;up23!ugHwyQ=$1?&ZadeWEjVpVOVngdKSSN!nZ=2UWRyyHT_8)g1ec-_lieelj*6 ztFv&z#`h-%*$dYvZak+BQNZ)A!s}?*7N_^C)ay${)C28hvTIlPR*czPZOGssfd7F} zd;YAZ-=(%f-xD*oh+^D`t@yuHd;Kh);>XTqrkcd6$}Li~{r>jKMG-5%yEzf3jQ3{{ zae=@0ns@j2C(9m;mq$A=4E0Th)r2=5v2?E-S8G&<3cC2)VajcNZJEWt7VghS-Uy7i z8fLyH19>fLpaGp+SKqvc_glT`fNsY47`skL#k$Y_cG^w*82d7*018Mos`IHm8HeJxJFfI4^-CT zUEO>+!+Jb5S4LE{Y=J7aL(6Lwg01hz=iOzem34&PhtqM^qZI4Sd=#^pS95zVXL(Y` z{d5wmo^y=3F3{{=RbM(`v<%-X#*Hv-V_zF~XHWO$FK$0GLN5L0yDTg}F)nV##q!B? zJY(ByQJA$?Rd=qe+ZBkxKh}!A^rtmre=&$~9mMF~_oBsbdlr_oV>XE|TyP3k&aGc| zUlz;EvLa4Bf$8nas!EUe;fkz;=e;(Ijk()rA(ZB{Oz}?ZAdoG`dgtAE>{a~!tT*;~ zEdzLU?)a)B`LDkC?sJxWzAM$xI>*~Z;!MSopB^%0G~*6y#Pbcx6TW#ca(|QH(^m+Y9phc4IQZjJ`@jF&fBWZ?yBwr# z@p;OV-Flf8nOBYVv$lFJmUyVI&3E+At)EX~t}-ryxz_m4}Zty z9WrqN-gTW6|N<03+2Y_?;W$613Gh|R?HFC++kKZY2UZoxGF4J zG2i;rlKM^6F+HoqURD^*C$D8g=CbOH%ckqZk_TeU-o2h@_lkTo$4B{61L26T8&zxb z6GH3XtbUGluh*g}1}kvimUIG1BkgpbofmxH8pV2kGp8dd23hq^xC-d|9e7($uy3(#%`DDns^_N#qA&KQ; zSl#TZdw+kGuW_QLKI6FAYi@I<$=$jBP-1(MCn6$e^lh}V# zmjCsj-+JL268B`T?t1eKU$-}^o)B{nR(#0qkfWPUL(b$mUUr?9!;7_d%y&cdqN6w>N}OK3PX};BzPQJP8E`cj=g)XF+o;CV2$t&xje*lWJD#yNyW|grl|L*HC+~TVn|eWO z#rTQYyRLP;_QAbVnoNFX^p}#f!Aud0ZP&%J`^(8@5l0WYIgI(|t@~+7yII$gR=Czy zSNS2rb>LXcFR$pbe?w_jno0cR$j9ZG>(th{?TwT8v*Y?%6Q|GCojXMMTg&?U2ZUK& zjCbu&4Q;!0{Rt~oyI1!UCU(R0+2^j$-_d?YY*kjj^%gwrdyQ4G5%#RVMPj{#*?KBF z}**7W?ID&`Gg0C`e zWe*`%eKZ54ai>zsQvJ7HLPYA99D8?HH#0^4nTr>vSW;gno6bE$rIl6A8$)@(XSvJf z#WZiS0dv-g@xCg&9PN&FVLFumBJ)39;w(mgF)%%6*=~kS5%F3M-zy!Z1M*=V`VH~j z0p9)d&8#{9j6Wu=W%r}0%>8Am_G-Fqr@9eOTV*d^;cHB zx@$>=RE55SUFW3jG~*qknVwr^hH$i@@1o-RecD;y$&n?7nvlCmyoxd#Jng#29IJ^3BWxjU?G0UuDe(KV$ z7OW1|d*#`Od#wqX-ZxX9@~6%J1raU{f*RHL!e}rRDoQ5vLT!4GyctUt65`oSLxy|>MXDJ7e7e%ka^yh1G%rt zv1<&M`No)KKFWamHhg*>;QptIKP}ZYrWHo~GydiQv}BD>I{OQCm}5+)Tlt!HZdcS#qX+-%b?5yzG58&HsD9lhW;0w@QXA9%A6K4W3_*<WoCF~2Zk5Xypw^l z-g)L`c)F~5t>`y%*k}ZPZuelk{da!3awn0Q#XD7njR>tfYrs!e_p?b|U=^gIrvHA2 z-7YtF;8ui1+UMkTl$2&1eUq?Uc&11_e@a-S6)RotJe%CLimoqZZ4s0(o zBEKEkHzX;9oPGLND`sHTsK?7fTITmHC_9{5WgxQiS-2aCP7A#t8OMPsmV| zwmjGRlWs;FU$i&!d+ppi!Zm&_Yjq5L^KL7`fX7f1z3Wxl5Ql3FbXCsFHudti$5q_D zcK*c=iY$L$xdUC+i#ryKh|zilSIvqi`Ee8s&FESkq?FAQZw!=6*^4QVFat(s;hyTX z-hF0Yi@&d@yFb(a$>_yc^s?s}-x$+rK3(1OMVP&-BfQ*wCv3(gvsO;~W6_(#jZSr& z!OAR-vwJ1JX4S=9*UHqwtWQOM>)t4-%sSqQ|mwrEfcNM#d`MwcNsq@%5 zFWaobyUNICOfH&5XGFX6W`=iKX&iL>^sybpdDxl7aNazD6vnNxbp&1<6>!#>~Md-;3s5`*WIznzz) zA>RDvw$76pQwjczpuOu?q>WK~#Pt9EgJH~sR(3(Fb>>nb=C^Z9IVdXT@>rHqZPlW+ zo|(rVvGfxRK0o`fk1iT>lI`qkXHkn!n_|KOJndh%O#|47 z983LS^pl$v_q*Sf&ukc_QN?&nFF(IAn;-cs@>Ls_d4zQQ+GjiEFF)D4XpD4OE(^mL zN~^B#_@*)}jAL^sz68EbX#F zwVS)?$`}`2tbmkRenZx0a7XoYpY>C}eyaqFJ9~!xTUYq{jxapLD$1g^%a>QbbMLpP z!oKrD)o~+;lPSfRh^Beo<5MW#28yN~#P!#56~KB|s)b)%Irr{Vv8ey8PjkjU=FqGv z;Z6z)9X=UFJF?{W_;Ae0R9)s%eq*`&^R?V$S3RMT%RqOh;+q4NV7GhMmt7bJpIqOw z$h!(Zs@N-6Y@e0G?lp5($7P<2Jrz67O7Do*4z>N}{j9D&iXh8op$^_zeCMD%{F+ae zHvWA*)W2pCzvJKe_TFc2Y1C*{N6N|ubFka{;u}_3N@2!#nHv|OUY+B49i*#oPT`_Y zSnLMPyd5p;z2?R0)*wr;{`HQ+H6&R4-s1pN!T`LS5wRp*O^DiD_=gvmWfS)7cQB?Iu zbFEDozo@ZfELl$-u1Kl+4A(~EY8i(i@)XYOSWhSyZO5KV2Zh(LN@m^$~sh^ zO0LZ!^3-i@?bH{ZYRp_O9<%7l%Di1XsygKALd52@IPIIUP;T?W`pzl-wna5{<5@o6 zD>aa~-$V)Zf+9KO5uUfa)GU$1OS-(2iP8xa_b@h95 zg@tn4Z}_QBGah9~sRX6e& z*CWiSi|sM>82f^lvg)L3k_CSdBlg#zj7>C-OqB-`@bG|x3jvm0=N*_Vj(FAotpoXH-HkCHsm$zkI*NOc8+D4xv$$6+{x+LRDYg`b4fSai z^S(J=nbFU4EB8b%c9^g4j4Aa&JY5xi6~=qk@}8{Sncu&kj#nPDW=C_63wOCmZLaD0 z)$DwPY@M0N>T&-6A!f$NQz-AspJOoE-K&b>d#i+)ndf8I#xV{bsb zerk_TcM@~pc?@K%yb3mYR2UoLRt>V~-Cf`4x@TOe*{F-ScSSr#ZvE0FnOI*dhSCFVGZQlL?(w!R2xYf-a@0A^G>>V1Fr#KEtTERkR zo}yq(ZSd?&)`8-F3$|I#Tkp9$|1a)e9zdYKI;q~|$2;Q2V~;Z5r=2RODr;V^MzXjs zrzuB|=L}jySnUm zL_PPe-clLJ#O0N??Ap~)Rzm^W@3Vw=)l@8ClWSh@V=-`-7mW%)u>p#TjQ?w9CE8(-<}|hH5P`sc+HgKH;R`unk`QnQ_PT;Qkx7veeH9 zT(1JmId-xITjr%v>%9B<$6pBYrw&w$@yCO&As4H?VSj@M%gi$q<0MP2o?jHl*ju|; zh~+V(M=j+gKcMbhNWX~}pRb4AsHqPR|D*iL0t-l8K9RRg}An`ifitrlJ0 ziPLCA(6hNEKZ|DdlOkgYtZL={9cHqq4w!#eyN(h0g(o@RomPT;_imd`g7iz6PegjqXF)U`*VA=TFy+u+6wO)?Kx;hvC6z0hkOQ@yDZ#K-M|I!GR=J^CY zq4V!rez_P&;s#F@*S+4?WvBj&YMC-pIgHohgxwylPG*)(Fm`fopg0kWvd^Mh|MeYabuij%8M!~AF5``DPz}i3cU(cJ*tLi zMK8}|Yl^o1<Q@stNx)gT_Y)-&l;pXEYCgJj$g$)6r+N*n&->`LpcLx~-0h z)K{mEYjfAi=}+%+)LK86s5o(?Gv0-_?3g)`EQX7pXz9ED-H>;t{iE+!)Ccub_tA@Z zQ;`gmRnJg;j%YqS-kQYN3I}Ck7*16;3MsWGlu87Mt zb3tuSeOV@7_2{ZJWtk%xGanmS-odj>npOP8i&xAAm;#NDEVg?Ao^#**{2_kX^QW37tS-2W{jjmyJj zDvWP#WHra$}N;OOB`t#cNpzaRw=b`%4zj2pC`5c3>12!YR-_N2z=5}`LB(c1O z;mxb{hiAukmn%DsHDxEOFWO`7zcEf+-VNVuFNdj8w5mvM7`Yhb!46}c#?t1;)qnQ- zo8xH)YpR5-s8M^Z_+#c(Rx8FFv$5p~bZ61`%Iv8xkjdkI`i2cW$%QtXy?31y@9B`; zrw(F7)m5W03L+lbWmf!_oj_7{7Fa9isgHNF1ykE6KUp`YSeN(r)ph!Y(Rrw)`Kfe0CSA82ad3fwA;33G`jtcegD%Qrdk@$z!# z#yIo17CBK7IqR$}xl|*vW*1|h>>EO7*B9t+G9Yh!X7OLS#r6| z-+5u4-OSJLWkWTs(&S~4aVJf2&lse9o4=zwg+p`+7lLs4T*pk=H@IQ%t+xSz~?rU1tttwakOc@hMEa z;WGLnwJN5HX(CpcF{EO*dhsJCy!SlAUMUk+wLj(T47QqBl-YjcxbdtT;6oe5c~_+k z)~1>?AP3hfE8(c~Dyyww|Bq3>4~VDKz7CdU@}~7LsXyZCPTZ?DZEk%Ws&RE7&&IKR zC=W&bOG!l$!^;&OL$XgG;>5CwDW~ES+j7}Cv|1AhnB~?Se6wAp&FW|6VW~>+dxw-7 z=H=dzBCB?n^H9gX_{?xx+-jmLzs&soC`&hoX4<@^3_l4I=U9lHM!R#_dgplOHxfs| z45rUKgQh%lH(q0rz4U%Z6Kh&}JzCRsc2%%?xx3@Lv!>+rE4-6W(TVD^QDr;p0zqd`?1rhB-M$wzO5oe{EOqyF|uK$`boGLL922X+wP@2Udz;bw>#cV z7iHdji4tyM$#?kt#%QcXrR`Ny2( zD$jV#@n!3JYUN%p4=PBUW6I23grQjE%Zc8KwX>=frJ|kjne|tTG8PLju3wd?iu$a* zodsMyzOStmxOhFpx_HS~bJXyA9!OWBwJut5>lPb+6Qr)hTn~aV{Fc+AjLGg-pI{#A zVq|qYmwm_);~2wg#QwCu&0T%oOus%@7bnv?bIN*%@-RGcmW45zMc2Bwx$9;(>-c0{ z`C&Yzc=gUm!;2q<_>C<4oR9Eh*WQFpl@{7gyTJ<@j=dyy&ea@qoeb<8(Bu=sY!rZR% zt~ZM9G(|mxU9sMI>8v}i#xHwjy?mRIu~SB1Ox5|` z@9tx)x?vrDrgUaZ#d!=1^YZ07Gu3C3=7;0=2?-B8=1E@oiGtPQeP`TfS8m;~i>n&) zJBoE@BTU)9U*W%fV==~5k?Wf{>k#Y~%mRHse_m|E`mGOUp{mV(N304hFpt^g%1$cI zWv6WL>Wua>-x=RJn)9w=%|x|Zm(cUn;!lqJ9`;k;SDUMOJ?Bq_#SLD5*Q-_5JYJbA z_w*ru571Ln-)(`%DrPlVjlrUlb+OrZ)E)Eovsib-qA5zac75EKJ)X%8cgNPOi z9k1Uz=m$p2hO>=W^);d|RczO|{OQA}J)ep<)Zvd!nAa!yHQvimImr9$T>RYaJ-%-r z1zqPt$E$BEuD(1Eq6gv2?z#^QdcP~*^;5~d0ijZF^=pw4Yo(ti_R~?K^Fch~?8*p@ zvTNBHbJ`6jn8Fp0t-Q!WmB)+0d3vZ%Pit`IX9rk>6ElIgJlZuj!HF2qJxe_%CtL|kTDJR>_Lk7ml_LX_&s+_8! z8@nA-9p3TJm_vfK&9jTZqjkj{qCx{+h49vjT*$r_th;nQJ(>;qw!3#NzOpF;`fx12 zuG(xPT@-dCv5J{IxVoQg-|p|dF+tbyFHA8dCvxFfnJmljqoqZ!ZEcaouI@OvvKx+=mNVI4PV3r7 z^v8Xb8Lx8g{6C9M1<0{jTlFGn^Y76A}315-ddWebRAXVD6BM5i5IW&G+T}vOZr$nBK>ricn*- zENh}`e-Ss&sVo2B#8(gAH>WWy+G|!@*x$c?Q0}nA`cHqa&5J^up6wj}#cgaDfz{x7 z$-hna=~Wz84Ip=S)s`_D`}}fmkL9r5@~H^9kIT??E~#_!-NP7S_W$XR{LSu*$^Eei zcxA7Ae>*@GxQ7}!HRBbTBO{{Fc9@3ry_%Yvd0(%$olNwBeN}~meeAs)n+JWEsm-{n z@mUq8?O$Ayug(uuH9o|=*!9xfkb`mly(%NzF)u@#qE;i;XzKF*W>FtLu;gB|xu|g+ z%-ygZm{Za{$$>^>qG6tA_u>7-lG>fYb2Fyqc)>ak-pgbC%`xA_C$DkoF5}ud7uLji z_xOR*o=L95<*^(!i|YBX!j(*~=lgGR}%*JI$db$?IJnX}{$tH1clL-sCX zdD5r48du;=W2;>?`isA`a5M8pqwOMItmU^%s3}GlTS|y2UU#=FIO6(ORn50X#t~lZ z=dQ{RmWCH!;t{pX*z@{MB!*@D@}EtyUme^CLe}>T<0)Iyeps4=@=*+!2&tutvm)3|Y{ALaN{>lH{TW^h8p;sYeE*rj@ z6{6|SwX@o|7)2%8>C>x=-|Mt}KeK2J1jSsHWRC6yM z#C93QV$Ay;$7SVHBX7hPXYq@1o#39xW6pX_eJ=-gIlnJ(1}7@7IwA9p$n}peS-EK6 zOwx(>H^i`~8t}F{b}TJqzijHw^N>9WWV>tRVUgunzp>uy-FL6JKl$TcO0-7MZq<_g zP%UdWyYK1Eh!&TKvs5gL-;vE~JtO9+K3`=vV`#KCR%Wd$dj%G}`kOlXwBos11a|f` zBZ^SNAAZAH&WhiAL+(26?y9+ce%W4LZr-k354sraZe|)ZsSMlJs0u9KyI%#T-D#DW zu%!CxX=r2K-s^15M)yS#E^Kv%!~W-=PRLh@pL4T5Pv+qw+=+ZEul8cME?nq|z<+Z#mdc1ae*1M~>&beY^^sZG+jG7ggt4`!WF4g!{ zhn42RMBifCTd>87Uu&zMJZ2}2iUa%JxjtDdzV&3X;Qu0|x6hSgu{v+hVBA0Op;vXz ztXJ{=HcR_dcemc0iBy|q(Vh7H79nk!p*KDek`=6D#rR^&vAg#$kC@HS*l|?G;=~$B zx$|uFukCgvu%oM0t{ts!Jw7|T@sH`t?sQFLbplqvNip;P_4fbY4I?pt(9B=^*`gAv zo!P^7CwZ}iD5QJcoy}a;)@#ITkC4k>-AT^N3h#EkoXvNcC*#(0on#e~idn_Ovo79! zuaDaanUy!Md^d07{oRjP8M<%vrBJN-$2oHCzg}DJuCB7gtGS$Foqz2Ou?nf58dY_4 zd;2FInc`VR*umfP3U{hd_0xO51+`AarDw1GoYps`j>&7aLv6^EY<^$wTae{&9K9^v zyviPWFO#cx{{g@j_uo7WsbY3*Qn+DuFT#TE1uRDrCvgpj>>MUR7yH^^pmNp zCYb4r>p3^1brY54v)VD=Lm<*Ti*WftFT=ws^)3r`hqu08&AS(fMkYIdt9{pAe8oq; z?&nq`<8D_sV&m~Sg!Lxpd(UV;^FVg)A68oTWXK0rH@+QX7P9~YZ@xv%8siO_`ibE* zU(Lv!`B%|KvMMX1cm$=d#ZTTu{jU)Id0|Av@fXtqJ{5}uSSI{-z^Z!% z?mFnz#KqCsy**5HWFHk0H~6NG?;Ks8QsG|7XtiXgvc6M5H97`k^1e=8toF>&ziC8X zz3&R}V6A+I#cE=Xcg6ksEzUXvbBS10b9V8keA?2}Wp+O0Ew{H zy!ai4|5~=#cQ*Lk1GSq?BEPk7+~#HgxT?4qRMVaJ=2jbH*()uiA>NI}i?$fY z`RCQ0jSad;ox~hyJ3X6$dN~oBS^Hk+Wb|8ipBmx<3~$7~FUlKZV|Q=kROAD8u(s&s zzbM5PMrRhmEX+qL5uLU=(cnd#yDEPC_=kHcwO3ipRx`!axd+SO5wD~5dFyt0$`h!q zW_zicXI`VKaWTbv-PH`?l~p32vM#3~b8aws#c=sX*V=Iz90QTwvnCp|dIZ{3H!k@sCW6Sh2ESF6rcTXjEkpq<~>%!iS8*No9P z1{rgT{=I6{IkCVllJak#^r~;>VF@#L{?kjqi)E^94$C zOdjM9MED9H=WO`SYE*ajhj{gWjOyII-Aw+& zY1fFYz2cua+HBlvS>L*!O|kop+7+TtZ)rd+rY&rF9n03UwWWHDz5id#ole`{$AjG% z279D+=QqbH7xU(}hS!VTjM!7iomb^TpRT>kx=&hVZ`4&>EEid`^dDpM*G}08J;_Q3 z?W}H0PW2mnGwp&9MrPtqY4PD+6{LctpXj-;Ce6bo9Fqzw5QE)il*k zPDdHZ0c5w_du@y(+M=uU85KLC69)1CTVuEv~kXsdOv#RO1zNeXGr)(@stpiE8y1NWjJ!K3p%YrD~(WplMRNGj7ANa(gHuBmI zfVFX-Eje@z{Gxg)_tT%K;H>>E{$9NC{=QCOpcobawIGwTQ}#YY;I(Wz29)5FV~jQZJex`l(wbsBQNoJFGPcV<}) z_In0T%V`1BaHs{I@15(ls8sf{UIxBj%bVPR1wTZw-04ql^?Z9%xfz2gRuq@h{2Pxk z?b*8`Dk|9xr5IqK%v@h~W4n8wi?A7=UEOLG$)3rC`@tK3e$-3vjL>{qeRfAJ_lhr;ucBbh$hf+X z#nI>;;W`bx_d#068O~kB%dEkMqt<;)*9EXYf7dT7Klek?kQ4J?biA&gbiR~}*c_6s zc4t@EjrFV5a@5R40~+rV3HN#LTHY@v{KiZe7q8N)E&RPpLzww~Y`{~S|Q!(T7 z4;WNTujcS-co|61`OO+uT$h#m3O3kr6*I}M=dbtw$kvLMcy=b$@x8}#@BOsZY*0?Y z+A)tZu5KIwCyzQsdvX!F!e^pY$)3`i!?^paS|c_i{$u)II>APd-}&1f9Iw4@tz2p+ z9(Qgpzq2&t+Az)(i5)AAxX6getJnI{XNQW@RHD6AK=;XKxsV&~jK^@u$3FXr8XlWr z&Q@(8*OKh>{yu)+!}~NAN?)<(eeuDrS!`Us)qtmZIhDahHFbz0tJCqdEow&=--~~C zn5XK~A`F3(ache2HPpX-p6aQBWY%Z1=YISu=9AmdWkn8o*0)!7&3)F1HzJhdmr=)F z)ijgQTf-i>%Ue`>sot^&Qvs4}z_#)!@4lyGzQ}zo&Wj2|LZ@$#rW_4=;L$86MuVk z3{e5v>;7JeVGmZ^ow0fLqVCCT(Zh!IVqcY=<*dvYwRf@f>uOAeBCg_cc2$hL;iDci ztVC@;X)o$KV{?4j-s$MqDM1u{@3bCNZeg$-|2=!EPgM7Fd{$)Cdg>h1P7yv&#%V2< zmS3yMjuGm{SSw#;(#&_Run))8V!Am9UAo!XE2iHQP4nuz^<$M*t$}L0f*8po$Q!@s z8Y5BxF%QbFQ6LA?OkVVUMhqu)}jm|bD!`o==Lc7eP3(t);*c) zEVN;bh1R*V_K7NdSmPXVzv~1=$g?kV>8>6l`f-O>=HPd8uL6d0u?~w2Fh?#^oi=}I z7!B16(<%`$HXK8P4bM$|Py5@p{*AsfPMY}4mWr0c%cI`p)8Z&>nGDhc{TVq5&;;?^CL-yNw)O+}U@fZRvx4XF0)LFtNAE`IB zsZ;F`KUZZ+3#w_W*X8wteVN;9XVY>gFV^3#nU9j)FNm)bw7M0QJl4gC6h{2lCh$#l z+2ORTo!Amnf3xNOHfA`6`tMQPv%}`cl&r;J`E;Ih?7DJ}hL#0UFrrf8UbXrTOR543 zM7B(E50A4ApV(iXc6GbwTP<%NsF&%-+)q{3wOMlptHThI-j5F%x~vWR?y2JS*w-HO z%G|wT{8|&UJjcHI-5wo}#jvbsZ5b>B=~^D&`(`3vpb@#V^!>MM`wCuJM_gRl&D)Lr zG#IPS$P2S?#AqaybvCKzfY3@5;cSG_k^7Du!dq3f6IHfuPNr7<6g4QlHnwbnEL7T2 zjdogAm}xsjHmhm>Z)bC7Kk1zF*?VQEtbh8*kF!+!{WpR{Avfy1Xha0#A|yJ061G#p zWpkcngZ1W%pUQf&TJ~V=`w>q@V^3(-%>{SB{LLVi;;F#X6aq(Z1KraMtI} z3KPxeb$t#*@$648#10;8xsnL*E8Fq5_sfG3s`T_61K1ED{iL6VItGW`)hD0F-BJ7& zop0-gB7Hc5hhkzE3?aGnvzh!_=W(5m#tw*M%KDN6Mu`!-?XuuC^VNiT&pNNziUn8q zF4bVgj4(UCt*GMAv-jTTR-`~r3V0^c*JJOBulx97#U5A9<};NUu`w`zUKV>}ed<(g zX|BBEQ!csV=hKjU?-W`e<5y*1tMYy$yZ4Rl=FsTXo|#zA|DK)CZ1r9iKRF(6RZtaU zU(-8ly-z%_;dpWLE}o6U9to#(;q-D}Z|vCD*6*w9@7hSitm3igQf58#a(S(d^)d0S zS%&T5T81Uv*ilTWtS^#Wrek` z+R~_Z7~XTDUo`IQ?u*q^Pwh}wVS zVQPp;m16f8%9u(YX~%KBrm^bf69G|~4-pk*8LL{=f;xeFkQKKYEvq-)bYx`rS+#ef z;+(09uAa*}_du5()0@_rl`3Bww|_1N;M*g+fE=^0xH!> zw&Jq9meDEoo*uySJrkbmC}Vk94u`##^>W=Bt^O@;{nh!FO|1Msf7t(@|HR>}bjH27 z`J1lBOsczVylC7h%6xTRKA3CX@3&Y+H!X@uT)QS)_Wcx^b@I6=(vM?zZp?gpg4Z5m zRdvKc%$4CUykx*3@G4QsssHxHELOFe~(%V_~y_54^~Sh!~g&Q diff --git a/library/umeng/build.gradle b/library/umeng/build.gradle index 1ba4dc0..9ec205e 100644 --- a/library/umeng/build.gradle +++ b/library/umeng/build.gradle @@ -11,17 +11,10 @@ android { buildConfigField('String', 'UMENG_APP_KEY', '"' + UMENG_APP_KEY + '"') buildConfigField('String', 'UMENG_APP_MASTER_SECRET', '"' + UMENG_APP_MASTER_SECRET + '"') buildConfigField('String', 'UMENG_MESSAGE_SECRET', '"' + UMENG_MESSAGE_SECRET + '"') - buildConfigField('String', 'QQ_ID', '"' + QQ_APP_ID + '"') - buildConfigField('String', 'QQ_SECRET', '"' + QQ_APP_SECRET + '"') buildConfigField('String', 'WX_ID', '"' + WX_APP_ID + '"') buildConfigField('String', 'WX_SECRET', '"' + WX_APP_SECRET + '"') buildConfigField('String', 'HOST_URL', '"' + HOST_URL + '"') - // 清单占位符 - addManifestPlaceholders([ - 'QQ_ID' : QQ_APP_ID, - ]) - // dialogx自带主题与引用的ios主题类名重复 排除重复的类 configurations { all*.exclude group: 'com.kongzue.dialogx', module: 'DialogX' @@ -37,10 +30,7 @@ dependencies { api DEPENDENCIES['umeng-push'] api DEPENDENCIES['umeng-share'] api DEPENDENCIES['umeng-share-wx'] - api DEPENDENCIES['umeng-share-qq'] api DEPENDENCIES['wechatcomponent'] api DEPENDENCIES['kongzue-dialog-x'] api DEPENDENCIES['kongzue-dialog-x-ios-style'] - api DEPENDENCIES['huawei-push'] - api DEPENDENCIES['huawei-umengaccs'] } \ No newline at end of file diff --git a/library/umeng/src/main/AndroidManifest.xml b/library/umeng/src/main/AndroidManifest.xml index 860447c..d3254f3 100644 --- a/library/umeng/src/main/AndroidManifest.xml +++ b/library/umeng/src/main/AndroidManifest.xml @@ -27,26 +27,6 @@ - - - - - - - - - - - - - - diff --git a/library/umeng/src/main/java/com/dolphin/umeng/UmengClient.java b/library/umeng/src/main/java/com/dolphin/umeng/UmengClient.java index fcdfa1a..23e1ef0 100644 --- a/library/umeng/src/main/java/com/dolphin/umeng/UmengClient.java +++ b/library/umeng/src/main/java/com/dolphin/umeng/UmengClient.java @@ -1,12 +1,14 @@ package com.dolphin.umeng; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.Application; import android.app.Notification; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.PowerManager; import android.text.TextUtils; import android.util.Patterns; import android.widget.RemoteViews; @@ -14,26 +16,25 @@ import android.widget.RemoteViews; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.blankj.utilcode.util.CacheDiskUtils; +import com.blankj.utilcode.util.FlashlightUtils; import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.StringUtils; +import com.blankj.utilcode.util.ThreadUtils; import com.blankj.utilcode.util.Utils; +import com.blankj.utilcode.util.VibrateUtils; import com.dolphin.core.bus.RxBus; import com.dolphin.core.constant.AppConstant; import com.dolphin.core.util.NotificationUtil; import com.dolphin.core.util.ToastUtil; -import com.dolphin.umeng.entity.ChatMsg; -import com.dolphin.umeng.entity.CustomMsg; +import com.dolphin.umeng.entity.PushChatMessage; import com.dolphin.umeng.enums.PlatformEnum; import com.dolphin.umeng.listener.UmengLoginListener; import com.dolphin.umeng.listener.UmengShareListener; -import com.dolphin.umeng.util.PushTypeHandle; +import com.dolphin.umeng.util.MultimediaUtil; import com.google.gson.Gson; -import com.kongzue.dialogx.dialogs.PopNotification; import com.tencent.mmkv.MMKV; import com.umeng.analytics.MobclickAgent; import com.umeng.commonsdk.UMConfigure; -import com.umeng.commonsdk.utils.UMUtils; import com.umeng.message.MsgConstant; import com.umeng.message.PushAgent; import com.umeng.message.UmengMessageHandler; @@ -44,7 +45,7 @@ import com.umeng.socialize.PlatformConfig; import com.umeng.socialize.ShareAction; import com.umeng.socialize.UMShareAPI; -import org.android.agoo.huawei.HuaWeiRegister; +import java.util.concurrent.TimeUnit; import lombok.experimental.UtilityClass; @@ -68,7 +69,6 @@ public final class UmengClient { * @param application 应用程序上下文 * @param logEnable 友盟日志开关 */ - @SuppressLint("WrongConstant") public void init(Application application, boolean logEnable) { preInit(application, logEnable); // 初始化组件化基础库,统计SDK/推送SDK/分享SDK都必须调用此初始化接口 @@ -78,7 +78,6 @@ public final class UmengClient { UMConfigure.getOaid(application, oaid -> sDeviceOaid = oaid); // 播放器初始化 mApplication = application; -// mediaPlayer.setLooping(true); 关闭循环播放效果 } /** @@ -93,7 +92,6 @@ public final class UmengClient { // 初始化各个平台的 ID 和 Key PlatformConfig.setWeixin(BuildConfig.WX_ID, BuildConfig.WX_SECRET); - PlatformConfig.setQQZone(BuildConfig.QQ_ID, BuildConfig.QQ_SECRET); // 初始化各个平台的文件提供者(必须要初始化,否则会导致无法分享文件) String fileProvider = application.getPackageName() + ".fileProvider"; @@ -146,7 +144,6 @@ public final class UmengClient { @Override public void dealWithCustomAction(Context context, UMessage msg) { - // todo: 新消息单击事件 跳转至消息列表页 if (!StringUtils.isTrimEmpty(msg.custom)) { Intent intent = new Intent("com.android.kanglai.push.TabBarActivity"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -156,6 +153,7 @@ public final class UmengClient { } }; pushAgent.setNotificationClickHandler(notificationClickHandler); + // 消息通知的回调处理 UmengMessageHandler messageHandler = new UmengMessageHandler() { /** @@ -163,22 +161,40 @@ public final class UmengClient { */ @Override public void dealWithNotificationMessage(Context context, UMessage msg) { - String accessToken = MMKV.defaultMMKV().getString(AppConstant.ACCESS_TOKEN_NAME,null); - // todo 离线铃声 以及 在线铃声需要做一个区分 - if (!StringUtils.isTrimEmpty(msg.custom) && !StringUtils.isEmpty(accessToken)) { // 消息不为空 以及 用户已登录 才接收推送 - CustomMsg custom = new Gson().fromJson(msg.custom, CustomMsg.class); - custom.setText(msg.text); - custom.setTitle(msg.title); - if (!TextUtils.isEmpty(custom.getOnlineRingtone())) custom.setOnlineRingtone(repairOnlineRingtone(custom.getOnlineRingtone())); - - PushTypeHandle pushTypeHandle = new PushTypeHandle(mApplication, custom); // 接收到推送类型后进行响应 - pushTypeHandle.judgePushType(); - RxBus.getInstance().postSticky(custom); // 向消息碎片页传输数据 - RxBus.getInstance().postSticky(new ChatMsg(custom.getFanUserId(), msg.text)); // 向聊天活动页传输数据 - popNotification(msg.title,msg.text); // app内部弹窗 + if (!StringUtils.isTrimEmpty(msg.custom) && !StringUtils.isEmpty(accessToken)) { + PushChatMessage pushChatMessage = new Gson().fromJson(msg.custom, PushChatMessage.class); + pushChatMessage.setTitle(msg.title); + pushChatMessage.setText(msg.text); + // 检测是否拼接后端oss文件服务器地址 + if (!StringUtils.isEmpty(pushChatMessage.getOnlineRingtone()) && !Patterns.WEB_URL.matcher(pushChatMessage.getOnlineRingtone()).matches()) { + pushChatMessage.setOnlineRingtone(BuildConfig.HOST_URL + pushChatMessage.getOnlineRingtone().substring(1)); + } + + // 推送类型相关逻辑 + if (pushChatMessage.getPlayVibrate()) + VibrateUtils.vibrate(800); + if (pushChatMessage.getPlayLights()) { + FlashlightUtils.setFlashlightStatus(true); + ThreadUtils.executeBySingleWithDelay(new Utils.Task(result -> {}) { + @Override + public Void doInBackground() { + FlashlightUtils.setFlashlightStatus(false); + return null; + } + + }, 1000, TimeUnit.MILLISECONDS); + } + if (pushChatMessage.getPlayToText() && pushChatMessage.getPlaySound()) { + MultimediaUtil.playSoundAndTtsSpeak(pushChatMessage.getOnlineRingtone(), pushChatMessage.getText()); + } else if (pushChatMessage.getPlayToText()) { + MultimediaUtil.ttsSpeak(pushChatMessage.getText()); + } else if (pushChatMessage.getPlaySound()) { + MultimediaUtil.playSound(pushChatMessage.getOnlineRingtone()); + } + RxBus.getInstance().postSticky(pushChatMessage); } -// super.dealWithNotificationMessage(context, msg); + super.dealWithNotificationMessage(context, msg); } /** @@ -221,25 +237,6 @@ public final class UmengClient { LogUtils.i("register failed: " + s + " " + s1); } }); - if (UMUtils.isMainProgress(application)) { - HuaWeiRegister.register(application); - } - } - - private static void popNotification(String tit, String text) { - if ("true".equals(CacheDiskUtils.getInstance().getString("NOTIFICATION_APP_POP_UP", "true"))) PopNotification.show(tit, text).showLong(); - } - - /** - * 修复在线铃声 - * 判断是完整的url字符串 - * @param ringtone - * @return - */ - private static String repairOnlineRingtone(String ringtone) { - if (!Patterns.WEB_URL.matcher(ringtone).matches()){ - return BuildConfig.HOST_URL + ringtone.substring(1); - }else return ringtone; } /** diff --git a/library/umeng/src/main/java/com/dolphin/umeng/entity/ChatMsg.java b/library/umeng/src/main/java/com/dolphin/umeng/entity/ChatMsg.java deleted file mode 100644 index c808d9e..0000000 --- a/library/umeng/src/main/java/com/dolphin/umeng/entity/ChatMsg.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dolphin.umeng.entity; - -import android.os.Parcel; -import android.os.Parcelable; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 用户实时聊天数据 - * @Author: liusixiang007 - * @since: 2023/6/1 - */ -@Data -@Accessors -public class ChatMsg implements Parcelable { - public String concernFanId; - public String content; - - public ChatMsg() {} - public ChatMsg(String userId,String content){ - this.concernFanId = userId; - this.content = content; - } - protected ChatMsg(Parcel in) { - concernFanId = in.readString(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public ChatMsg createFromParcel(Parcel in) { - return new ChatMsg(in); - } - - @Override - public ChatMsg[] newArray(int size) { - return new ChatMsg[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeString(concernFanId); - } -} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsg.java b/library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsg.java deleted file mode 100644 index 6023bd2..0000000 --- a/library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsg.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.dolphin.umeng.entity; - -import android.os.Parcel; -import android.os.Parcelable; - -import com.kongzue.dialogx.dialogs.BottomDialog; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 友盟数据传输类 - * 仅传输接收到的有用的数据 - * @Author: liusixiang007 - * @since: 2023/7/6 - */ -@Data -@Accessors -public class CustomMsg implements Parcelable{ - - /**粉丝用户id*/ - private String fanUserId; - /**文字转语音*/ - private String playToText; - /**收到通知是否发出声音*/ - private String playSound; - /**收到通知是否闪灯*/ - private String playLights; - /**收到通知是否震动*/ - private String playVibrate; - /**离线铃声*/ - private String offlineRingtone; - /**在线铃声*/ - private String onlineRingtone; - /**通知标题*/ - private String title; - /**通知文字描述*/ - private String text; - - public CustomMsg(Parcel in) { - title = in.readString(); - text = in.readString(); - playVibrate = in.readString(); - playLights = in.readString(); - playSound = in.readString(); - playToText = in.readString(); - onlineRingtone = in.readString(); - offlineRingtone = in.readString(); - fanUserId = in.readString(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public CustomMsg createFromParcel(Parcel in) { - return new CustomMsg(in); - } - - @Override - public CustomMsg[] newArray(int size) { - return new CustomMsg[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeString(title); - parcel.writeString(text); - parcel.writeString(playVibrate); - parcel.writeString(playLights); - parcel.writeString(playSound); - parcel.writeString(playToText); - parcel.writeString(onlineRingtone); - parcel.writeString(offlineRingtone); - parcel.writeString(fanUserId); - } -} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsgDemo.java b/library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsgDemo.java deleted file mode 100644 index 84a197e..0000000 --- a/library/umeng/src/main/java/com/dolphin/umeng/entity/CustomMsgDemo.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.dolphin.umeng.entity; - -import android.os.Parcel; -import android.os.Parcelable; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - *

- * 演示 - * 自定义消息传输数据 - *

- * - * @Author: wangxiang4 - * @since: 2023/2/12 - */ -@Data -@Accessors -public class CustomMsgDemo implements Parcelable { - - protected String title; - - protected String data; - - public CustomMsgDemo() {} - - public CustomMsgDemo(Parcel in) { - title = in.readString(); - data = in.readString(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(title); - dest.writeString(data); - } - - @Override - public int describeContents() { - return 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public CustomMsgDemo createFromParcel(Parcel in) { - return new CustomMsgDemo(in); - } - - @Override - public CustomMsgDemo[] newArray(int size) { - return new CustomMsgDemo[size]; - } - }; - -} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/entity/PushChatMessage.java b/library/umeng/src/main/java/com/dolphin/umeng/entity/PushChatMessage.java new file mode 100644 index 0000000..a128ad9 --- /dev/null +++ b/library/umeng/src/main/java/com/dolphin/umeng/entity/PushChatMessage.java @@ -0,0 +1,65 @@ +package com.dolphin.umeng.entity; + +import android.os.Parcel; +import android.os.Parcelable; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors +public class PushChatMessage implements Parcelable{ + + private String fanUserId; + private String offlineRingtone; + private String onlineRingtone; + private Boolean playToText; + private Boolean playSound; + private Boolean playLights; + private Boolean playVibrate; + private String type; + private String title; + private String text; + + public PushChatMessage(Parcel in) { + title = in.readString(); + text = in.readString(); + playVibrate = in.readBoolean(); + playLights = in.readBoolean(); + playSound = in.readBoolean(); + playToText = in.readBoolean(); + onlineRingtone = in.readString(); + offlineRingtone = in.readString(); + fanUserId = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public PushChatMessage createFromParcel(Parcel in) { + return new PushChatMessage(in); + } + + @Override + public PushChatMessage[] newArray(int size) { + return new PushChatMessage[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(title); + parcel.writeString(text); + parcel.writeBoolean(playVibrate); + parcel.writeBoolean(playLights); + parcel.writeBoolean(playSound); + parcel.writeBoolean(playToText); + parcel.writeString(onlineRingtone); + parcel.writeString(offlineRingtone); + parcel.writeString(fanUserId); + } +} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/util/BaiduTtsUtil.java b/library/umeng/src/main/java/com/dolphin/umeng/util/BaiduTtsUtil.java new file mode 100644 index 0000000..c68b590 --- /dev/null +++ b/library/umeng/src/main/java/com/dolphin/umeng/util/BaiduTtsUtil.java @@ -0,0 +1,92 @@ +package com.dolphin.umeng.util; + +import android.content.Context; + +import com.baidu.tts.client.SpeechError; +import com.baidu.tts.client.SpeechSynthesizer; +import com.baidu.tts.client.SpeechSynthesizerListener; +import com.baidu.tts.client.TtsMode; +import com.blankj.utilcode.util.LogUtils; +import com.blankj.utilcode.util.Utils; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class BaiduTtsUtil { + private volatile boolean isInitTts; + private SpeechSynthesizer mSpeechSynthesizer; + private static final String BD_APP_ID = "37122313"; + private static final String BD_APP_KEY = "BNrZhvnx5DgX74j847KKrjzn"; + private static final String BD_APP_SECRET_KEY = "bF33QKfD1grBbO1R0Ur1L0A65wGkj3GR"; + + static { + mSpeechSynthesizer = SpeechSynthesizer.getInstance(); + mSpeechSynthesizer.setContext(Utils.getApp().getApplicationContext()); + mSpeechSynthesizer.setSpeechSynthesizerListener(new SpeechSynthesizerListener() { + @Override + public void onSynthesizeStart(String s) { + LogUtils.d("准备开始合成,序列号:" + s); + } + + @Override + public void onSynthesizeDataArrived(String s, byte[] bytes, int i, int i1) {} + + @Override + public void onSynthesizeFinish(String s) { + LogUtils.d("合成结束回调, 序列号:" + s); + } + + @Override + public void onSpeechStart(String s) { // 开始播放 暂时提高媒体音量 + LogUtils.d("播放开始回调, 序列号:" + s); + } + + @Override + public void onSpeechProgressChanged(String s, int i) { + LogUtils.d("播放进度回调, progress:" + s + ";序列号:" + i); + } + + @Override + public void onSpeechFinish(String s) { // 播放结束之后恢复媒体音量 + LogUtils.d("SpeechSynthesizerListener-onSpeechFinish 播报结束"); + release(); // 播放结束之后就清除占用 + } + + @Override + public void onError(String s, SpeechError speechError) { + mSpeechSynthesizer.pause(); + LogUtils.d("语音合成报错 错误id"+s+" 报错原因 "+speechError); + } + }); + mSpeechSynthesizer.setAppId(BD_APP_ID); + mSpeechSynthesizer.setApiKey(BD_APP_KEY , BD_APP_SECRET_KEY); + // 设置在线发声音人: 0 普通女声(默认) 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫> + mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0"); + // 设置合成的音量,0-15 ,默认 5 + mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "15"); + // 设置合成的语速,0-15 ,默认 5 + mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5"); + // 设置合成的语调,0-15 ,默认 5 + mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5"); + // 仅需要在线合成并不使用压缩传输 + mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_RATE, SpeechSynthesizer.AUDIO_BITRATE_PCM); + mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_ENCODE, SpeechSynthesizer.AUDIO_ENCODE_PCM); + int result = mSpeechSynthesizer.initTts(TtsMode.ONLINE); + isInitTts = result == 0; + } + + public int ttsSpeak(String text) { + if (mSpeechSynthesizer != null && isInitTts){ + return mSpeechSynthesizer.speak(text); + } else return 1; + } + + public void release() { + if (mSpeechSynthesizer != null){ + mSpeechSynthesizer.stop(); + mSpeechSynthesizer.release(); + isInitTts = false; + mSpeechSynthesizer = null; + } + } +} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/util/MultimediaUtil.java b/library/umeng/src/main/java/com/dolphin/umeng/util/MultimediaUtil.java new file mode 100644 index 0000000..66e770b --- /dev/null +++ b/library/umeng/src/main/java/com/dolphin/umeng/util/MultimediaUtil.java @@ -0,0 +1,42 @@ +package com.dolphin.umeng.util; + +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.PowerManager; +import android.text.TextUtils; + +import com.blankj.utilcode.util.Utils; +import com.blankj.utilcode.util.VolumeUtils; +import com.dolphin.umeng.R; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class MultimediaUtil { + + private MediaPlayer mediaPlayer; + + public void playSound(String onlineRingtone) { + if (TextUtils.isEmpty(onlineRingtone)) { + mediaPlayer = MediaPlayer.create(Utils.getApp().getApplicationContext(), R.raw.audio_system_hint); + } else mediaPlayer = MediaPlayer.create(Utils.getApp().getApplicationContext(), Uri.parse(onlineRingtone)); + mediaPlayer.setWakeMode(Utils.getApp().getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); + if (VolumeUtils.getMinVolume(AudioManager.STREAM_MUSIC) == 0) { + VolumeUtils.setVolume(AudioManager.STREAM_MUSIC, VolumeUtils.getMaxVolume(AudioManager.STREAM_MUSIC)/3, AudioManager.FLAG_PLAY_SOUND); + } + mediaPlayer.start(); + } + + public void ttsSpeak(String ttsText) { + BaiduTtsUtil.ttsSpeak(ttsText); + } + + public void playSoundAndTtsSpeak(String onlineRingtone, String ttsText) { + playSound(onlineRingtone); + mediaPlayer.setOnCompletionListener(mp -> { + ttsSpeak(ttsText); + }); + } + +} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/util/PushTypeHandle.java b/library/umeng/src/main/java/com/dolphin/umeng/util/PushTypeHandle.java deleted file mode 100644 index b54acad..0000000 --- a/library/umeng/src/main/java/com/dolphin/umeng/util/PushTypeHandle.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.dolphin.umeng.util; - -import android.content.Context; -import android.hardware.camera2.CameraAccessException; -import android.hardware.camera2.CameraManager; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.net.Uri; -import android.os.PowerManager; -import android.os.VibrationEffect; -import android.os.Vibrator; -import android.text.TextUtils; - -import com.blankj.utilcode.util.LogUtils; -import com.dolphin.umeng.R; -import com.dolphin.umeng.entity.CustomMsg; - -import java.util.Timer; -import java.util.TimerTask; - -/** - * 推送类型响应类 - * @Author: liusixiang007 - * @since: 2023/7/10 - */ -public class PushTypeHandle { - - private Context context; - private MediaPlayer mediaPlayer; // 音乐提示播放器 - private CustomMsg msg; // 响应属性实体类 - private TtsSyntherizer mTtsSyntherizer; - - public PushTypeHandle(Context context, CustomMsg item){ - this.mTtsSyntherizer = new TtsSyntherizer(context); - this.context = context; - this.msg = item; - } - - /** - * 判断响应类型 先闪光 震动 再 提示音 和语音转文字 - */ - public void judgePushType() { - if ("true".equals(msg.getPlayLights())) isPlayLights(); - if ("true".equals(msg.getPlayVibrate())) isPlayVibrate(); - if ("true".equals(msg.getPlaySound())) isPlaySound(msg); - } - - /** - * 是否播放声音 以及 文字转语音 - * @param item - */ - public void isPlaySound(CustomMsg item) { - AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - if (TextUtils.isEmpty(item.getOnlineRingtone())) { // 没有设置离线铃声 - mediaPlayer = MediaPlayer.create(context, R.raw.audio_system_hint); - }else { // 设置了提示铃声 - mediaPlayer = MediaPlayer.create(context, Uri.parse(item.getOnlineRingtone())); - } - mediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); // 设置离线播放模式 - int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); - if(currentVolume == 0) { // 媒体通道为静音状态 则设置为33%的音量 - audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) / 3, 0); - } - mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { // 播放结束的逻辑 - @Override - public void onCompletion(MediaPlayer mp) { - if ("true".equals(item.getPlayToText())) mTtsSyntherizer.ttsSpeak(item.getTitle()); // 开始播放语音合成 - if (currentVolume == 0) audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); // 恢复媒体通道静音 - } - }); - mediaPlayer.start(); // 开始播放提示音 - } - - /**闪光灯闪烁 一次 1s 后关闭*/ - public void isPlayLights() { - CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); - try { - String cameraId = cameraManager.getCameraIdList()[0]; - cameraManager.setTorchMode(cameraId, true); // 开启闪光灯 - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - try { - cameraManager.setTorchMode(cameraId, false); - } catch (CameraAccessException e) { - throw new RuntimeException(e); - } - } - }, 1000); - } catch (CameraAccessException e) { - throw new RuntimeException(e); - } - } - - /**震动 800毫秒*/ - public void isPlayVibrate() { - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - // 检查设备是否支持震动 - if (vibrator != null && vibrator.hasVibrator()){ - VibrationEffect vibrationEffect = VibrationEffect.createOneShot(800, VibrationEffect.DEFAULT_AMPLITUDE); // 定义震动时常(单位毫秒)以及震动强度 - vibrator.vibrate(vibrationEffect); // 单位:毫秒 - } - } -} diff --git a/library/umeng/src/main/java/com/dolphin/umeng/util/TtsSyntherizer.java b/library/umeng/src/main/java/com/dolphin/umeng/util/TtsSyntherizer.java deleted file mode 100644 index f7fb80e..0000000 --- a/library/umeng/src/main/java/com/dolphin/umeng/util/TtsSyntherizer.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.dolphin.umeng.util; - -import android.content.Context; - -import com.baidu.tts.client.SpeechError; -import com.baidu.tts.client.SpeechSynthesizer; -import com.baidu.tts.client.SpeechSynthesizerListener; -import com.baidu.tts.client.TtsMode; -import com.blankj.utilcode.util.LogUtils; - -/** - * 百度在线语音合成 - * @Author: liusixiang007 - * @since: 2023/8/11 - */ -public class TtsSyntherizer { - - private Context context; - private volatile boolean isInitTts = false; // 当前播放状态 - protected SpeechSynthesizer mSpeechSynthesizer; - private static final String BD_APP_ID = "37122313"; - private static final String BD_APP_KEY = "BNrZhvnx5DgX74j847KKrjzn"; - private static final String BD_APP_SECRET_KEY = "bF33QKfD1grBbO1R0Ur1L0A65wGkj3GR"; - - public TtsSyntherizer(Context context) { - this.context = context; - initTTs(); - } - - private void initTTs() { - new Thread(new Runnable() { - @Override - public void run() { - mSpeechSynthesizer = SpeechSynthesizer.getInstance(); - mSpeechSynthesizer.setContext(context); - mSpeechSynthesizer.setSpeechSynthesizerListener(new SpeechSynthesizerListener() { - @Override - public void onSynthesizeStart(String s) { - LogUtils.d("准备开始合成,序列号:" + s); - } - - @Override - public void onSynthesizeDataArrived(String s, byte[] bytes, int i, int i1) { - - } - - @Override - public void onSynthesizeFinish(String s) { - LogUtils.d("合成结束回调, 序列号:" + s); - } - - @Override - public void onSpeechStart(String s) { // 开始播放 暂时提高媒体音量 - LogUtils.d("播放开始回调, 序列号:" + s); - } - - @Override - public void onSpeechProgressChanged(String s, int i) { - LogUtils.d("播放进度回调, progress:" + s + ";序列号:" + i); - } - - @Override - public void onSpeechFinish(String s) { // 播放结束之后恢复媒体音量 - LogUtils.d("SpeechSynthesizerListener-onSpeechFinish 播报结束"); - release(); // 播放结束之后就清除占用 - } - - @Override - public void onError(String s, SpeechError speechError) { - mSpeechSynthesizer.pause(); - LogUtils.d("语音合成报错 错误id"+s+" 报错原因 "+speechError); - } - }); - - mSpeechSynthesizer.setAppId(BD_APP_ID); - mSpeechSynthesizer.setApiKey(BD_APP_KEY , BD_APP_SECRET_KEY); - // 设置在线发声音人: 0 普通女声(默认) 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫> - mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0"); - // 设置合成的音量,0-15 ,默认 5 - mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "15"); - // 设置合成的语速,0-15 ,默认 5 - mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5"); - // 设置合成的语调,0-15 ,默认 5 - mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5"); -// mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT); - // 仅需要在线合成并不使用压缩传输 - mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_RATE, SpeechSynthesizer.AUDIO_BITRATE_PCM); - mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_ENCODE, SpeechSynthesizer.AUDIO_ENCODE_PCM); - int result = mSpeechSynthesizer.initTts(TtsMode.ONLINE); - if (result == 0) { - isInitTts = true; - } else { - isInitTts = false; - } - } - }).start(); - } - - public int ttsSpeak(String text) { - if (mSpeechSynthesizer != null && isInitTts){ - int result = mSpeechSynthesizer.speak(text); - return result; - }else { - return 1; - } - } - - public void release() { - if (mSpeechSynthesizer != null){ - mSpeechSynthesizer.stop(); - mSpeechSynthesizer.release(); - isInitTts = false; - mSpeechSynthesizer = null; - } - } -} diff --git a/library/umeng/src/main/res/xml/file_paths.xml b/library/umeng/src/main/res/xml/file_paths.xml index 437f304..08c9a45 100644 --- a/library/umeng/src/main/res/xml/file_paths.xml +++ b/library/umeng/src/main/res/xml/file_paths.xml @@ -1,8 +1,5 @@ - - - \ No newline at end of file diff --git a/maven.gradle b/maven.gradle index ea792bd..5dfd180 100644 --- a/maven.gradle +++ b/maven.gradle @@ -18,7 +18,6 @@ static def addCommonMaven(RepositoryHandler handler) { handler.mavenCentral() handler.google() handler.maven { url 'https://developer.huawei.com/repo/'} - } ext.addCommonMaven = this.&addCommonMaven \ No newline at end of file