Android TelephonyManager双卡

时间:2015-10-15 13:54:17

标签: android telephonymanager dual-sim

我已经阅读并尝试了很多关于检测手机是否是双卡的解决方案,但每种解决方案都无法正常工作。

我已尝试使用此代码:

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.telephony.TelephonyManager;


public final class TelephonyInfoNew {

    private static TelephonyInfoNew telephonyInfo;
    private String imsiSIM1;
    private String imsiSIM2;
    private boolean isSIM1Ready;
    private boolean isSIM2Ready;

    public String getImsiSIM1() {
        return imsiSIM1;
    }

    /*public static void setImsiSIM1(String imsiSIM1) {
        TelephonyInfo.imsiSIM1 = imsiSIM1;
    }*/

    public String getImsiSIM2() {
        return imsiSIM2;
    }

    /*public static void setImsiSIM2(String imsiSIM2) {
        TelephonyInfo.imsiSIM2 = imsiSIM2;
    }*/

    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 imsiSIM2 != null;
    }

    private TelephonyInfoNew() {
    }

    public static TelephonyInfoNew getInstance(Context context){

        if(telephonyInfo == null) {

            telephonyInfo = new TelephonyInfoNew();

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

            telephonyInfo.imsiSIM1 = telephonyManager.getDeviceId();
            telephonyInfo.imsiSIM2 = null;

            List<String> list = printTelephonyManagerMethodNamesForThisDeviceList(context);
            for (int i = 0; i < list.size(); i++)
            {
                try
                {
                    System.out.println("1 -> " + list.get(i));
                    telephonyInfo.imsiSIM1 = getDeviceIdBySlot(context, list.get(i), 0);
                    telephonyInfo.imsiSIM2 = getDeviceIdBySlot(context, list.get(i), 1);
                    break;
                }catch(GeminiMethodNotFoundException e2)
                {
                    e2.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

                    List<String> list1 = printTelephonyManagerMethodNamesForThisDeviceList(context);
                    for (int i = 0; i < list1.size(); i++)
                    {
                        try
                        {
                            telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, list1.get(i), 0);
                            telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, list1.get(i), 1);
                            break;
                        }catch(GeminiMethodNotFoundException e2)
                        {
                            e2.printStackTrace();
                        }
                    }
                    e1.printStackTrace();
                }
            }
        }

        return telephonyInfo;
    }

    private static String getDeviceIdBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException {

        String imsi = 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){
                imsi = ob_phone.toString();

            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new GeminiMethodNotFoundException(predictedMethodName);
        }

        return imsi;
    }

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

    public static List<String> printTelephonyManagerMethodNamesForThisDeviceList(Context context) {

        List<String> list = new ArrayList<String>();

        TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        Class<?> telephonyClass;
        try {
            telephonyClass = Class.forName(telephony.getClass().getName());
            Method[] methods = telephonyClass.getMethods();
            for (int idx = 0; idx < methods.length; idx++) {
                 //Log.println (Log.DEBUG, "Dual", methods[idx] + " declared by " + methods[idx].getDeclaringClass() + "\n");
                String mth = methods[idx].getName();
                //System.out.println(mth + " - " + methods[idx].getName() + " - ");
                //String[] exp = mth.split(".");
                //int len = exp.length;
                //System.out.println(len);
                //System.out.println(exp[len-1]);
                list.add(mth);

                //System.out.println("\n" + methods[idx] + " declared by " + methods[idx].getDeclaringClass());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return list;
    } 
}

和主要:

TelephonyInfoNew telephonyInfo = TelephonyInfoNew.getInstance(context);
            String imsiSIM1 = telephonyInfo.getImsiSIM1();
            String imsiSIM2 = telephonyInfo.getImsiSIM2();

System.out.println(" IMSI1 : " + imsiSIM1 + "\n" +
                    " IMSI2 : " + imsiSIM2 + "\n" +
                    " IS DUAL SIM : " + isDualSIM + "\n" +
                    " IS SIM1 READY : " + isSIM1Ready + "\n" +
                    " IS SIM2 READY : " + isSIM2Ready + "\n");

我总是收到:

imsi1 = 0;
imsi2 = 1;

是否可以解决问题或检测手机是否为双卡?

非常感谢

0 个答案:

没有答案