我怎样才能确定设备是否真的有gsm,cdma或其他蜂窝网络设备(不仅仅是WiFi)? 我不想检查当前连接的网络状态,因为设备目前可以脱机。 我不想通过((TelephonyManager)act.getSystemService(Context.TELEPHONY_SERVICE))。getDeviceId()检查设备ID,因为有些设备只会给你多态或虚设备ID。
Actualy,我需要完全检查单元设备是否跳过TelephonyManager.getDeviceId并对那些没有蜂窝无线电的设备执行Settings.Secure.ANDROID_ID检查。我有至少一个平板电脑(存储选项滚动Excel 7“),每次你提出它时会返回不同的IMEI,虽然它应该返回null,因为它没有单元格无线电(这里的情况相同:Android: getDeviceId() returns an IMEI, adb shell dumpsys iphonesubinfo returns Device ID=NULL)。但是我每次我问的时候都需要有可靠的设备ID。
我很高兴听到你的想法!
答案 0 :(得分:1)
如果您要在商店中发布,并且希望限制只有实际手机才能看到您的应用,则可以在清单中添加<uses-feature>
,要求android.hardware.telephony
。请查看documentation。
答案 1 :(得分: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;
}