Android 监听双卡信号强度

监听单卡信号强度

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

单这只是针对单卡的时候, 现在手机基本标配双卡, 如果要监测sim卡的信号强度就要考虑到双卡, 然而百度了一下, 并没有博文去介绍怎么去监测双卡, 这下只能靠自己了.

监测sim卡1的信号强度

  1. //SubscriptionManager 该类主要包含了所有sim卡的信息
  2. SubscriptionManager mSubscriptionManager = SubscriptionManager.from(mContext);
  3. //获取sim卡1的信息
  4. SubscriptionInfo sub0 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(0);
  5. if(null != sub0) {
  6. //如果不为空 说明sim卡1存在
  7. /*
  8. sub0.getSubscriptionId() 获取sim卡1的 subId
  9. */
  10. Sim1SignalStrengthsListener mSim1SignalStrengthsListener = new Sim1SignalStrengthsListener(sub0.getSubscriptionId());
  11. //开始监听
  12. mTelephonyManager.listen(mSim1SignalStrengthsListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
  13. }

上面只是设置并开始监听, 具体去监听哪一个sim卡的, 还需要具体去看 Sim1SignalStrengthsListener 中对 subId 的具体处理

PhoneStateListener 类中有一个成员变量 mSubId , 这个值就是当前默认操作的sim卡, 如果不明确指定, 默认值就是 SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, 看PhoneStateListener在有带参构造设置subId, 但是都是hide隐藏, 既然无法初始化去设置subId, 那么我们就用Java强大的功能”反射”去设置mSubId的值, 设置完成之后, PhoneStateListener 就成了我们指定监测的sim卡了.

  1. /*
  2. * Subscription used to listen to the phone state changes
  3. * @hide
  4. */
  5. /** @hide */
  6. protected int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
  7. /**
  8. * Create a PhoneStateListener for the Phone with the default subscription
  9. * using a particular non-null Looper.
  10. * @hide
  11. */
  12. public PhoneStateListener(Looper looper) {
  13. this(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, looper);
  14. }
  15. /**
  16. * Create a PhoneStateListener for the Phone using the specified subscription
  17. * and non-null Looper.
  18. * @hide
  19. */
  20. public PhoneStateListener(int subId, Looper looper) {
  21. ...
  22. }
  1. public static final int DEFAULT_SUBSCRIPTION_ID = Integer.MAX_VALUE;
  • 1
  1. class Sim1SignalStrengthsListener extends PhoneStateListener {
  2. public Sim1SignalStrengthsListener(int subId) {
  3. super();
  4. ReflectUtil.setFieldValue(this, "mSubId", subId);
  5. }
  6. @Override
  7. public void onSignalStrengthsChanged(SignalStrength signalStrength) {
  8. super.onSignalStrengthsChanged(signalStrength);
  9. int level = getSignalStrengthsLevel(signalStrength);
  10. }
  11. }

反射代码 ReflectUtil

  1. public static void setFieldValue(final Object obj, final String fieldName, final Object value) {
  2. Field field = getAccessibleField(obj, fieldName);
  3. if (field == null) {
  4. throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
  5. }
  6. try {
  7. field.set(obj, value);
  8. } catch (IllegalAccessException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. public static Field getAccessibleField(final Object obj, final String fieldName) {
  13. if (obj == null) {
  14. throw new IllegalArgumentException("object can't be null");
  15. }
  16. if (fieldName == null || fieldName.length() <= 0) {
  17. throw new IllegalArgumentException("fieldName can't be blank");
  18. }
  19. for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
  20. try {
  21. Field field = superClass.getDeclaredField(fieldName);
  22. makeAccessible(field);
  23. return field;
  24. } catch (NoSuchFieldException e) {
  25. continue;
  26. }
  27. }
  28. return null;
  29. }
  30. public static void makeAccessible(Field field) {
  31. if ((!Modifier.isPublic(field.getModifiers()) ||!Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
  32. field.setAccessible(true);
  33. }
  34. }

监测sim卡2的信号强度

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

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

附完整代码

  1. /**
  2. * 手机信号监控(双卡)
  3. * Created by zengyan on 2016/6/29.
  4. */
  5. public class SignalStrengthsHandler {
  6. public static final String TAG = "SignalStrengthsManager";
  7. public static final int INDEX_SIM1 = 0;
  8. public static final int INDEX_SIM2 = 1;
  9. private static SignalStrengthsHandler mInstance = null;
  10. public static byte[] mLock = new byte[0];
  11. private final Context mContext;
  12. private final TelephonyManager mTelephonyManager;
  13. private final SubscriptionManager mSubscriptionManager;
  14. private final SimStateReceive mSimStateReceiver;
  15. private SimSignalInfo mSim1SignalInfo = new SimSignalInfo();
  16. private SimSignalInfo mSim2SignalInfo = new SimSignalInfo();
  17. private ArrayList<OnSignalStrengthsChangedListener> mOnSignalStrengthsChangedListeners = null;
  18. private Sim1SignalStrengthsListener mSim1SignalStrengthsListener;
  19. private Sim2SignalStrengthsListener mSim2SignalStrengthsListener;
  20. @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
  21. private SignalStrengthsHandler() {
  22. mSubscriptionManager = SubscriptionManager.from(mContext);
  23. mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
  24. initListeners();
  25. mSimStateReceiver = new SimStateReceive();
  26. IntentFilter intentFilter = new IntentFilter();
  27. intentFilter.addAction(SimStateReceive.ACTION_SIM_STATE_CHANGED);
  28. mContext.registerReceiver(mSimStateReceiver, intentFilter);
  29. }
  30. public static SignalStrengthsHandler getInstance() {
  31. if (null == mInstance) {
  32. synchronized (mLock) {
  33. if (null == mInstance) {
  34. mInstance = new SignalStrengthsHandler();
  35. }
  36. }
  37. }
  38. return mInstance;
  39. }
  40. public void destroyInstance() {
  41. if (null != mInstance) {
  42. synchronized (mLock) {
  43. if (null != mInstance) {
  44. if (null != mOnSignalStrengthsChangedListeners) {
  45. mOnSignalStrengthsChangedListeners.clear();
  46. mOnSignalStrengthsChangedListeners = null;
  47. }
  48. mContext.unregisterReceiver(mSimStateReceiver);
  49. mInstance = null;
  50. }
  51. }
  52. }
  53. }
  54. private void initListeners() {
  55. listenSimSignalStrengths(SimCard.SIM_CARD_1);
  56. listenSimSignalStrengths(SimCard.SIM_CARD_2);
  57. }
  58. @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
  59. private void listenSimSignalStrengths(SimCard simCard) {
  60. if (simCard == SimCard.SIM_CARD_1) {
  61. SubscriptionInfo sub0 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM1);
  62. if (sub0 != null && null == mSim1SignalStrengthsListener) {
  63. mSim1SignalStrengthsListener = new Sim1SignalStrengthsListener(sub0.getSubscriptionId());
  64. }
  65. mTelephonyManager.listen(mSim1SignalStrengthsListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
  66. } else if (simCard == SimCard.SIM_CARD_2) {
  67. SubscriptionInfo sub1 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM2);
  68. if (sub1 != null && null == mSim2SignalStrengthsListener) {
  69. mSim2SignalStrengthsListener = new Sim2SignalStrengthsListener(sub1.getSubscriptionId());
  70. }
  71. mTelephonyManager.listen(mSim2SignalStrengthsListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
  72. }
  73. }
  74. private void unListenSimSignalStrengths(SimCard simCard) {
  75. if (simCard == SimCard.SIM_CARD_1) {
  76. mSim1SignalInfo.mIsActive = false;
  77. mSim1SignalInfo.mLevel = 0;
  78. if (null != mSim1SignalStrengthsListener) {
  79. mTelephonyManager.listen(mSim1SignalStrengthsListener, PhoneStateListener.LISTEN_NONE);
  80. }
  81. } else if (simCard == SimCard.SIM_CARD_2) {
  82. mSim2SignalInfo.mIsActive = false;
  83. mSim2SignalInfo.mLevel = 0;
  84. if (null != mSim2SignalStrengthsListener) {
  85. mTelephonyManager.listen(mSim2SignalStrengthsListener, PhoneStateListener.LISTEN_NONE);
  86. }
  87. }
  88. }
  89. /**
  90. * 添加监听sim卡信号强度
  91. *
  92. * @param listener
  93. */
  94. public void registerOnSignalStrengthsChangedListener(OnSignalStrengthsChangedListener listener) {
  95. if (null == mOnSignalStrengthsChangedListeners) {
  96. mOnSignalStrengthsChangedListeners = new ArrayList<>();
  97. }
  98. if (mOnSignalStrengthsChangedListeners.contains(listener)) {
  99. return;
  100. }
  101. if (null != listener) {
  102. mOnSignalStrengthsChangedListeners.add(listener);
  103. }
  104. }
  105. public void unregisterOnSignalStrengthsChangedListener(OnSignalStrengthsChangedListener listener) {
  106. if (null == mOnSignalStrengthsChangedListeners) {
  107. return;
  108. }
  109. if (null == listener) {
  110. return;
  111. }
  112. if (mOnSignalStrengthsChangedListeners.contains(listener)) {
  113. mOnSignalStrengthsChangedListeners.remove(listener);
  114. }
  115. }
  116. public void notyfyStateChange(boolean isSim1Exist, boolean isSim2Exist) {
  117. if (null != mOnSignalStrengthsChangedListeners && !mOnSignalStrengthsChangedListeners.isEmpty()) {
  118. for (int i = 0; i < mOnSignalStrengthsChangedListeners.size(); i++) {
  119. OnSignalStrengthsChangedListener listener = mOnSignalStrengthsChangedListeners.get(i);
  120. if (null != listener) {
  121. listener.onSimStateChanged(isSim1Exist, isSim2Exist);
  122. }
  123. }
  124. }
  125. }
  126. public void notifyChange(SimCard simCard, int level) {
  127. if (null != mOnSignalStrengthsChangedListeners && !mOnSignalStrengthsChangedListeners.isEmpty()) {
  128. for (int i = 0; i < mOnSignalStrengthsChangedListeners.size(); i++) {
  129. OnSignalStrengthsChangedListener listener = mOnSignalStrengthsChangedListeners.get(i);
  130. if (null != listener) {
  131. listener.onSignalStrengthsChanged(simCard, level);
  132. }
  133. }
  134. }
  135. }
  136. public boolean isSimCardExist(int cardIndex) {
  137. boolean isSimCardExist = false;
  138. try {
  139. Method method = TelephonyManager.class.getMethod("getSimState", new Class[]{int.class});
  140. int simState = (Integer) method.invoke(mTelephonyManager, new Object[]{Integer.valueOf(cardIndex)});
  141. if (TelephonyManager.SIM_STATE_READY == simState) {
  142. isSimCardExist = true;
  143. }
  144. } catch (Exception e) {
  145. e.printStackTrace();
  146. }
  147. return isSimCardExist;
  148. }
  149. /**
  150. * 获取sim信号 状态信息
  151. *
  152. * @return int[] index: 0:sim1 1:sim2
  153. */
  154. public SimSignalInfo[] getSimSignalInfos() {
  155. return new SimSignalInfo[]{mSim1SignalInfo, mSim2SignalInfo};
  156. }
  157. private int getSignalStrengthsLevel(SignalStrength signalStrength) {
  158. int level = -1;
  159. try {
  160. Method levelMethod = SignalStrength.class.getDeclaredMethod("getLevel");
  161. level = (int) levelMethod.invoke(signalStrength);
  162. } catch (Exception e) {
  163. LogUtil.e(TAG, e.getMessage());
  164. }
  165. return level;
  166. }
  167. private class Sim1SignalStrengthsListener extends PhoneStateListener {
  168. public Sim1SignalStrengthsListener(int subId) {
  169. super();
  170. //设置当前监听的sim卡
  171. ReflectUtil.setFieldValue(this, "mSubId", subId);
  172. }
  173. @Override
  174. public void onSignalStrengthsChanged(SignalStrength signalStrength) {
  175. super.onSignalStrengthsChanged(signalStrength);
  176. int level = getSignalStrengthsLevel(signalStrength);
  177. if (mSim1SignalInfo.mLevel == level) {
  178. return;
  179. }
  180. mSim1SignalInfo.mLevel = level;
  181. SignalStrengthsHandler.this.notifyChange(SimCard.SIM_CARD_1, mSim1SignalInfo.mLevel);
  182. LogUtil.d(TAG, "sim 1 signal strengths level = " + mSim1SignalInfo.mLevel);
  183. }
  184. }
  185. private class Sim2SignalStrengthsListener extends PhoneStateListener {
  186. public Sim2SignalStrengthsListener(int subId) {
  187. super();
  188. //设置当前监听的sim卡
  189. ReflectUtil.setFieldValue(this, "mSubId", subId);
  190. }
  191. @Override
  192. public void onSignalStrengthsChanged(SignalStrength signalStrength) {
  193. super.onSignalStrengthsChanged(signalStrength);
  194. int level = getSignalStrengthsLevel(signalStrength);
  195. if (mSim2SignalInfo.mLevel == level) {
  196. return;
  197. }
  198. mSim2SignalInfo.mLevel = level;
  199. SignalStrengthsHandler.this.notifyChange(SimCard.SIM_CARD_2, mSim2SignalInfo.mLevel);
  200. LogUtil.d(TAG, "sim 2 signal strengths level = " + mSim2SignalInfo.mLevel);
  201. }
  202. }
  203. public interface OnSignalStrengthsChangedListener {
  204. void onSignalStrengthsChanged(SimCard simCard, int level);
  205. void onSimStateChanged(boolean isSim1Exist, boolean isSim2Exist);
  206. }
  207. public enum SimCard {
  208. SIM_CARD_1, SIM_CARD_2
  209. }
  210. @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
  211. class SimStateReceive extends BroadcastReceiver {
  212. private final static String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
  213. @Override
  214. public void onReceive(Context context, Intent intent) {
  215. LogUtil.i("SimStateReceive", "sim state changed");
  216. if (intent.getAction().equals(ACTION_SIM_STATE_CHANGED)) {
  217. mSim1SignalInfo.mIsActive = isSimCardExist(INDEX_SIM1)
  218. && null != mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM1);
  219. mSim2SignalInfo.mIsActive = isSimCardExist(INDEX_SIM2)
  220. && null != mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(INDEX_SIM2);
  221. mSim1SignalInfo.mLevel = 0;
  222. mSim2SignalInfo.mLevel = 0;
  223. if (mSim1SignalInfo.mIsActive) {
  224. listenSimSignalStrengths(SimCard.SIM_CARD_1);
  225. } else {
  226. unListenSimSignalStrengths(SimCard.SIM_CARD_1);
  227. }
  228. if (mSim2SignalInfo.mIsActive) {
  229. listenSimSignalStrengths(SimCard.SIM_CARD_2);
  230. } else {
  231. unListenSimSignalStrengths(SimCard.SIM_CARD_2);
  232. }
  233. notyfyStateChange(mSim1SignalInfo.mIsActive, mSim2SignalInfo.mIsActive);
  234. }
  235. }
  236. }
  237. public class SimSignalInfo {
  238. /**
  239. * 信号强度 0 - 5
  240. */
  241. public int mLevel;
  242. /**
  243. * sim卡是否有效
  244. */
  245. public boolean mIsActive;
  246. }
  247. }
  • 1
 

Android 监听双卡信号强度(附完整代码)的更多相关文章

  1. Android监听系统短信数据库变化-提取短信内容

    由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...

  2. Android监听应用程序安装和卸载

    Android监听应用程序安装和卸载 第一. 新建监听类:BootReceiver继承BroadcastReceiver package com.rongfzh.yc; import android. ...

  3. 【Android】Android 监听apk安装替换卸载广播

    [Android]Android 监听apk安装替换卸载广播 首先是要获取应用的安装状态,通过广播的形式 以下是和应用程序相关的Broadcast Action ACTION_PACKAGE_ADDE ...

  4. Android 监听 ScrollView 滑动到最底部。

    做产品时,有一个需求,需要监听ScrollView滑动到最底部.在网上找了些方法,都有这样或那样的问题,要不就是监听不精确, 要不就是重复监听,那些代码没有产品化,很不可靠. 经过自己试验,终于找到了 ...

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

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...

  6. Android监听来电和去电

    要监听android打电话和接电话,只需下面2步骤1.第一步,写一个Receiver继承自BroadcastReceiver import android.app.Service; import an ...

  7. Android监听ScrollView滑动到顶端和底部

    Android监听ScrollView滑动到顶端和底部     package cn.testscrollview; import android.os.Bundle; import android. ...

  8. Android 监听网络变化

    Android 监听网络变化

  9. android 监听返回键

    android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...

随机推荐

  1. Java类和对象 详解(一)---写的很好通俗易懂---https://blog.csdn.net/wei_zhi/article/details/52745268

    https://blog.csdn.net/wei_zhi/article/details/52745268

  2. Matlab freqs 函数

    freqs 模拟滤波器的频率响应 语法: h = freqs(b,a,w)[h,w] = freqs(b,a)[h,w] = freqs(b,a,f)freqs(b,a) 描述: freqs 返回一个 ...

  3. OOP的三大特性------封装、继承、多态

    封装 1.<1>类背后隐藏的思想是数据抽象和封装 <2>信息隐藏,隐藏对象的实现细节,不让外部直接访问到 将数据成员和成员函数一起包装到一个单元里,单元以类的形式实现 < ...

  4. PAT A+B格式

    A + B格式(20) 时间限制 400毫秒 内存限制 65536 kB 代码长度限制 16000 B. 判断程序 标准 作者 陈,岳 计算a + b并以标准格式输出总和 - 即数字必须用逗号分隔成三 ...

  5. 删除ARCSDE表空间和用户后,新建时出现error -1:O的解决办法

    对于刚开始使用arcsde的用户,可能会出现各种问题,慢慢来就会找到解决办法 当我们删除用户和表空间时,在服务器本地还保留这sde.dbf文件(删除时选择了删除本地文件,不知道为什么), 我们可以换一 ...

  6. HDU6438 Buy and Resell 解题报告(一个有趣的贪心问题的严格证明)

    写在前面 此题是一个很容易想到的贪心题目,但是正确性的证明是非常复杂的.然而,目前网上所有题解并未给出本题贪心算法的任何正确性证明,全部仅停留在描述出一个贪心算法.本着对算法与计算机科学的热爱(逃), ...

  7. 【CCF】除法 树状数组

    [AC] #include<iostream> #include<math.h> #include<cstring> using namespace std; ty ...

  8. layer相关

    关闭窗口 var index = parent.layer.getFrameIndex(window.name);parent.layer.close(index);

  9. SQLalchemy 使用记录

    1.models.py中添加该方法,可通过该方法转dict #驼峰 def to_hump_dict(self): return {commonUtils.str2Hump(c.name): geta ...

  10. BZOJ 3513: [MUTC2013]idiots

    3513: [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 476  Solved: 162[Submit][Stat ...