Android 监听双卡信号强度

监听单卡信号强度

监听单卡的信号强度非常简单直接用TelephonyManager.listen()去监听sim卡的信号强度.
  • 1
  • 2
TelephonyManager = mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)
mTelephonyManager.listen(new PhoneStateListener(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
  • 1
  • 2

单这只是针对单卡的时候, 现在手机基本标配双卡, 如果要监测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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面只是设置并开始监听, 具体去监听哪一个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) {...}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
 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);}@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {super.onSignalStrengthsChanged(signalStrength);int level = getSignalStrengthsLevel(signalStrength);}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

反射代码 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);  }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

监测sim卡2的信号强度

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

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

附完整代码

/*** 手机信号监控(双卡)* 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);}@Overridepublic 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);}@Overridepublic 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";@Overridepublic 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;}
}

Android 监听双卡信号强度相关推荐

  1. android 监听sim卡状态,android监控sim卡有没有服务示例(sim卡管理)

    public class UniteqService { public static final String LOG_TAG = "UniteqService"; public ...

  2. Android 监听 WiFi 开关状态

    Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...

  3. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  4. android 监听手机开机

    今天,简单讲讲  android 监听手机开机. 需求描述:有些时候,我们需要我们的程序在开机后能自动运行,在系统即将关闭时,能写入一些记录到指定的文件里. 一.开机广播监听: Android系统 ...

  5. android 监听屏幕是否锁屏

    今天,简单讲讲如何监听手机屏幕是否锁屏. 实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可 ...

  6. android 监听网络状态

    今天,讲讲怎么监听手机网络状态的改变. 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:nam ...

  7. android 应用监听home键,Android 监听Home键

    搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. private final BroadcastReceiver homeRece ...

  8. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...

  9. android通知栏的点击事件,Android监听消息通知栏点击事件

    Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...

最新文章

  1. DADA2中文教程v1.8
  2. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现
  3. lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没
  4. 使用socket实现信用卡程序和迷你购物商城
  5. mysql 虚拟环境搭建_pycharm虚拟环境virtualnv安装MySQL扩展
  6. Redis_基本类型介绍和指令___2
  7. 在非activity类调用startActivityForResult
  8. Matlab学习笔记:画图多重设置
  9. Spring Mobile 1.1.0.RC1 和 1.0.2 发布
  10. [vc]如何对radio按钮分组
  11. java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
  12. Whats the difference between git reset --mixed, --soft, and --hard?
  13. python多大学_用Python看看你的大学A4纸还剩多少!
  14. 大学生医保的报销范围
  15. vue mysql交互_几种vue的数据交互形式
  16. iOS网络编程---根据URL下载网络文件的方法
  17. 多媒体计算机硬件指示,多媒体计算机硬件系统构成
  18. 大健康产业B2B2C多用户电商平台开发,开启数字化消费新蓝海
  19. 蓝桥杯嵌入式(G4系列)HAL:LCD和LED冲突问题
  20. excel基础(一)

热门文章

  1. 黄金矿工--回溯算法
  2. 关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市
  3. CANoe.DiVa 操作指南 - ECU刷写(Flash)自动化测试
  4. iOS安全攻防越狱检测的攻与防
  5. Java--语言应用--批量修改MP3的文件名、标题
  6. 官方指南——向日葵Linux 2.2客户端使用教程
  7. 畅通工程 hdu 1232 HDU - 1863 (并查集+最小生成树)
  8. mysql ext3 ext4_给你一个惊喜:EXT3/EXT4文件系统数据删除后的数据恢复
  9. 2021-2027全球与中国变性酒精市场现状及未来发展趋势
  10. LINUX/UNIX系统中nobody用户信息