Как узнать, есть ли в устройстве android модуль сотовой радиосвязи?

Как я могу точно узнать, что на устройстве действительно есть GSM, CDMA или другое оборудование сотовой сети (а не только WiFi)? Я не хочу проверять текущее состояние подключенной сети, потому что в данный момент устройство может быть отключено. И я не хочу проверять идентификатор устройства через ((TelephonyManager) act.getSystemService (Context.TELEPHONY_SERVICE)). GetDeviceId (), потому что некоторые устройства просто выдадут вам полиморфный или фиктивный идентификатор устройства.

На самом деле, мне нужно точно проверить сотовое оборудование, чтобы пропустить TelephonyManager.getDeviceId и выполнить проверку Settings.Secure.ANDROID_ID на тех устройствах, у которых нет сотового радио. У меня есть по крайней мере один планшет (Storage Options Scroll Excel 7 "), который возвращает разные IMEI каждый раз, когда вы его спрашиваете, хотя он должен возвращать null, поскольку у него нет радиомодуля (здесь такая же ситуация: Android: getDeviceId () возвращает IMEI, adb shell dumpsys iphonesubinfo возвращает идентификатор устройства = NULL). Но мне нужно иметь надежный идентификатор устройства, который будет одинаковым каждый раз, когда я спрашиваю.

Буду рад услышать ваши мысли!


person Tertium    schedule 22.03.2013    source источник
comment
Пожалуйста, перечитайте вопрос. Мне нужно отфильтровать фиктивные значения, которые выглядят как настоящие, а не поддельные.   -  person Tertium    schedule 24.03.2013


Ответы (2)


Если вы публикуете в магазине и хотите, чтобы ваше приложение было видимым только для реальных телефонов, вы можете добавить <uses-feature> в свой манифест, который запрашивает android.hardware.telephony. Проверьте, работает ли это для вас, в документации.

person jlindenbaum    schedule 22.03.2013
comment
И если вы просто хотите узнать это во время выполнения, а не фильтровать его, PackageManager и hasSystemFeature("android.hardware.telephony") сообщат вам, доступна ли телефония в той или иной форме. - person CommonsWare; 23.03.2013
comment
@jlindenbaum Я хочу поддерживать все устройства. Commonsware, спасибо, я проверю - person Tertium; 24.03.2013

На случай, если кому-то понадобится комплексное решение для этого: используется Reflection, потому что в некоторых версиях прошивки некоторые вещи могут отсутствовать. MainContext - контекст основной деятельности.

    static public int getSDKVersion()
{
    Class<?> build_versionClass = null;

    try
    {
        build_versionClass = android.os.Build.VERSION.class;
    }
    catch (Exception e)
    {
    }

    int retval = -1;
    try
    {
        retval = (Integer) build_versionClass.getField("SDK_INT").get(build_versionClass);
    }
    catch (Exception e)
    {
    }

    if (retval == -1)
        retval = 3; //default 1.5

    return retval;
}

static public boolean hasTelephony()
{
    TelephonyManager tm = (TelephonyManager) Hub.MainContext.getSystemService(Context.TELEPHONY_SERVICE);
    if (tm == null)
        return false;

    //devices below are phones only
    if (Utils.getSDKVersion() < 5)
        return true;

    PackageManager pm = MainContext.getPackageManager();

    if (pm == null)
        return false;

    boolean retval = false;
    try
    {
        Class<?> [] parameters = new Class[1];
        parameters[0] = String.class;
        Method method = pm.getClass().getMethod("hasSystemFeature", parameters);
        Object [] parm = new Object[1];
        parm[0] = "android.hardware.telephony";
        Object retValue = method.invoke(pm, parm);
        if (retValue instanceof Boolean)
            retval = ((Boolean) retValue).booleanValue();
        else
            retval = false;
    }
    catch (Exception e)
    {
        retval = false;
    }

    return retval;
}
person Tertium    schedule 26.03.2013
comment
Примечание: похоже, это работает только на устройствах, которые могут совершать фактические телефонные звонки, но большинство планшетов 3G / 4G имеют только возможности 3G / 4G и не могут совершать телефонные звонки. - person David Liu; 10.05.2013
comment
Вот что мне нужно знать. Потому что устройства, у которых нет радио, часто имеют поддельный IMEI, и иногда они дают разные imei каждый раз, когда вы спрашиваете - person Tertium; 15.05.2013
comment
Здравствуйте, я застрял в этом вопросе уже 4-5 дней, и все еще не понимаю. Я спросил это И ответ был точно такой же, как и ваш. Я все еще не уверен, что делает код в попытке. Не могли бы вы объяснить? Спасибо! - person Ruchir Baronia; 11.12.2015