desc:监听sim卡是否可用及信号强度
parent
a4dadd3d6f
commit
795810be52
@ -0,0 +1,109 @@
|
||||
package com.yinuo.safetywatcher.watcher.utils
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Service
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.telephony.PhoneStateListener
|
||||
import android.telephony.SignalStrength
|
||||
import android.telephony.SubscriptionInfo
|
||||
import android.telephony.SubscriptionManager
|
||||
import android.telephony.TelephonyManager
|
||||
import android.util.Log
|
||||
|
||||
|
||||
object SimHelper {
|
||||
private var callbacks = mutableListOf<OnSimLevelCallback>()
|
||||
private var mSimState = -1;
|
||||
private var mRssi = -1;
|
||||
|
||||
private val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent?.action.equals("android.intent.action.SIM_STATE_CHANGED")) {
|
||||
val tm = context!!.getSystemService(Service.TELEPHONY_SERVICE) as TelephonyManager
|
||||
mSimState = tm.simState
|
||||
}
|
||||
Log.i(
|
||||
this@SimHelper.javaClass.name,
|
||||
"onReceive action = ${intent?.action}, mSimState = $mSimState, mRssi = $mRssi"
|
||||
)
|
||||
callbacks.forEach {
|
||||
it.onLevel(
|
||||
mSimState == TelephonyManager.SIM_STATE_READY, mRssi
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun init(context: Context) {
|
||||
watchSimState(context)
|
||||
watchSimRssi(context)
|
||||
}
|
||||
|
||||
private fun watchSimRssi(context: Context) {
|
||||
val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
|
||||
//获取指定卡槽的信号强度
|
||||
val info = getNewerSlotSubscriptionInfo(context, 0)
|
||||
info?.let {
|
||||
val mTelephonyManagerForSubscriptionId =
|
||||
tm.createForSubscriptionId(info!!.subscriptionId)
|
||||
mTelephonyManagerForSubscriptionId.listen(object : PhoneStateListener() {
|
||||
override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
|
||||
super.onSignalStrengthsChanged(signalStrength)
|
||||
mRssi = signalStrength.level
|
||||
callbacks.forEach {
|
||||
it.onLevel(
|
||||
mSimState == TelephonyManager.SIM_STATE_READY, mRssi
|
||||
)
|
||||
}
|
||||
}
|
||||
}, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
|
||||
}
|
||||
}
|
||||
|
||||
private fun watchSimState(context: Context) {
|
||||
val filter = IntentFilter("android.intent.action.SIM_STATE_CHANGED")
|
||||
context.registerReceiver(receiver, filter)
|
||||
}
|
||||
|
||||
fun addCallBack(callBack: OnSimLevelCallback) {
|
||||
callbacks.add(callBack)
|
||||
if (mSimState != -1) {
|
||||
callBack.onLevel(mSimState == TelephonyManager.SIM_STATE_READY, mRssi)
|
||||
}
|
||||
}
|
||||
|
||||
fun removeCallback(callBack: OnSimLevelCallback) {
|
||||
callbacks.remove(callBack)
|
||||
}
|
||||
|
||||
fun release(context: Context) {
|
||||
callbacks.clear()
|
||||
context.unregisterReceiver(receiver)
|
||||
}
|
||||
|
||||
interface OnSimLevelCallback {
|
||||
fun onLevel(enable: Boolean, level: Int)
|
||||
}
|
||||
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
@Synchronized
|
||||
fun getNewerSlotSubscriptionInfo(context: Context, slot: Int): SubscriptionInfo? {
|
||||
val list = SubscriptionManager.from(context).activeSubscriptionInfoList
|
||||
if (list != null) {
|
||||
for (info in list) {
|
||||
if (slot == info.simSlotIndex) {
|
||||
Log.i(
|
||||
this@SimHelper.javaClass.name,
|
||||
"SlotIndex : " + info.simSlotIndex + " displayName : " + info.displayName
|
||||
)
|
||||
return info
|
||||
}
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue