当前位置 : 首页 » 编程语言 » 正文

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

分类 : 编程语言 | 发布时间 : 2018-04-21 09:06:21 | 浏览 : 27

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; 
} 

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

相关阅读:

What is 'Context' on Android?

Location of sqlite database on the device

Set the layout weight of a TextView programmatically

Disabling of EditText in android

How to print all key and values from HashMap in Android?

How To Set Text In An EditText

With android studio no jvm found, JAVA_HOME has been set

ADB Android Device Unauthorized

How to insert a SQLite record with a datetime set to 'now' in Android application?

XXHDPI and XXXHDPI dimensions in dp for images and icons in android