diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e7ce2bf..bbe24cf8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -117,6 +117,16 @@
android:name=".AppListActivity"
android:exported="true"
android:label="@string/app_list" />
+
+
{
+ SettingUtil.switchOnePixelActivity(isChecked);
+
+ OnePixelManager onePixelManager = new OnePixelManager();
+ if (isChecked) {
+ onePixelManager.registerOnePixelReceiver(this);//注册广播接收者
+ } else {
+ onePixelManager.unregisterOnePixelReceiver(this);
+ }
+ 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()));
diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/OnePixelReceiver.java b/app/src/main/java/com/idormy/sms/forwarder/receiver/OnePixelReceiver.java
new file mode 100644
index 00000000..20cf6116
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/OnePixelReceiver.java
@@ -0,0 +1,24 @@
+package com.idormy.sms.forwarder.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.idormy.sms.forwarder.utils.OnePixelManager;
+
+
+public class OnePixelReceiver extends BroadcastReceiver {
+ private static final String TAG = "OnePixelReceiver";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ OnePixelManager manager = new OnePixelManager();
+ if (Intent.ACTION_SCREEN_ON.equals(action)) {//如果亮屏,则关闭1像素Activity
+ manager.finishOnePixelActivity();
+ } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {//如果息屏,则开启1像素Activity
+ manager.startOnePixelActivity(context);
+ }
+ }
+}
+
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 b1d8095c..c453c3bd 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
@@ -12,6 +12,7 @@ public class Define {
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_ENABLE_ONE_PIXEL_ACTIVITY = "tsms_msg_key_switch_enable_one_pixel_activity";
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/OnePixelManager.java b/app/src/main/java/com/idormy/sms/forwarder/utils/OnePixelManager.java
new file mode 100644
index 00000000..b36782a8
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/OnePixelManager.java
@@ -0,0 +1,72 @@
+package com.idormy.sms.forwarder.utils;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.idormy.sms.forwarder.OnePixelActivity;
+import com.idormy.sms.forwarder.receiver.OnePixelReceiver;
+
+import java.lang.ref.WeakReference;
+
+public class OnePixelManager {
+ private static final String TAG = "OnePixelManager";
+ private WeakReference mActivity;
+ private OnePixelReceiver onePixelReceiver;
+
+ /**
+ * 一像素广播接收者注册方法。该方法中初始化OnePixelReceiver,并添加了过滤条件
+ * 屏幕息屏和亮屏。然后注册该广播接收者
+ */
+ public void registerOnePixelReceiver(Context context) {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_USER_PRESENT);
+ onePixelReceiver = new OnePixelReceiver();
+ context.registerReceiver(onePixelReceiver, filter);
+ }
+
+ /**
+ * 对广播接收者进行解注册
+ */
+ public void unregisterOnePixelReceiver(Context context) {
+ if (null != onePixelReceiver) {
+ context.unregisterReceiver(onePixelReceiver);
+ }
+ }
+
+ /**
+ * 开启一像素Activity
+ */
+ public void startOnePixelActivity(Context context) {
+ Intent intent = new Intent();
+ intent.setClass(context, OnePixelActivity.class);
+ context.startActivity(intent);
+ }
+
+ /**
+ * 关闭一像素Activity
+ */
+ public void finishOnePixelActivity() {
+ if (null != mActivity) {
+ Activity activity = mActivity.get();
+ if (null != activity) {
+ activity.finish();
+ }
+ mActivity = null;
+ }
+ }
+
+ /**
+ * 使用弱引用获取一像素的上下文
+ */
+ public void setKeepAliveReference(OnePixelActivity activity) {
+ mActivity = new WeakReference<>(activity);
+ }
+
+}
+
+
+
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java
index f2654f7b..0acad513 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java
@@ -332,65 +332,63 @@ public class PhoneUtils {
@SuppressLint({"ObsoleteSdkInt", "Range"})
public static List getSimMultiInfo() {
List infos = new ArrayList<>();
- //Log.d(TAG, "Build.VERSION.SDK_INT = " + Build.VERSION.SDK_INT);
- //Log.d(TAG, "Build.VERSION_CODES.LOLLIPOP_MR1 = " + Build.VERSION_CODES.LOLLIPOP_MR1);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
- Log.d(TAG, "1.版本超过5.1,调用系统方法");
- //1.版本超过5.1,调用系统方法
- SubscriptionManager mSubscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
- List activeSubscriptionInfoList = null;
- if (mSubscriptionManager != null) {
- try {
+ try {
+ //Log.d(TAG, "Build.VERSION.SDK_INT = " + Build.VERSION.SDK_INT);
+ //Log.d(TAG, "Build.VERSION_CODES.LOLLIPOP_MR1 = " + Build.VERSION_CODES.LOLLIPOP_MR1);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
+ Log.d(TAG, "1.版本超过5.1,调用系统方法");
+ //1.版本超过5.1,调用系统方法
+ SubscriptionManager mSubscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ List activeSubscriptionInfoList = null;
+ if (mSubscriptionManager != null) {
ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE);
activeSubscriptionInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
- } catch (Exception ignored) {
}
- }
- if (activeSubscriptionInfoList != null && activeSubscriptionInfoList.size() > 0) {
- //1.1.1 有使用的卡,就遍历所有卡
- for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfoList) {
- SimInfo simInfo = new SimInfo();
- simInfo.mCarrierName = subscriptionInfo.getCarrierName();
- simInfo.mIccId = subscriptionInfo.getIccId();
- simInfo.mSimSlotIndex = subscriptionInfo.getSimSlotIndex();
- simInfo.mNumber = subscriptionInfo.getNumber();
- simInfo.mCountryIso = subscriptionInfo.getCountryIso();
- simInfo.mSubscriptionId = subscriptionInfo.getSubscriptionId();
+ if (activeSubscriptionInfoList != null && activeSubscriptionInfoList.size() > 0) {
+ //1.1.1 有使用的卡,就遍历所有卡
+ for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfoList) {
+ SimInfo simInfo = new SimInfo();
+ simInfo.mCarrierName = subscriptionInfo.getCarrierName();
+ simInfo.mIccId = subscriptionInfo.getIccId();
+ simInfo.mSimSlotIndex = subscriptionInfo.getSimSlotIndex();
+ simInfo.mNumber = subscriptionInfo.getNumber();
+ simInfo.mCountryIso = subscriptionInfo.getCountryIso();
+ simInfo.mSubscriptionId = subscriptionInfo.getSubscriptionId();
/*try {
simInfo.mImei = getReflexMethodWithId(context, "getDeviceId", String.valueOf(simInfo.mSimSlotIndex));
simInfo.mImsi = getReflexMethodWithId(context, "getSubscriberId", String.valueOf(subscriptionInfo.getSubscriptionId()));
} catch (MethodNotFoundException ignored) {
}*/
- Log.d(TAG, String.valueOf(simInfo));
- infos.add(simInfo);
+ Log.d(TAG, String.valueOf(simInfo));
+ infos.add(simInfo);
+ }
}
- }
- } else {
- Log.d(TAG, "2.版本低于5.1的系统,首先调用数据库,看能不能访问到");
- //2.版本低于5.1的系统,首先调用数据库,看能不能访问到
- Uri uri = Uri.parse("content://telephony/siminfo"); //访问raw_contacts表
- ContentResolver resolver = context.getContentResolver();
- Cursor cursor = resolver.query(uri, new String[]{"_id", "icc_id", "sim_id", "display_name", "carrier_name", "name_source", "color", "number", "display_number_format", "data_roaming", "mcc", "mnc"}, null, null, null);
- if (cursor != null && cursor.moveToFirst()) {
- do {
- SimInfo simInfo = new SimInfo();
- simInfo.mCarrierName = cursor.getString(cursor.getColumnIndex("carrier_name"));
- simInfo.mIccId = cursor.getString(cursor.getColumnIndex("icc_id"));
- simInfo.mSimSlotIndex = cursor.getInt(cursor.getColumnIndex("sim_id"));
- simInfo.mNumber = cursor.getString(cursor.getColumnIndex("number"));
- simInfo.mCountryIso = cursor.getString(cursor.getColumnIndex("mcc"));
- String id = cursor.getString(cursor.getColumnIndex("_id"));
+ } else {
+ Log.d(TAG, "2.版本低于5.1的系统,首先调用数据库,看能不能访问到");
+ //2.版本低于5.1的系统,首先调用数据库,看能不能访问到
+ Uri uri = Uri.parse("content://telephony/siminfo"); //访问raw_contacts表
+ ContentResolver resolver = context.getContentResolver();
+ Cursor cursor = resolver.query(uri, new String[]{"_id", "icc_id", "sim_id", "display_name", "carrier_name", "name_source", "color", "number", "display_number_format", "data_roaming", "mcc", "mnc"}, null, null, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ do {
+ SimInfo simInfo = new SimInfo();
+ simInfo.mCarrierName = cursor.getString(cursor.getColumnIndex("carrier_name"));
+ simInfo.mIccId = cursor.getString(cursor.getColumnIndex("icc_id"));
+ simInfo.mSimSlotIndex = cursor.getInt(cursor.getColumnIndex("sim_id"));
+ simInfo.mNumber = cursor.getString(cursor.getColumnIndex("number"));
+ simInfo.mCountryIso = cursor.getString(cursor.getColumnIndex("mcc"));
+ String id = cursor.getString(cursor.getColumnIndex("_id"));
/*try {
simInfo.mImei = getReflexMethodWithId(context, "getDeviceId", String.valueOf(simInfo.mSimSlotIndex));
simInfo.mImsi = getReflexMethodWithId(context, "getSubscriberId", String.valueOf(id));
} catch (MethodNotFoundException ignored) {
}*/
- Log.d(TAG, String.valueOf(simInfo));
- infos.add(simInfo);
- } while (cursor.moveToNext());
- cursor.close();
+ Log.d(TAG, String.valueOf(simInfo));
+ infos.add(simInfo);
+ } while (cursor.moveToNext());
+ cursor.close();
+ }
}
- }
/*Log.d(TAG, "3.通过反射读取卡槽信息,最后通过IMEI去重");
//3.通过反射读取卡槽信息,最后通过IMEI去重
@@ -404,6 +402,9 @@ public class PhoneUtils {
}
}
return simInfos;*/
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
return infos;
}
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 cc62b03a..af1a3a40 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
@@ -101,6 +101,14 @@ public class SettingUtil {
return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_PLAY_SILENCE_MUSIC, false);
}
+ public static void switchOnePixelActivity(Boolean enable) {
+ sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_ONE_PIXEL_ACTIVITY, enable).apply();
+ }
+
+ public static boolean getOnePixelActivity() {
+ return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_ONE_PIXEL_ACTIVITY, 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 e03816d1..ba5fd19a 100644
--- a/app/src/main/res/layout/activity_setting.xml
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -700,6 +700,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\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
+ One Pixel
+ One Pixel Activity
+ This can change the process priority from 4 to 1
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index e21ef8b6..1606b546 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -102,4 +102,8 @@
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9619b676..3d4c5492 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -434,5 +434,8 @@
获取必需的权限失败,APP功能可能受限!
\n 首次使用请按照1234步骤顺序设置,数字点亮表示该步骤已设置(4点亮表示有成功日志)!\n\n 根据以往用户反馈,90%的新用户最终排查结果都是手机权限设置问题,5%的用户是APP保活问题,其他问题排查参考Wiki中的常见问题(APP右上角使用帮助入口)\n\n 强烈建议:手动排查一下系统设置:自启动、电源策略、APP的权限,把所有权限打开(始终允许,不要“使用中允许”,MIUI系统就全部变绿),特别是一些国产定制系统加入隐私保护、验证码保护等(例如:MIUI 系统的 空白通行证)\n\n 请选择是否立即“前往系统设置”检查,或“稍后自行处理”?
后台播放无声音乐
- 播放无声音乐让后台一直运行,可能比较耗电,按需启用
+ 【按需启用】播放无声音乐让后台一直运行,可能比较耗电
+ 1像素
+ 1像素透明Activity保活
+ 【按需启用】使进程的优先级在屏幕锁屏时间由4提升为最高优先级1
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 4ae78871..d764a969 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -102,4 +102,8 @@
+
+