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 @@ + +