3

我怎样才能确定该设备确实有 gsm、cdma 或其他蜂窝网络设备(不仅仅是 WiFi)?我不想检查当前连接的网络状态,因为设备此时可能处于离线状态。而且我不想通过 ((TelephonyManager) act.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId() 检查设备 ID,因为某些设备只会为您提供多态或虚拟设备 ID。

实际上,我需要准确检查手机设备是否跳过 TelephonyManager.getDeviceId 并在那些没有蜂窝无线电的设备上执行 Settings.Secure.ANDROID_ID 检查。我至少有一台平板电脑(Storage Options Scroll Excel 7"),每次您询问时都会返回不同的 IMEI,尽管它应该返回 null,因为它没有单元无线电(这里的情况相同:Android: getDeviceId() 返回一个 IMEI, adb shell dumpsys iphonesubinfo 返回 Device ID=NULL)。但我需要有可靠的设备 id,每次我问都一样。

我很高兴听到你的想法!

4

2 回答 2

1

如果您在商店中发布,并且您想限制您的应用程序仅对实际手机可见,您可以<uses-feature>在清单中添加一个要求android.hardware.telephony. 从文档中检查这是否适合您。

于 2013-03-22T22:09:42.090 回答
1

以防万一有人需要完整的解决方案:使用反射是因为某些固件版本上可能不存在某些东西。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;
}
于 2013-03-26T17:26:43.140 回答