diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c85667a..1e7ce2bf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -156,6 +156,11 @@ + { + SettingUtil.switchPlaySilenceMusic(isChecked); + + if (isChecked) { + startService(new Intent(context, MusicService.class)); + } else { + stopService(new Intent(context, MusicService.class)); + } + Log.d(TAG, "onCheckedChanged:" + isChecked); + }); + } + //接口请求失败重试时间间隔 private void editRetryDelayTime(final EditText et_retry_times, final EditText et_delay_time) { et_retry_times.setText(String.valueOf(SettingUtil.getRetryTimes())); @@ -945,4 +968,48 @@ public class SettingActivity extends AppCompatActivity { return super.onMenuOpened(featureId, menu); } + /** + * 获取当前手机品牌 + * + * @return 手机品牌 + */ + public static String getAutoStartTips() { + String brand = Build.BRAND.toLowerCase(); + String tips; + + switch (brand) { + case "huawei": + tips = "华为手机:应用启动管理 -> 关闭应用开关 -> 打开允许自启动"; + break; + case "honor": + tips = "荣耀手机:应用启动管理 -> 关闭应用开关 -> 打开允许自启动"; + break; + case "xiaomi": + tips = "小米手机:授权管理 -> 自启动管理 -> 允许应用自启动"; + break; + case "oppo": + tips = "OPPO手机:权限隐私 -> 自启动管理 -> 允许应用自启动"; + break; + case "vivo": + tips = "vivo手机:权限管理 -> 自启动 -> 允许应用自启动"; + break; + case "meizu": + tips = "魅族手机:权限管理 -> 后台管理 -> 点击应用 -> 允许后台运行"; + break; + case "samsung": + tips = "三星手机:自动运行应用程序 -> 打开应用开关 -> 电池管理 -> 未监视的应用程序 -> 添加应用"; + break; + case "letv": + tips = "乐视手机:自启动管理 -> 允许应用自启动"; + break; + case "smartisan": + tips = "锤子手机:权限管理 -> 自启动权限管理 -> 点击应用 -> 允许被系统启动"; + break; + default: + tips = "未知手机品牌:需要自主查看设置操作"; + break; + } + + return tips; + } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/RebootBroadcastReceiver.java b/app/src/main/java/com/idormy/sms/forwarder/receiver/RebootBroadcastReceiver.java index 88acd49e..508ce591 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/RebootBroadcastReceiver.java +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/RebootBroadcastReceiver.java @@ -8,7 +8,9 @@ import android.util.Log; import com.idormy.sms.forwarder.service.BatteryService; import com.idormy.sms.forwarder.service.FrontService; +import com.idormy.sms.forwarder.service.MusicService; import com.idormy.sms.forwarder.utils.InitUtil; +import com.idormy.sms.forwarder.utils.SettingUtil; public class RebootBroadcastReceiver extends BroadcastReceiver { @@ -31,6 +33,11 @@ public class RebootBroadcastReceiver extends BroadcastReceiver { //电池状态监听 Intent batteryServiceIntent = new Intent(context, BatteryService.class); context.startService(batteryServiceIntent); + + //后台播放无声音乐 + if (SettingUtil.getPlaySilenceMusic()) { + context.startService(new Intent(context, MusicService.class)); + } } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/MusicService.java b/app/src/main/java/com/idormy/sms/forwarder/service/MusicService.java new file mode 100644 index 00000000..1a88abf8 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/service/MusicService.java @@ -0,0 +1,95 @@ +package com.idormy.sms.forwarder.service; + +import android.app.Service; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.os.IBinder; +import android.util.Log; + +import com.idormy.sms.forwarder.R; + +public class MusicService extends Service { + + private final String TAG = "MusicService"; + + private MediaPlayer mMediaPlayer; + + private AudioManager mAudioManager; + + private final AudioManager.OnAudioFocusChangeListener mAudioFocusChange = new + AudioManager.OnAudioFocusChangeListener() { + @Override + public void onAudioFocusChange(int focusChange) { + switch (focusChange) { + case AudioManager.AUDIOFOCUS_GAIN: + Log.e(TAG, "AUDIOFOCUS_GAIN"); + try { + startPlayMusic(); + } catch (Exception e) { + e.printStackTrace(); + } + break; + case AudioManager.AUDIOFOCUS_LOSS: + Log.e(TAG, "AUDIOFOCUS_LOSS"); + mAudioManager.abandonAudioFocus(mAudioFocusChange); + break; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + Log.e(TAG, "AUDIOFOCUS_LOSS_TRANSIENT"); + break; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: + Log.e(TAG, "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK"); + break; + } + } + }; + + public MusicService() { + + } + + @Override + public IBinder onBind(Intent intent) { + // TODO: Return the communication channel to the service. + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + //音标处理 + mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); + if (mAudioManager != null) + mAudioManager.requestAudioFocus(mAudioFocusChange, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + + mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.silence); + mMediaPlayer.setLooping(true); + + startPlayMusic(); + + return START_STICKY; + } + + + private void startPlayMusic() { + if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) { + Log.e(TAG, "启动后台播放音乐"); + mMediaPlayer.start(); + } + } + + private void stopPlayMusic() { + if (mMediaPlayer != null) { + Log.e(TAG, "关闭后台播放音乐"); + mMediaPlayer.stop(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + stopPlayMusic(); + Log.e(TAG, TAG + "---->onDestroy,停止服务"); + } + +} + diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java b/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java index 0fbbd9d8..b1d8095c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java @@ -11,6 +11,7 @@ public class Define { public static final String SP_MSG_KEY_STRING_ENABLE_APP_NOTIFY = "tsms_msg_key_switch_enable_app_notify"; public static final String SP_MSG_KEY_STRING_CANCEL_APP_NOTIFY = "tsms_msg_key_switch_cancel_app_notify"; public static final String SP_MSG_KEY_STRING_ENABLE_EXCLUDE_FROM_RECENTS = "tsms_msg_key_switch_enable_exclude_from_recents"; + public static final String SP_MSG_KEY_STRING_ENABLE_PLAY_SILENCE_MUSIC = "tsms_msg_key_switch_enable_play_silence_music"; public static final String SP_MSG_KEY_STRING_ADD_EXTRA_DEVICE_MARK = "tsms_msg_key_string_add_extra_device_mark"; public static final String SP_MSG_KEY_STRING_ADD_EXTRA_SIM1 = "tsms_msg_key_string_add_extra_sim1"; public static final String SP_MSG_KEY_STRING_ADD_EXTRA_SIM2 = "tsms_msg_key_string_add_extra_sim2"; diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java index 28055786..cc62b03a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java @@ -93,6 +93,14 @@ public class SettingUtil { return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_EXCLUDE_FROM_RECENTS, false); } + public static void switchPlaySilenceMusic(Boolean enable) { + sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_PLAY_SILENCE_MUSIC, enable).apply(); + } + + public static boolean getPlaySilenceMusic() { + return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_PLAY_SILENCE_MUSIC, false); + } + public static void switchSmsTemplate(Boolean switchSmsTemplate) { sp_setting.edit().putBoolean(Define.SP_MSG_KEY_SWITCH_SMS_TEMPLATE, switchSmsTemplate).apply(); } diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index 9e9db791..e03816d1 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -544,12 +544,26 @@ android:orientation="horizontal" android:padding="15dp"> - + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + 被永久拒绝授权,请前往系统设置手动授予权限! 获取必需的权限失败,APP功能可能受限! \n    首次使用请按照1234步骤顺序设置,数字点亮表示该步骤已设置(4点亮表示有成功日志)!\n\n    根据以往用户反馈,90%的新用户最终排查结果都是手机权限设置问题,5%的用户是APP保活问题,其他问题排查参考Wiki中的常见问题(APP右上角使用帮助入口)\n\n    强烈建议:手动排查一下系统设置:自启动、电源策略、APP的权限,把所有权限打开(始终允许,不要“使用中允许”,MIUI系统就全部变绿),特别是一些国产定制系统加入隐私保护、验证码保护等(例如:MIUI 系统的 空白通行证)\n\n    请选择是否立即“前往系统设置”检查,或“稍后自行处理”? + Play silent music in the background + Play silent music to keep running in the background, which may consume more power, enable it on demand diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6fb0f29f..9619b676 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -327,7 +327,7 @@ 电池监控 【注意】需要手动创建APP转发规则,包名:88888888 保活措施 - 建议开启每一项授权或设置,不要禁用通知栏,避免APP被杀 + 建议开启前三项授权或设置,不要禁用通知栏,避免APP被杀 个性设置 如果自动获取失败,请手动填写备注 或 清空后再次自动获取 @@ -433,4 +433,6 @@ 被永久拒绝授权,请前往系统设置手动授予权限! 获取必需的权限失败,APP功能可能受限! \n    首次使用请按照1234步骤顺序设置,数字点亮表示该步骤已设置(4点亮表示有成功日志)!\n\n    根据以往用户反馈,90%的新用户最终排查结果都是手机权限设置问题,5%的用户是APP保活问题,其他问题排查参考Wiki中的常见问题(APP右上角使用帮助入口)\n\n    强烈建议:手动排查一下系统设置:自启动、电源策略、APP的权限,把所有权限打开(始终允许,不要“使用中允许”,MIUI系统就全部变绿),特别是一些国产定制系统加入隐私保护、验证码保护等(例如:MIUI 系统的 空白通行证)\n\n    请选择是否立即“前往系统设置”检查,或“稍后自行处理”? + 后台播放无声音乐 + 播放无声音乐让后台一直运行,可能比较耗电,按需启用