如何在双卡安卓手机中获取连接互联网的运营商名称?

7

我已经制作了一个网络监控应用程序。在这里,我已经成功地实现了所有的功能。我使用的是双卡安卓手机。我知道如何获取运营商的名称。但是我想知道哪张 SIM 卡连接到了互联网?我已经使用了这段代码,只是为了向用户显示设备通过移动数据连接到了互联网。我希望更具体地知道设备当前正在使用哪个运营商的互联网。

public static String isInternetConnected (Context ctx) {
        ConnectivityManager connectivityMgr = (ConnectivityManager) ctx
                .getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobile = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        // Check if wifi or mobile network is available or not. If any of them is
        // available or connected then it will return true, otherwise false;
        if (wifi != null) {
            if (wifi.isConnected()) {
                return "wifi";
            }
        }
        if (mobile != null) {
            if (mobile.isConnected()) {
                return "mobile";
            }
        }
        return "none";
    }

你解决了吗? - Kishan Vaghela
@Tushar Monirul,你找到任何解决方案了吗? - Jordan
@KishanVaghela,你找到解决方案了吗? - Jordan
@Tushar 你得到任何解决方案了吗? - Zeeshan Ali
3个回答

0

API 22之前没有关于多个SIM卡的API。您可以联系设备制造商并检查是否有SDK附加组件来访问多个SIM卡。

自API 22以来,您可以使用SubscriptionManager的方法getActiveSubscriptionInfoList()来检查多个SIM卡。更多详细信息请参阅Android文档。

请看multiple sims。这里有一些关于多重SIM卡的讨论,希望这可以帮助您找到访问多个SIM卡网络的方法。


0
请检查此代码 https://github.com/dragos-niculescu/dualsim/blob/master/src/com/example/dualsim/TelephonyInfo.java
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int dataNetworkTypeSIM1 = telephonyManager.getNetworkType();
int dataNetworkTypeSIM2 = 0;
try {
    dataNetworkTypeSIM1 = Integer.parseInt(getStringOfInt(context, "getNetworkTypeGemini", 0));
    dataNetworkTypeSIM2 = Integer.parseInt(getStringOfInt(context, "getNetworkTypeGemini", 1));
} catch (GeminiMethodNotFoundException e) {
    try {
        dataNetworkTypeSIM1 = Integer.parseInt(getStringOfInt(context, "getDataNetworkTypeGemini", 0));
        dataNetworkTypeSIM2 = Integer.parseInt(getStringOfInt(context, "getDataNetworkTypeGemini", 1));
    } catch (GeminiMethodNotFoundException e1) {
        try {
             dataNetworkTypeSIM1 = Integer.parseInt(getStringOfInt(context, "getDataNetworkType", 0));
             dataNetworkTypeSIM2 = Integer.parseInt(getStringOfInt(context, "getDataNetworkType", 1));
        } catch (GeminiMethodNotFoundException e2) {
             try {
                  dataNetworkTypeSIM1 = Integer.parseInt(getStringOfInt(context, "getNetworkType", 0));
                  dataNetworkTypeSIM2 = Integer.parseInt(getStringOfInt(context, "getNetworkType", 1));
             } catch (GeminiMethodNotFoundException e3) {}
        }
    }
}

您可以通过调用以下方法获取所有可用的方法:

TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Method[] methods = Class.forName(telephonyManager.getClass().getName()).getMethods();

0

是的,您可以通过非官方API实现,以下代码已经可行:

fun getNetOperatorName(): String? {
    val manager = App.instance.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && manager.phoneCount > 1) {
        fun parseValues(raw: String?): List<String> {
            return raw?.split(",") ?: emptyList()
        }

        fun getSystemProperty(propName: String): String? {
            return try {
                Runtime.getRuntime().exec("getprop $propName").inputStream.use {
                    it.buffered(1024).bufferedReader().use { bf -> bf.readLine() }
                }
            } catch (ex: Exception) {
                Log.e("st-lite", "Unable to read sysprop $propName", ex)
                null
            }
        }

        try {
            val simOperatorCodes1 = getSystemProperty("gsm.operator.numeric")
            val simOperatorCodes2 = getSystemProperty("gsm.sim.operator.numeric")
            val codes1 = parseValues(simOperatorCodes1)
            val codes2 = parseValues(simOperatorCodes2)
            var simOperatorNames = getSystemProperty("gsm.operator.alpha")
            if (simOperatorNames.isNullOrEmpty()) {
                simOperatorNames = getSystemProperty("gsm.sim.operator.alpha")
            }
            val names = parseValues(simOperatorNames)
            val currSimOperator = manager.simOperator
            for (i in 0..codes1.size.coerceAtMost(codes2.size)) {
                if (codes1[i] == currSimOperator || codes2[i] == currSimOperator) {
                    return names[i]
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    return manager.networkOperatorName
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接