Get both sim numbers in a dual sim android phone

前端 未结 2 1189
谎友^
谎友^ 2020-12-01 11:06

I want to get both the sim numbers in a dual sim device.

相关标签:
2条回答
  • 2020-12-01 11:24

    Make this class TelephonyInfo.java :

    import java.lang.reflect.Method;
    
    import android.content.Context;
    import android.telephony.TelephonyManager;
    
    public final class TelephonyInfo {
    
    private static TelephonyInfo telephonyInfo;
    private String imeiSIM1;
    private String imeiSIM2;
    private boolean isSIM1Ready;
    private boolean isSIM2Ready;
    
    public String getImeiSIM1() {
        return imeiSIM1;
    }
    
    /*public static void setImeiSIM1(String imeiSIM1) {
        TelephonyInfo.imeiSIM1 = imeiSIM1;
    }*/
    
    public String getImeiSIM2() {
        return imeiSIM2;
    }
    
    /*public static void setImeiSIM2(String imeiSIM2) {
        TelephonyInfo.imeiSIM2 = imeiSIM2;
    }*/
    
    public boolean isSIM1Ready() {
        return isSIM1Ready;
    }
    
    /*public static void setSIM1Ready(boolean isSIM1Ready) {
        TelephonyInfo.isSIM1Ready = isSIM1Ready;
    }*/
    
    public boolean isSIM2Ready() {
        return isSIM2Ready;
    }
    
    /*public static void setSIM2Ready(boolean isSIM2Ready) {
        TelephonyInfo.isSIM2Ready = isSIM2Ready;
    }*/
    
    public boolean isDualSIM() {
        return imeiSIM2 != null;
    }
    
    private TelephonyInfo() {
    }
    
    public static TelephonyInfo getInstance(Context context){
    
        if(telephonyInfo == null) {
    
            telephonyInfo = new TelephonyInfo();
    
            TelephonyManager telephonyManager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE));
    
            telephonyInfo.imeiSIM1 = telephonyManager.getDeviceId();;
            telephonyInfo.imeiSIM2 = null;
    
            try {
                telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceIdGemini", 0);
                telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceIdGemini", 1);
            } catch (GeminiMethodNotFoundException e) {
                e.printStackTrace();
    
                try {
                    telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceId", 0);
                    telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceId", 1);
                } catch (GeminiMethodNotFoundException e1) {
                    //Call here for next manufacturer's predicted method name if you wish
                    e1.printStackTrace();
                }
            }
    
            telephonyInfo.isSIM1Ready = telephonyManager.getSimState() == TelephonyManager.SIM_STATE_READY;
            telephonyInfo.isSIM2Ready = false;
    
            try {
                telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, "getSimStateGemini", 0);
                telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, "getSimStateGemini", 1);
            } catch (GeminiMethodNotFoundException e) {
    
                e.printStackTrace();
    
                try {
                    telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, "getSimState", 0);
                    telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, "getSimState", 1);
                } catch (GeminiMethodNotFoundException e1) {
                    //Call here for next manufacturer's predicted method name if you wish
                    e1.printStackTrace();
                }
            }
        }
    
        return telephonyInfo;
    }
    
    private static String getDeviceIdBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException {
    
        String imei = null;
    
        TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    
        try{
    
            Class<?> telephonyClass = Class.forName(telephony.getClass().getName());
    
            Class<?>[] parameter = new Class[1];
            parameter[0] = int.class;
            Method getSimID = telephonyClass.getMethod(predictedMethodName, parameter);
    
            Object[] obParameter = new Object[1];
            obParameter[0] = slotID;
            Object ob_phone = getSimID.invoke(telephony, obParameter);
    
            if(ob_phone != null){
                imei = ob_phone.toString();
    
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new GeminiMethodNotFoundException(predictedMethodName);
        }
    
        return imei;
    }
    
    private static  boolean getSIMStateBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException {
    
        boolean isReady = false;
    
        TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    
        try{
    
            Class<?> telephonyClass = Class.forName(telephony.getClass().getName());
    
            Class<?>[] parameter = new Class[1];
            parameter[0] = int.class;
            Method getSimStateGemini = telephonyClass.getMethod(predictedMethodName, parameter);
    
            Object[] obParameter = new Object[1];
            obParameter[0] = slotID;
            Object ob_phone = getSimStateGemini.invoke(telephony, obParameter);
    
            if(ob_phone != null){
                int simState = Integer.parseInt(ob_phone.toString());
                if(simState == TelephonyManager.SIM_STATE_READY){
                    isReady = true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new GeminiMethodNotFoundException(predictedMethodName);
        }
    
        return isReady;
    }
    
    
    private static class GeminiMethodNotFoundException extends Exception {
    
        private static final long serialVersionUID = -996812356902545308L;
    
        public GeminiMethodNotFoundException(String info) {
            super(info);
        }
    }
    

    }

    And then use this class like that:

    private void isDualSimOrNot(){
        TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(this);
    
        String imeiSIM1 = telephonyInfo.getImeiSIM1();
        String imeiSIM2 = telephonyInfo.getImeiSIM2();
    
        boolean isSIM1Ready = telephonyInfo.isSIM1Ready();
        boolean isSIM2Ready = telephonyInfo.isSIM2Ready();
    
        boolean isDualSIM = telephonyInfo.isDualSIM();
        Log.i("Dual = "," IME1 : " + imeiSIM1 + "\n" +
                " IME2 : " + imeiSIM2 + "\n" +
                " IS DUAL SIM : " + isDualSIM + "\n" +
                " IS SIM1 READY : " + isSIM1Ready + "\n" +
                " IS SIM2 READY : " + isSIM2Ready + "\n");
    }
    

    Add this permission to the apps AndroidManifest.xml:

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    

    Above code works perfectly for me.

    0 讨论(0)
  • 2020-12-01 11:25

    Work with API > 21

    Need permission android.Manifest.permission.READ_PHONE_STATE.

    public class SplahActivity extends AppCompatActivity {
    
        private Context context;
        private SubscriptionManager mSubscriptionManager;
    
        public static boolean isMultiSimEnabled = false;
        public static String defaultSimName;
    
        public static List<SubscriptionInfo> subInfoList;
        public static ArrayList<String> Numbers;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            context = this;
            setContentView(R.layout.activity_splah);
    
            Numbers = new ArrayList<String>();
            mSubscriptionManager = SubscriptionManager.from(context);
            GetCarriorsInformation();
    
        }
    
        private void GetCarriorsInformation() {
            subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
            if (subInfoList.size() > 1) {
                isMultiSimEnabled = true;
            }
            for (SubscriptionInfo subscriptionInfo : subInfoList) {
                Numbers.add(subscriptionInfo.getNumber());
            }
        }
    }
    

    SubscriptionManager Api 22 Android Official

    0 讨论(0)
提交回复
热议问题