Android 監聽雙卡信號強度(附完整代碼)


Android 監聽雙卡信號強度

監聽單卡信號強度

監聽單卡的信號強度非常簡單直接用TelephonyManager.listen()去監聽sim卡的信號強度.
TelephonyManager = mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE) mTelephonyManager.listen(new PhoneStateListener(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

 

單這只是針對單卡的時候, 現在手機基本標配雙卡, 如果要監測sim卡的信號強度就要考慮到雙卡, 然而百度了一下, 並沒有博文去介紹怎么去監測雙卡, 這下只能靠自己了.

監測sim卡1的信號強度

//SubscriptionManager 該類主要包含了所有sim卡的信息 SubscriptionManager mSubscriptionManager = SubscriptionManager.from(mContext); //獲取sim卡1的信息 SubscriptionInfo sub0 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(0); if(null != sub0) { //如果不為空 說明sim卡1存在 /* sub0.getSubscriptionId() 獲取sim卡1的 subId */ Sim1SignalStrengthsListener mSim1SignalStrengthsListener = new Sim1SignalStrengthsListener(sub0.getSubscriptionId()); //開始監聽 mTelephonyManager.listen(mSim1SignalStrengthsListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } 

上面只是設置並開始監聽, 具體去監聽哪一個sim卡的, 還需要具體去看 Sim1SignalStrengthsListener 中對 subId 的具體處理

PhoneStateListener 類中有一個成員變量 mSubId , 這個值就是當前默認操作的sim卡, 如果不明確指定, 默認值就是 SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, 看PhoneStateListener在有帶參構造設置subId, 但是都是hide隱藏, 既然無法初始化去設置subId, 那么我們就用Java強大的功能”反射”去設置mSubId的值, 設置完成之后, PhoneStateListener 就成了我們指定監測的sim卡了.

/* * Subscription used to listen to the phone state changes * @hide */ /** @hide */ protected int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; /** * Create a PhoneStateListener for the Phone with the default subscription * using a particular non-null Looper. * @hide */ public PhoneStateListener(Looper looper) { this(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, looper); } /** * Create a PhoneStateListener for the Phone using the specified subscription * and non-null Looper. * @hide */ public PhoneStateListener(int subId, Looper looper) { ... } 

 

 public static final int DEFAULT_SUBSCRIPTION_ID = Integer.MAX_VALUE;
  • 1

 

class Sim1SignalStrengthsListener extends PhoneStateListener { public Sim1SignalStrengthsListener(int subId) { super(); ReflectUtil.setFieldValue(this, "mSubId", subId); } @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); int level = getSignalStrengthsLevel(signalStrength); } }

 

反射代碼 ReflectUtil



public static void setFieldValue(final Object obj, final String fieldName, final Object value) { Field field = getAccessibleField(obj, fieldName); if (field == null) { throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]"); } try { field.set(obj, value); } catch (IllegalAccessException e) { e.printStackTrace(); } } public static Field getAccessibleField(final Object obj, final String fieldName) { if (obj == null) { throw new IllegalArgumentException("object can't be null"); } if (fieldName == null || fieldName.length() <= 0) { throw new IllegalArgumentException("fieldName can't be blank"); } for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { try { Field field = superClass.getDeclaredField(fieldName); makeAccessible(field); return field; } catch (NoSuchFieldException e) { continue; } } return null; } public static void makeAccessible(Field field) { if ((!Modifier.isPublic(field.getModifiers()) ||!Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { field.setAccessible(true); } } 

 

監測sim卡2的信號強度

獲取sim卡2的信息, 其他同sim卡1

... SubscriptionInfo sub0 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(1); ...
  • 1

附完整代碼

/** * 手機信號監控(雙卡) * Created by zengyan on 2016/6/29. */ public class SignalStrengthsHandler { public static final String TAG = "SignalStrengthsManager"; public static final int INDEX_SIM1 = 0; public static final int INDEX_SIM2 = 1; private static SignalStrengthsHandler mInstance = null; public static byte[] mLock = new byte[0]; private final Context mContext; private final TelephonyManager mTelephonyManager; private final SubscriptionManager mSubscriptionManager; private final SimStateReceive mSimStateReceiver; private SimSignalInfo mSim1SignalInfo = new SimSignalInfo(); private SimSignalInfo mSim2SignalInfo = new SimSignalInfo(); private ArrayList<OnSignalStrengthsChangedListener> mOnSignalStrengthsChangedListeners = null; private Sim1SignalStrengthsListener mSim1SignalStrengthsListener; private Sim2SignalStrengthsListener mSim2SignalStrengthsListener; @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) private SignalStrengthsHandler() { mSubscriptionManager = SubscriptionManager.from(mContext); mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); initListeners(); mSimStateReceiver = new SimStateReceive(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(SimStateReceive.ACTION_SIM_STATE_CHANGED); mContext.registerReceiver(mSimStateReceiver, intentFilter); } public static SignalStrengthsHandler getInstance() { if (null == mInstance) { synchronized (mLock) { if (null == mInstance) { mInstance = new SignalStrengthsHandler(); } } } return mInstance; } public void destroyInstance() { if (null != mInstance) { synchronized (mLock) { if (null != mInstance) { if (null != mOnSignalStrengthsChangedListeners) { mOnSignalStrengthsChangedListeners.clear(); mOnSignalStrengthsChangedListeners = null; } mContext.unregisterReceiver(mSimStateReceiver); mInstance = null; } } } } private void initListeners() { listenSimSignalStrengths(SimCard.SIM_CARD_1); listenSimSignalStrengths(SimCard.SIM_CARD_2); } @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) private void listenSimSignalStrengths(SimCard simCard) { if (simCard == SimCard.SIM_CARD_1) { SubscriptionInfo sub0 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM1); if (sub0 != null && null == mSim1SignalStrengthsListener) { mSim1SignalStrengthsListener = new Sim1SignalStrengthsListener(sub0.getSubscriptionId()); } mTelephonyManager.listen(mSim1SignalStrengthsListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } else if (simCard == SimCard.SIM_CARD_2) { SubscriptionInfo sub1 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM2); if (sub1 != null && null == mSim2SignalStrengthsListener) { mSim2SignalStrengthsListener = new Sim2SignalStrengthsListener(sub1.getSubscriptionId()); } mTelephonyManager.listen(mSim2SignalStrengthsListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } } private void unListenSimSignalStrengths(SimCard simCard) { if (simCard == SimCard.SIM_CARD_1) { mSim1SignalInfo.mIsActive = false; mSim1SignalInfo.mLevel = 0; if (null != mSim1SignalStrengthsListener) { mTelephonyManager.listen(mSim1SignalStrengthsListener, PhoneStateListener.LISTEN_NONE); } } else if (simCard == SimCard.SIM_CARD_2) { mSim2SignalInfo.mIsActive = false; mSim2SignalInfo.mLevel = 0; if (null != mSim2SignalStrengthsListener) { mTelephonyManager.listen(mSim2SignalStrengthsListener, PhoneStateListener.LISTEN_NONE); } } } /** * 添加監聽sim卡信號強度 * * @param listener */ public void registerOnSignalStrengthsChangedListener(OnSignalStrengthsChangedListener listener) { if (null == mOnSignalStrengthsChangedListeners) { mOnSignalStrengthsChangedListeners = new ArrayList<>(); } if (mOnSignalStrengthsChangedListeners.contains(listener)) { return; } if (null != listener) { mOnSignalStrengthsChangedListeners.add(listener); } } public void unregisterOnSignalStrengthsChangedListener(OnSignalStrengthsChangedListener listener) { if (null == mOnSignalStrengthsChangedListeners) { return; } if (null == listener) { return; } if (mOnSignalStrengthsChangedListeners.contains(listener)) { mOnSignalStrengthsChangedListeners.remove(listener); } } public void notyfyStateChange(boolean isSim1Exist, boolean isSim2Exist) { if (null != mOnSignalStrengthsChangedListeners && !mOnSignalStrengthsChangedListeners.isEmpty()) { for (int i = 0; i < mOnSignalStrengthsChangedListeners.size(); i++) { OnSignalStrengthsChangedListener listener = mOnSignalStrengthsChangedListeners.get(i); if (null != listener) { listener.onSimStateChanged(isSim1Exist, isSim2Exist); } } } } public void notifyChange(SimCard simCard, int level) { if (null != mOnSignalStrengthsChangedListeners && !mOnSignalStrengthsChangedListeners.isEmpty()) { for (int i = 0; i < mOnSignalStrengthsChangedListeners.size(); i++) { OnSignalStrengthsChangedListener listener = mOnSignalStrengthsChangedListeners.get(i); if (null != listener) { listener.onSignalStrengthsChanged(simCard, level); } } } } public boolean isSimCardExist(int cardIndex) { boolean isSimCardExist = false; try { Method method = TelephonyManager.class.getMethod("getSimState", new Class[]{int.class}); int simState = (Integer) method.invoke(mTelephonyManager, new Object[]{Integer.valueOf(cardIndex)}); if (TelephonyManager.SIM_STATE_READY == simState) { isSimCardExist = true; } } catch (Exception e) { e.printStackTrace(); } return isSimCardExist; } /** * 獲取sim信號 狀態信息 * * @return int[] index: 0:sim1 1:sim2 */ public SimSignalInfo[] getSimSignalInfos() { return new SimSignalInfo[]{mSim1SignalInfo, mSim2SignalInfo}; } private int getSignalStrengthsLevel(SignalStrength signalStrength) { int level = -1; try { Method levelMethod = SignalStrength.class.getDeclaredMethod("getLevel"); level = (int) levelMethod.invoke(signalStrength); } catch (Exception e) { LogUtil.e(TAG, e.getMessage()); } return level; } private class Sim1SignalStrengthsListener extends PhoneStateListener { public Sim1SignalStrengthsListener(int subId) { super(); //設置當前監聽的sim卡 ReflectUtil.setFieldValue(this, "mSubId", subId); } @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); int level = getSignalStrengthsLevel(signalStrength); if (mSim1SignalInfo.mLevel == level) { return; } mSim1SignalInfo.mLevel = level; SignalStrengthsHandler.this.notifyChange(SimCard.SIM_CARD_1, mSim1SignalInfo.mLevel); LogUtil.d(TAG, "sim 1 signal strengths level = " + mSim1SignalInfo.mLevel); } } private class Sim2SignalStrengthsListener extends PhoneStateListener { public Sim2SignalStrengthsListener(int subId) { super(); //設置當前監聽的sim卡 ReflectUtil.setFieldValue(this, "mSubId", subId); } @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); int level = getSignalStrengthsLevel(signalStrength); if (mSim2SignalInfo.mLevel == level) { return; } mSim2SignalInfo.mLevel = level; SignalStrengthsHandler.this.notifyChange(SimCard.SIM_CARD_2, mSim2SignalInfo.mLevel); LogUtil.d(TAG, "sim 2 signal strengths level = " + mSim2SignalInfo.mLevel); } } public interface OnSignalStrengthsChangedListener { void onSignalStrengthsChanged(SimCard simCard, int level); void onSimStateChanged(boolean isSim1Exist, boolean isSim2Exist); } public enum SimCard { SIM_CARD_1, SIM_CARD_2 } @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) class SimStateReceive extends BroadcastReceiver { private final static String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED"; @Override public void onReceive(Context context, Intent intent) { LogUtil.i("SimStateReceive", "sim state changed"); if (intent.getAction().equals(ACTION_SIM_STATE_CHANGED)) { mSim1SignalInfo.mIsActive = isSimCardExist(INDEX_SIM1) && null != mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM1); mSim2SignalInfo.mIsActive = isSimCardExist(INDEX_SIM2) && null != mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM2); mSim1SignalInfo.mLevel = 0; mSim2SignalInfo.mLevel = 0; if (mSim1SignalInfo.mIsActive) { listenSimSignalStrengths(SimCard.SIM_CARD_1); } else { unListenSimSignalStrengths(SimCard.SIM_CARD_1); } if (mSim2SignalInfo.mIsActive) { listenSimSignalStrengths(SimCard.SIM_CARD_2); } else { unListenSimSignalStrengths(SimCard.SIM_CARD_2); } notyfyStateChange(mSim1SignalInfo.mIsActive, mSim2SignalInfo.mIsActive); } } } public class SimSignalInfo { /** * 信號強度 0 - 5 */ public int mLevel; /** * sim卡是否有效 */ public boolean mIsActive; } }
  • 1
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM