我有类似的问题,以你的,我检查了几种解决方案。其中只有一个工作可靠迄今
if (mContext.getSystemService(Context.TELEPHONY_SERVICE) == null) {
// wifi-only device
}
这种假设是错误的。我的无线Nexus 7将返回Telephony Manager对象。
mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
这将返回两个我的Nexus 7,虚假其中一个支持数据连接,另一种是WiFi的唯一
TelephonyManager telMgr = mContext.getSystemService(Context.TELEPHONY_SERVICE)
telMgr.getPhoneType()
我希望PHONE_TYPE_NONE
为Nexus 7是WiFi的唯一和PHONE_TYPE_GSM
对于其他的Nexus 7,我得到PHONE_TYPE_NONE
两者的Nexus 7
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_STATE_UNKNOWN
。另外,有些设备支持数据连接,但没有SIM卡。
我最喜欢的解决方案是以下
ConnectivityManager mConMgr = mContext.getSystemService(Context.CONNECTIVITY_SERVICE)
if (mConMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
//wifi-only device
}
令我担心的是,如果有支持TYPE_MOBILE_HIPRI
或TYPE_MOBILE_MMS
设备的唯一的事情,但不是TYPE_MOBILE
我怀疑这是不是这样的。
不幸的是我的无线设备认为它是一个GSM手机。 我正在考虑IMEI/MEID和飞行模式的价值结合起来,以决定 - 如果我无法检索IMEI/MEID和飞行模式为关闭的话,我认为这是一个只有WiFi设备。 我检索飞行模式的方法是使用 Settings.System.getInt(context.getContentResolver(), \t Settings.System.AIRPLANE_MODE_ON,0)!= 0; 飞行模式在我的wifi专用测试设备上返回Off。不知道它是否会在其他wifi-only设备上表现相同... – user967113
在我的设备中,我没有gsm模块(仅限wifi设备),但'pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);'返回true。 –