Android获取手机本机号码的实现方法

反射TelephoneManager 获取本机号码,注意一下提供的接口有的SIM卡没写是获取不到的,该接口只适配Android5.0以上版本

 public String getMsisdn(int slotId) {
    return getLine1NumberForSubscriber(getSubIdForSlotId(slotId));
  }

权限

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
  public class RegisterMessage {
  private static Context mContext;
  private static TelephonyManager mTelephonyManager;
  private ConnectivityManager mConnMngr;
  private static SubscriptionManager mSubscriptionManager;
  public RegisterMessage(Context context) {
    mContext = context;
    mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    if (mTelephonyManager == null) {
      throw new Error("telephony manager is null");
    }
    mConnMngr = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    mSubscriptionManager = SubscriptionManager.from(mContext);
  } 
public String getMsisdn(int slotId) {//slotId 0为卡1 ,1为卡2
  return getLine1NumberForSubscriber(getSubIdForSlotId(slotId));
} 

rivate int getSubIdForSlotId(int slotId) {
  int[] subIds = getSubId(slotId);
  if (subIds == null || subIds.length < 1 || subIds[0] < 0) {
    return -1;
  }
  MLog.d("getSubIdForSlotId = "+subIds[0]);
  return subIds[0];
}
private static int[] getSubId(int slotId) {
  Method declaredMethod;
  int[] subArr = null;
  try {
    declaredMethod = Class.forName("android.telephony.SubscriptionManager").getDeclaredMethod("getSubId", new Class[]{Integer.TYPE});
    declaredMethod.setAccessible(true);
    subArr = (int[]) declaredMethod.invoke(mSubscriptionManager,slotId);
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
    declaredMethod = null;
  } catch (IllegalArgumentException e2) {
    e2.printStackTrace();
    declaredMethod = null;
  } catch (NoSuchMethodException e3) {
    e3.printStackTrace();
    declaredMethod = null;
  } catch (ClassCastException e4) {
    e4.printStackTrace();
    declaredMethod = null;
  } catch (IllegalAccessException e5){
    e5.printStackTrace();
    declaredMethod = null;
  }catch (InvocationTargetException e6){
    e6.printStackTrace();
    declaredMethod = null;
  }
  if(declaredMethod == null) {
    subArr = null;
  }
  MLog.d("getSubId = "+subArr[0]);
  return subArr;
}
private String getLine1NumberForSubscriber(int subId){
  Method method;
  String status = null;
  try {
    method = mTelephonyManager.getClass().getMethod("getLine1NumberForSubscriber", int.class);
    method.setAccessible(true);
    status = String.valueOf(method.invoke(mTelephonyManager, subId));
  } catch (NoSuchMethodException e) {
    e.printStackTrace();
  } catch (IllegalAccessException e) {
    e.printStackTrace();
  } catch (IllegalArgumentException e) {
    e.printStackTrace();
  } catch (InvocationTargetException e) {
    e.printStackTrace();
  }
  MLog.d("getLine1NumberForSubscriber = "+status);
  return status;
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。