get both simcard operator name in dual SIM mobile

前端 未结 5 1593
不思量自难忘°
不思量自难忘° 2021-01-06 09:10

I want to know Both sim card\'s operator name when mobile is dual sim.In single SIM I got operator name programmatically But For duel SIM I can\'t although after so many sea

5条回答
  •  广开言路
    2021-01-06 09:51

    Ofcourse you can get the details of dualsim in mobiles below version 22. It is only not officially supported only after 22.

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

    Use this two methods. You have to get all sim details by using Java reflection.

    Now get the detail you want by just using a single line of code.

    String optName = getOutput(context, "getCarrierName", 0);
    

    the first param is the context. second param is the method name you wanna access and the third param is the slotId. "0" means sim 1.

    All the result of this method will be string. Convert them as per your need.

    Each mobile having its own method. Like micromax is having method like "getCarrierNameGemni". Don't worry, The code I gave you will handle everything for you. If it cant get the result, it will return null. Happy coding!

提交回复
热议问题