2017-04-04 113 views
3

獲取雙卡android手機的模擬運營商名稱。獲取SimOperatorName的雙SIM卡android手機

我正在一個應用程序中,我需要用戶的SIM他的操作員名稱的詳細信息。如何獲得他的SIM卡號碼和兩個連接的運營商名稱。

這是我的代碼...

private static String getOutput(Context context, String methodName, int slotId) { 


    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 

    Class<?> telephonyClass; 
    String reflectionMethod = null; 
    String output = null; 
    try { 
     telephonyClass = Class.forName(telephony.getClass().getName()); 
     for (Method method : telephonyClass.getMethods()) { 
      String name = method.getName(); 
      if (name.contains(methodName)) { 
       Class<?>[] params = method.getParameterTypes(); 
       if (params.length == 1 && params[0].getName().equals("int")) { 
        reflectionMethod = name; 
       } 
      } 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    if (reflectionMethod != null) { 
     try { 
      output = getOpByReflection(telephony, reflectionMethod, slotId, false); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    return output; 
} 

private static String getOpByReflection(TelephonyManager telephony, String predictedMethodName, int slotID, boolean isPrivate) { 

    //Log.i("Reflection", "Method: " + predictedMethodName+" "+slotID); 
    String result = null; 

    try { 

     Class<?> telephonyClass = Class.forName(telephony.getClass().getName()); 

     Class<?>[] parameter = new Class[1]; 
     parameter[0] = int.class; 
     Method getSimID; 
     if (slotID != -1) { 
      if (isPrivate) { 
       getSimID = telephonyClass.getDeclaredMethod(predictedMethodName, parameter); 
      } else { 
       getSimID = telephonyClass.getMethod(predictedMethodName, parameter); 
      } 
     } else { 
      if (isPrivate) { 
       getSimID = telephonyClass.getDeclaredMethod(predictedMethodName); 
      } else { 
       getSimID = telephonyClass.getMethod(predictedMethodName); 
      } 
     } 

     Object ob_phone; 
     Object[] obParameter = new Object[1]; 
     obParameter[0] = slotID; 
     if (getSimID != null) { 
      if (slotID != -1) { 
       ob_phone = getSimID.invoke(telephony, obParameter); 
      } else { 
       ob_phone = getSimID.invoke(telephony); 
      } 

      if (ob_phone != null) { 
       result = ob_phone.toString(); 

      } 
     } 
    } catch (Exception e) { 
     //e.printStackTrace(); 
     return null; 
    } 
    //Log.i("Reflection", "Result: " + result); 
    return result; 
} 

調用的方法是....

final String optName1 = getOutput(getApplicationContext(), "getSimOperatorName",0); 
    final String optName2 = getOutput(getApplicationContext(), "getSimOperatorName",1); 

回答

1
private List<String> getNetworkOperator(final Context context) { 
List<String> carrierNames = new ArrayList<>(); 
try { 
    final String permission = Manifest.permission.READ_PHONE_STATE; 
    if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) && (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED)){ 
     final List<SubscriptionInfo> subscriptionInfos = SubscriptionManager.from(context).getActiveSubscriptionInfoList(); 
     for (int i = 0; i < subscriptionInfos.size(); i++) { 
      carrierNames.add(subscriptionInfos.get(i).getCarrierName().toString()); 
     } 

    } else { 
     TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     // Get carrier name (Network Operator Name) 
     carrierNames.add(telephonyManager.getNetworkOperatorName()); 

    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
return carrierNames; 
} 
+1

如何讓下面Build.VERSION_CODES.LOLLIPOP_MR1第二SIM卡運營商的名稱? –

相關問題