desc:监听sim卡是否可用及信号强度

main
xiaowusky 2 years ago
parent a4dadd3d6f
commit 795810be52

@ -8,6 +8,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

@ -7,6 +7,7 @@ import androidx.annotation.RequiresApi
import com.yinuo.safetywatcher.databinding.ActivityHomeBinding
import com.yinuo.safetywatcher.watcher.base.BaseActivity
import com.yinuo.safetywatcher.watcher.utils.BatteryHelper
import com.yinuo.safetywatcher.watcher.utils.SimHelper
import com.yinuo.safetywatcher.watcher.utils.WifiHelper
class HomeActivity : BaseActivity() {
@ -23,6 +24,7 @@ class HomeActivity : BaseActivity() {
override fun initView() {
BatteryHelper.init(this@HomeActivity)
WifiHelper.init(this@HomeActivity)
SimHelper.init(this@HomeActivity)
mBinding.apply {
itemSetting.setOnClickListener {
startActivity(Intent(this@HomeActivity, SettingActivity::class.java))
@ -38,5 +40,6 @@ class HomeActivity : BaseActivity() {
super.onDestroy()
BatteryHelper.release(this@HomeActivity)
WifiHelper.release(this@HomeActivity)
SimHelper.release(this@HomeActivity)
}
}

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

@ -9,6 +9,7 @@ import android.widget.LinearLayout
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.LayoutTopbarBinding
import com.yinuo.safetywatcher.watcher.utils.BatteryHelper
import com.yinuo.safetywatcher.watcher.utils.SimHelper
import com.yinuo.safetywatcher.watcher.utils.WifiHelper
class CommonTopBar : LinearLayout {
@ -39,6 +40,7 @@ class CommonTopBar : LinearLayout {
// watch battery
watchBattery()
watchWifi()
watchSim()
}
}
@ -71,6 +73,25 @@ class CommonTopBar : LinearLayout {
WifiHelper.addCallBack(wifiCallback)
}
private val simCallback = object : SimHelper.OnSimLevelCallback {
override fun onLevel(enable: Boolean, level: Int) {
Log.i(
this@CommonTopBar.javaClass.name,
"simCallback onEnable = $enable , level = $level"
)
if (enable) {
mBinding?.fourG?.visibility = VISIBLE
} else {
mBinding?.fourG?.visibility = GONE
}
}
}
private fun watchSim() {
SimHelper.addCallBack(simCallback)
}
open fun setTitle(title: String) {
mBinding?.backArea?.visibility = VISIBLE
mBinding?.title?.text = title
@ -80,5 +101,6 @@ class CommonTopBar : LinearLayout {
super.onDetachedFromWindow()
BatteryHelper.removeCallback(batteryCallback)
WifiHelper.removeCallback(wifiCallback)
SimHelper.removeCallback(simCallback)
}
}

@ -62,7 +62,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_40dp"
android:layout_marginEnd="@dimen/_36dp"
android:src="@mipmap/ic_setting"/>
<Space
android:layout_width="@dimen/_36dp"
android:layout_height="match_parent"/>
</LinearLayout>

@ -13,7 +13,7 @@ project.ext {
versions = [
compileSdkVersion : 33,
buildToolsVersion : "33.0.3",
minSdkVersion : 23,
minSdkVersion : 24,
targetSdkVersion : 28,
versionCode : 1,
versionName : "1.0",

Loading…
Cancel
Save