我正在尝试找出一种可靠的方法来判断一个Android设备是否只支持wifi。我尝试了几种方法:
- 尝试获取设备ID(IMEI / MEID),如果我无法获取IMEI / MEID号码,那么我可以假设该设备仅限wifi。这不起作用,因为某些手机在进入飞行模式时不会返回设备ID。 - 尝试阅读TelephonyManager.getPhoneType。这不起作用我正在测试的wifi设备返回PHONE_TYPE_GSM,而我希望它返回PHONE_TYPE_NONE。
我想知道是否有人能成功区分仅限wifi的设备和非wifi的设备。
答案 0 :(得分:4)
您可以在应用中查询系统功能,看看是否有效。
PackageManager pm = getPackageManager();
boolean isAPhone = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
如果您关心GSM / CDMA,请使用更具体的FEATURE_TELEPHONY_GSM
或FEATURE_TELEPHONY_CDMA
。
如果设备在撒谎,那么你当然没什么可以做的。
答案 1 :(得分:2)
以下解决方案更适合我:
TelephonyManager mgr = (TelephonyManager)ctx.getSystemService( Context.TELEPHONY_SERVICE );
return mgr.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
以下没有像Nook Tablet这样的设备上工作:
PackageManager pm = ctx.getPackageManager();
return pm.hasSystemFeature( PackageManager.FEATURE_TELEPHONY );
答案 2 :(得分:0)
我遇到了类似的问题,我查了几个解决方案。到目前为止,其中只有一个可靠地工作
if (mContext.getSystemService(Context.TELEPHONY_SERVICE) == null) {
// wifi-only device
}
这个假设是错误的。我的无线网络Nexus 7返回一个Telephony Manager对象。
mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
这在我的Nexus 7上都返回false。其中一个支持数据连接,另一个只支持wifi
TelephonyManager telMgr = mContext.getSystemService(Context.TELEPHONY_SERVICE)
telMgr.getPhoneType()
我希望{* 1}}为仅限wifi的nexus 7和其他Nexus 7的PHONE_TYPE_NONE
。我为两个Nexus 7获得PHONE_TYPE_GSM
PHONE_TYPE_NONE
这个解决方案让我很担心。在状态转换期间也使用if(telMgr.getSimState() == TelephonyManager.SIM_STATE_UNKNOWN) {
// Wifi-only device
}
else if (telMgr.getSimState() == TelephonyManager.SIM_STATE_ABSENT) {
// Device that supports data connection, but no SIM card present
}
。此外,某些设备支持数据连接,但没有SIM卡。
我最喜欢的解决方案如下
SIM_STATE_UNKNOWN
唯一让我担心的是,如果设备支持ConnectivityManager mConMgr = mContext.getSystemService(Context.CONNECTIVITY_SERVICE)
if (mConMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
//wifi-only device
}
或TYPE_MOBILE_HIPRI
但不支持TYPE_MOBILE_MMS
,我怀疑情况并非如此。