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