在双卡手机中获取两个 simcard 运营商名称

get both simcard operator name in dual SIM mobile

我想知道当手机是双卡时双 SIM 卡的运营商名称 sim.In 单 SIM 我以编程方式获得运营商名称但是对于双 SIM 我不能,尽管经过这么多搜索和尝试。

如果我 运行 我的应用程序是双卡 phone 那么我可以在我的应用程序中获得两个 SIM 卡运营商名称 例如:Idea,Vodafone。

编辑:

有谁知道如何获取 IMEI 的 sim 运营商名称,然后我有 IMEI 号。

代码:

public class MainActivity extends Activity {

Button btnOne, btnTwo;
TextView tvInfo;
Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnOne = (Button) findViewById(R.id.btnOne);
    btnTwo = (Button) findViewById(R.id.btnTwo);
    tvInfo = (TextView) findViewById(R.id.tvInfo);

    TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(this);

    boolean isDualSIM = telephonyInfo.isDualSIM();
    boolean isSIM1Ready = telephonyInfo.isSIM1Ready();
    boolean isSIM2Ready = telephonyInfo.isSIM2Ready();

    TelephonyManager manager = (TelephonyManager) getApplicationContext()
            .getSystemService(Context.TELEPHONY_SERVICE);

    try {
        telephonyInfo.imsiSIM1 = telephonyInfo.getDeviceIdBySlot(context,
                "getSimSerialNumberGemini", 0);
        telephonyInfo.imsiSIM2 = telephonyInfo.getDeviceIdBySlot(context,
                "getSimSerialNumberGemini", 1);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    String number = manager.getLine1Number();

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

    final String carrierName = manager.getSimOperatorName();
    tvInfo.setText(" " + isDualSIM + " " + optName1 + " " + optName2 + " "
            + telephonyInfo.imsiSIM1 + " " + telephonyInfo.imsiSIM2 + " "
            + number + " " + isSIM1Ready + " " + isSIM2Ready);

    btnOne.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Intent intent = new Intent(
                    Settings.ACTION_ACCESSIBILITY_SETTINGS);
            startActivity(intent);

        }
    });

    btnTwo.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            if (carrierName.equalsIgnoreCase("TATA DOCOMO")
                    || carrierName.contains("DOCOMO")) {
                startService(new Intent(MainActivity.this, USSD.class));
                String ussdCode = "*" + "111" + Uri.encode("#");
                startActivity(new Intent(Intent.ACTION_CALL, Uri
                        .parse("tel:" + ussdCode)));
            } else if (carrierName.equalsIgnoreCase("!dea")
                    || carrierName.contains("idea")) {
                startService(new Intent(MainActivity.this, USSD.class));
                String ussdCode = "*" + "121" + Uri.encode("#");
                startActivity(new Intent(Intent.ACTION_CALL, Uri
                        .parse("tel:" + ussdCode)));
            } else if (carrierName.equalsIgnoreCase("AIRTEL")
                    || carrierName.contains("airtel")) {
                startService(new Intent(MainActivity.this, USSD.class));
                String ussdCode = "*" + "123" + Uri.encode("#");
                startActivity(new Intent(Intent.ACTION_CALL, Uri
                        .parse("tel:" + ussdCode)));
            }

        }
    });

}

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();
        // Log.i("Reflection", "Result: " +  e.printStackTrace());
         return null;
    }

    return result;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

自 API 版本 22 其 possible

对于 os 大于 android 5.1

的设备尝试以下代码
List<SubscriptionInfo> subscriptionInfos = SubscriptionManager.from(getApplicationContext()).getActiveSubscriptionInfoList();
for(int i=0; i<subscriptionInfos.size();i++)
{
    SubscriptionInfo lsuSubscriptionInfo = subscriptionInfos.get(i);
    Log.d(TAG, "getNumber "+ lsuSubscriptionInfo.getNumber());
    Log.d(TAG, "network name : "+ lsuSubscriptionInfo.getCarrierName());
    Log.d(TAG, "getCountryIso "+ lsuSubscriptionInfo.getCountryIso());
}

了解更多信息:Documentation: SubscriptionManager - Android 希望能帮助到你。和平

当然你可以在22以下的手机中了解dualsim的详细信息。只是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;
}

使用这两种方法。您必须使用 Java reflection.

获取所有 sim 详细信息

现在只需使用一行代码即可获得所需的详细信息。

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

第一个参数是 上下文。 第二个参数是您要访问的方法名称,第三个参数是 slotId。 “0”表示 sim 1.

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

每个手机都有自己的方法。就像 micromax 有像 "getCarrierNameGemni" 这样的方法。别担心,我给你的代码会为你处理一切。如果得不到结果,它将 return null。编码愉快!

解决方案太奇怪了,它只在 motoe2.not 和 others.In 中有效,有些显示 null 或有些只显示一个 sim 运算符。

只需更改这两行:

telephonyInfo.optName1 = telephonyInfo.getOutput(
            getApplicationContext(), "SimOperatorName", 1);
    telephonyInfo.optName2 = telephonyInfo.getOutput(
            getApplicationContext(), "SimOperatorName", 2);

getOutput() 方法根据 Sujith.

的回答

对于 API >=22:

{
        SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);

        List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();

        if (subscriptionInfoList != null && subscriptionInfoList.size() > 0) {
            for (SubscriptionInfo info : subscriptionInfoList) {
                String carrierName = info.getCarrierName().toString();
                String mobileNo = info.getNumber();
                String countyIso = info.getCountryIso();
                int dataRoaming = info.getDataRoaming();

            }

        }
    }

对于任何 android 设备。这可能对你有帮助。试试这个!

   //above 22
 if (Build.VERSION.SDK_INT > 22) {
        //for dual sim mobile
        SubscriptionManager localSubscriptionManager = SubscriptionManager.from(this);

        if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {
         //if there are two sims in dual sim mobile
            List localList = localSubscriptionManager.getActiveSubscriptionInfoList();
            SubscriptionInfo simInfo = (SubscriptionInfo) localList.get(0);
            SubscriptionInfo simInfo1 = (SubscriptionInfo) localList.get(1);

            final String sim1 = simInfo.getDisplayName().toString();
            final String sim2 = simInfo1.getDisplayName().toString();

        }else{
         //if there is 1 sim in dual sim mobile
            TelephonyManager tManager = (TelephonyManager) getBaseContext()
                    .getSystemService(Context.TELEPHONY_SERVICE);

            String sim1 = tManager.getNetworkOperatorName();

        }

    }else{
        //below android version 22
                TelephonyManager tManager = (TelephonyManager) getBaseContext()
                        .getSystemService(Context.TELEPHONY_SERVICE);

                String sim1 = tManager.getNetworkOperatorName();
    }