mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-02 17:07:41 +08:00
新增:自动任务·快捷指令 —— SIM卡槽状态改变(废弃:66666666
)
This commit is contained in:
parent
2233c0032f
commit
437716cd4e
@ -297,7 +297,6 @@
|
||||
android:enabled="true"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
<action android:name="android.intent.action.SIM_STATE_CHANGED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
@ -143,8 +143,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||
editAddExtraSim1(binding!!.etExtraSim1)
|
||||
//SIM2备注
|
||||
editAddExtraSim2(binding!!.etExtraSim2)
|
||||
//SIM卡槽状态监控
|
||||
switchSimStateReceiver(binding!!.sbSimStateReceiver)
|
||||
|
||||
//通知内容
|
||||
editNotifyContent(binding!!.etNotifyContent)
|
||||
|
||||
@ -800,25 +799,6 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||
})
|
||||
}
|
||||
|
||||
//SIM卡槽状态监控
|
||||
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
||||
fun switchSimStateReceiver(sbSimStateReceiver: SwitchButton) {
|
||||
sbSimStateReceiver.isChecked = SettingUtils.enableSimStateReceiver
|
||||
sbSimStateReceiver.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||
App.SimInfoList = PhoneUtils.getSimMultiInfo()
|
||||
if (isChecked && App.SimInfoList.isEmpty()) {
|
||||
XToastUtils.error(R.string.tip_can_not_get_sim_infos)
|
||||
XXPermissions.startPermissionActivity(
|
||||
requireContext(), "android.permission.READ_PHONE_STATE"
|
||||
)
|
||||
SettingUtils.enableSimStateReceiver = false
|
||||
sbSimStateReceiver.isChecked = false
|
||||
return@setOnCheckedChangeListener
|
||||
}
|
||||
SettingUtils.enableSimStateReceiver = isChecked
|
||||
}
|
||||
}
|
||||
|
||||
//设置通知内容
|
||||
private fun editNotifyContent(etNotifyContent: EditText) {
|
||||
etNotifyContent.setText(SettingUtils.notifyContent)
|
||||
|
@ -8,120 +8,70 @@ import android.util.Log
|
||||
import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.workDataOf
|
||||
import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.App
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||
import com.idormy.sms.forwarder.utils.Worker
|
||||
import com.idormy.sms.forwarder.workers.SendWorker
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_SIM
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||
import com.idormy.sms.forwarder.workers.SimWorker
|
||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
||||
import java.util.Date
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
|
||||
@Suppress("PrivatePropertyName")
|
||||
class SimStateReceiver : BroadcastReceiver() {
|
||||
|
||||
private var TAG = SimStateReceiver::class.java.simpleName
|
||||
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
|
||||
//纯客户端模式
|
||||
if (SettingUtils.enablePureClientMode) return
|
||||
|
||||
//SIM卡槽状态监控开关
|
||||
if (!SettingUtils.enableSimStateReceiver) return
|
||||
if (intent.action != "android.intent.action.SIM_STATE_CHANGED") return
|
||||
|
||||
val action = intent.action
|
||||
if (action == Intent.ACTION_BOOT_COMPLETED) {
|
||||
// 在这里处理开机启动时的逻辑
|
||||
// 例如:注册监听 SIM 变化
|
||||
registerSimStateListener(context)
|
||||
} else if (action == "android.intent.action.SIM_STATE_CHANGED") {
|
||||
// 处理 SIM 卡状态变化的逻辑
|
||||
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
|
||||
// 处理 SIM 卡状态变化的逻辑
|
||||
val simStateOld = TaskUtils.simState
|
||||
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
|
||||
|
||||
// 获取当前 SIM 卡状态
|
||||
when (telephonyManager.simState) {
|
||||
TelephonyManager.SIM_STATE_ABSENT -> {
|
||||
Log.d(TAG, "SIM 卡被移除")
|
||||
// 处理 SIM 卡被移除的情况
|
||||
}
|
||||
// 获取当前 SIM 卡状态
|
||||
val simStateNew = telephonyManager.simState
|
||||
|
||||
TelephonyManager.SIM_STATE_READY -> {
|
||||
Log.d(TAG, "SIM 卡已准备就绪,延迟2秒再获取信息")
|
||||
Thread.sleep(2000)
|
||||
// SIM 卡状态未发生变化,避免重复执行
|
||||
if (simStateOld == simStateNew) return
|
||||
|
||||
// 获取 SIM 卡信息
|
||||
App.SimInfoList = PhoneUtils.getSimMultiInfo()
|
||||
Log.d(TAG, App.SimInfoList.toString())
|
||||
|
||||
val msg = StringBuilder()
|
||||
App.SimInfoList.forEach {
|
||||
msg.append("[SIM-").append(it.key + 1).append("]\n")
|
||||
msg.append(getString(R.string.carrier_name)).append(": ").append(it.value.mCarrierName).append("\n")
|
||||
//msg.append(getString(R.string.icc_id)).append(": ").append(it.value.mIccId).append("\n")
|
||||
msg.append(getString(R.string.sim_slot_index)).append(": ").append(it.value.mSimSlotIndex).append("\n")
|
||||
msg.append(getString(R.string.number)).append(": ").append(it.value.mNumber).append("\n")
|
||||
msg.append(getString(R.string.country_iso)).append(": ").append(it.value.mCountryIso).append("\n")
|
||||
msg.append(getString(R.string.subscription_id)).append(": ").append(it.value.mSubscriptionId).append("\n")
|
||||
}
|
||||
|
||||
sendMessage(context, msg.toString().trimEnd())
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_CARD_IO_ERROR -> {
|
||||
Log.d(TAG, "SIM 卡读取失败")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_CARD_RESTRICTED -> {
|
||||
Log.d(TAG, "SIM 卡受限")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_NETWORK_LOCKED -> {
|
||||
Log.d(TAG, "SIM 卡网络锁定")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_NOT_READY -> {
|
||||
Log.d(TAG, "SIM 卡未准备好")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_PERM_DISABLED -> {
|
||||
Log.d(TAG, "SIM 卡被禁用")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_PIN_REQUIRED -> {
|
||||
Log.d(TAG, "SIM 卡需要 PIN 解锁")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_PUK_REQUIRED -> {
|
||||
Log.d(TAG, "SIM 卡需要 PUK 解锁")
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_UNKNOWN -> {
|
||||
Log.d(TAG, "SIM 卡状态未知")
|
||||
}
|
||||
var duration = 10L
|
||||
val msg = when (simStateNew) {
|
||||
TelephonyManager.SIM_STATE_ABSENT -> {
|
||||
Log.d(TAG, "SIM 卡被移除")
|
||||
TaskUtils.simState = simStateNew
|
||||
getString(R.string.sim_state_absent)
|
||||
}
|
||||
|
||||
TelephonyManager.SIM_STATE_READY -> {
|
||||
Log.d(TAG, "SIM 卡已准备就绪")
|
||||
TaskUtils.simState = simStateNew
|
||||
duration = 5000L
|
||||
getString(R.string.sim_state_ready)
|
||||
}
|
||||
|
||||
else -> {
|
||||
Log.d(TAG, "SIM 卡状态未知")
|
||||
TaskUtils.simState = 0
|
||||
getString(R.string.sim_state_unknown)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private fun registerSimStateListener(context: Context) {
|
||||
// 在此处注册 SIM 变化监听器
|
||||
// 可以使用 TelephonyManager 或 SubscriptionManager 进行注册监听
|
||||
}
|
||||
|
||||
//发送信息
|
||||
private fun sendMessage(context: Context, msg: String) {
|
||||
Log.i(TAG, msg)
|
||||
try {
|
||||
val msgInfo = MsgInfo("app", "66666666", msg, Date(), getString(R.string.sim_state_monitor), -1)
|
||||
val request = OneTimeWorkRequestBuilder<SendWorker>().setInputData(
|
||||
//注意:SIM卡已准备就绪时,延迟5秒(给够搜索信号时间)才执行任务
|
||||
val request = OneTimeWorkRequestBuilder<SimWorker>()
|
||||
.setInitialDelay(duration, TimeUnit.MILLISECONDS)
|
||||
.setInputData(
|
||||
workDataOf(
|
||||
Worker.sendMsgInfo to Gson().toJson(msgInfo),
|
||||
TaskWorker.conditionType to TASK_CONDITION_SIM,
|
||||
TaskWorker.msg to msg.toString().trimEnd(),
|
||||
)
|
||||
).build()
|
||||
WorkManager.getInstance(context).enqueue(request)
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "getLog e:" + e.message)
|
||||
}
|
||||
WorkManager.getInstance(context).enqueue(request)
|
||||
}
|
||||
|
||||
}
|
@ -2,7 +2,6 @@ package com.idormy.sms.forwarder.utils
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.BatteryManager
|
||||
import android.util.Log
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.entity.BatteryInfo
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
@ -30,7 +29,7 @@ object BatteryUtils {
|
||||
batteryInfo.status = getStatus(status)
|
||||
batteryInfo.health = getHealth(health)
|
||||
batteryInfo.plugged = getPlugged(plugged)
|
||||
Log.i(TAG, batteryInfo.toString())
|
||||
//Log.i(TAG, batteryInfo.toString())
|
||||
return batteryInfo
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@ object TaskWorker {
|
||||
const val task = "task"
|
||||
const val taskActions = "task_actions"
|
||||
const val conditionType = "condition_type"
|
||||
const val msg = "msg"
|
||||
const val msgInfo = "msg_info"
|
||||
}
|
||||
|
||||
@ -76,7 +77,6 @@ const val SP_SUBID_SIM1 = "subid_sim1"
|
||||
const val SP_SUBID_SIM2 = "subid_sim2"
|
||||
const val SP_EXTRA_SIM1 = "extra_sim1"
|
||||
const val SP_EXTRA_SIM2 = "extra_sim2"
|
||||
const val SP_SIM_STATE_RECEIVER = "enable_sim_state_receiver"
|
||||
const val SP_ENABLE_SMS_TEMPLATE = "enable_sms_template"
|
||||
const val SP_SMS_TEMPLATE = "sms_template"
|
||||
|
||||
@ -586,3 +586,4 @@ const val SP_DATA_SIM_SLOT = "data_sim_slot"
|
||||
const val SP_WIFI_SSID = "wifi_ssid"
|
||||
const val SP_IPV4 = "ipv4"
|
||||
const val SP_IPV6 = "ipv6"
|
||||
const val SP_SIM_STATE = "sim_state"
|
@ -113,9 +113,6 @@ class SettingUtils private constructor() {
|
||||
//SIM2备注
|
||||
var extraSim2: String by SharedPreference(SP_EXTRA_SIM2, "")
|
||||
|
||||
//SIM卡槽状态监控
|
||||
var enableSimStateReceiver: Boolean by SharedPreference(SP_SIM_STATE_RECEIVER, false)
|
||||
|
||||
//是否启用自定义模板
|
||||
var enableSmsTemplate: Boolean by SharedPreference(SP_ENABLE_SMS_TEMPLATE, false)
|
||||
|
||||
|
@ -10,6 +10,7 @@ import com.idormy.sms.forwarder.utils.SP_DATA_SIM_SLOT
|
||||
import com.idormy.sms.forwarder.utils.SP_IPV4
|
||||
import com.idormy.sms.forwarder.utils.SP_IPV6
|
||||
import com.idormy.sms.forwarder.utils.SP_NETWORK_STATE
|
||||
import com.idormy.sms.forwarder.utils.SP_SIM_STATE
|
||||
import com.idormy.sms.forwarder.utils.SP_WIFI_SSID
|
||||
import com.idormy.sms.forwarder.utils.SharedPreference
|
||||
|
||||
@ -49,5 +50,8 @@ class TaskUtils private constructor() {
|
||||
|
||||
//IPv6地址
|
||||
var ipv6: String by SharedPreference(SP_IPV6, "")
|
||||
|
||||
//SIM卡状态:0-未知状态,1-卡被移除,5-卡已准备就绪
|
||||
var simState: Int by SharedPreference(SP_SIM_STATE, 0)
|
||||
}
|
||||
}
|
@ -0,0 +1,93 @@
|
||||
package com.idormy.sms.forwarder.workers
|
||||
|
||||
import android.content.Context
|
||||
import android.telephony.TelephonyManager
|
||||
import android.util.Log
|
||||
import androidx.work.CoroutineWorker
|
||||
import androidx.work.Data
|
||||
import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.WorkerParameters
|
||||
import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.App
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.database.AppDatabase
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.entity.task.SimSetting
|
||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||
import com.xuexiang.xutil.resource.ResUtils
|
||||
import java.util.Date
|
||||
|
||||
@Suppress("PrivatePropertyName", "DEPRECATION")
|
||||
class SimWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
|
||||
|
||||
private val TAG: String = SimWorker::class.java.simpleName
|
||||
|
||||
override suspend fun doWork(): Result {
|
||||
val conditionType = inputData.getInt(TaskWorker.conditionType, -1)
|
||||
val simStateStr = inputData.getString(TaskWorker.msg)
|
||||
val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType)
|
||||
for (task in taskList) {
|
||||
Log.d(TAG, "task = $task")
|
||||
|
||||
// 根据任务信息执行相应操作
|
||||
val conditionList = Gson().fromJson(task.conditions, Array<TaskSetting>::class.java).toMutableList()
|
||||
if (conditionList.isEmpty()) {
|
||||
Log.d(TAG, "任务${task.id}:conditionList is empty")
|
||||
continue
|
||||
}
|
||||
val firstCondition = conditionList.firstOrNull()
|
||||
if (firstCondition == null) {
|
||||
Log.d(TAG, "任务${task.id}:firstCondition is null")
|
||||
continue
|
||||
}
|
||||
|
||||
val simSetting = Gson().fromJson(firstCondition.setting, SimSetting::class.java)
|
||||
if (simSetting == null) {
|
||||
Log.d(TAG, "任务${task.id}:simSetting is null")
|
||||
continue
|
||||
}
|
||||
|
||||
if (TaskUtils.simState != simSetting.simState) {
|
||||
Log.d(TAG, "任务${task.id}:networkState is not match, simSetting = $simSetting")
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO:判断其他条件是否满足,注意:SIM卡已准备就绪,延迟5秒才进入这里(给够搜索信号时间)
|
||||
/*if (!TaskUtils.isConditionMatch(task, msg)) {
|
||||
Log.d(TAG, "任务${task.id}:condition is not match")
|
||||
continue
|
||||
}*/
|
||||
|
||||
val msg = StringBuilder()
|
||||
msg.append(String.format(ResUtils.getString(R.string.sim_state), simStateStr)).append("\n")
|
||||
if (TaskUtils.simState == TelephonyManager.SIM_STATE_READY) {
|
||||
// 获取 SIM 卡信息
|
||||
App.SimInfoList = PhoneUtils.getSimMultiInfo()
|
||||
//Log.d(TAG, App.SimInfoList.toString())
|
||||
App.SimInfoList.forEach {
|
||||
msg.append("[SIM-").append(it.key + 1).append("]\n")
|
||||
msg.append(ResUtils.getString(R.string.carrier_name)).append(": ").append(it.value.mCarrierName).append("\n")
|
||||
//msg.append(getString(R.string.icc_id)).append(": ").append(it.value.mIccId).append("\n")
|
||||
msg.append(ResUtils.getString(R.string.sim_slot_index)).append(": ").append(it.value.mSimSlotIndex).append("\n")
|
||||
msg.append(ResUtils.getString(R.string.number)).append(": ").append(it.value.mNumber).append("\n")
|
||||
msg.append(ResUtils.getString(R.string.country_iso)).append(": ").append(it.value.mCountryIso).append("\n")
|
||||
msg.append(ResUtils.getString(R.string.subscription_id)).append(": ").append(it.value.mSubscriptionId).append("\n")
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: 组装消息体 && 执行具体任务
|
||||
val msgInfo = MsgInfo("task", task.name, msg.toString().trimEnd(), Date(), task.description)
|
||||
val actionData = Data.Builder().putLong(TaskWorker.taskId, task.id).putString(TaskWorker.taskActions, task.actions).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build()
|
||||
val actionRequest = OneTimeWorkRequestBuilder<ActionWorker>().setInputData(actionData).build()
|
||||
WorkManager.getInstance().enqueue(actionRequest)
|
||||
}
|
||||
|
||||
return Result.success()
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1251,40 +1251,6 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/settingBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/sim_state_monitor"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="RelativeOverlap" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/sim_state_monitor_tips"
|
||||
android:textSize="9sp"
|
||||
tools:ignore="SmallSp" />
|
||||
</LinearLayout>
|
||||
|
||||
<com.xuexiang.xui.widget.button.switchbutton.SwitchButton
|
||||
android:id="@+id/sb_sim_state_receiver"
|
||||
style="@style/SwitchButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/settingBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -555,7 +555,6 @@
|
||||
<string name="httpserver">Local HttpServer</string>
|
||||
<string name="httpserver_tips">Available under WiFi network, after startup, other machines in the LAN can directly call the local interface</string>
|
||||
<string name="sim_state_monitor">SIM State Monitor</string>
|
||||
<string name="sim_state_monitor_tips">[Note] You need to manually create APP forwarding rules, package name: 66666666</string>
|
||||
<string name="network_state_monitor">Network State Monitor</string>
|
||||
<string name="network_state_change_remind">Network State Change Remind</string>
|
||||
<string name="keep_alive">Keep Alive</string>
|
||||
|
@ -556,7 +556,6 @@
|
||||
<string name="httpserver">被动接收本地 HttpServer</string>
|
||||
<string name="httpserver_tips">WiFi网络下可用,启动后局域网内其他机器可直接调用本机接口</string>
|
||||
<string name="sim_state_monitor">SIM卡槽状态监控</string>
|
||||
<string name="sim_state_monitor_tips">需要手动创建APP转发规则,包名:66666666</string>
|
||||
<string name="network_state_monitor">网络状态监控</string>
|
||||
<string name="network_state_change_remind">网络状态改变提醒</string>
|
||||
<string name="keep_alive">保活措施</string>
|
||||
|
Loading…
x
Reference in New Issue
Block a user