2011-09-27 185 views
5

我正试图找到一种可靠的方式来判断Android设备是否仅限wifi。我尝试了几种方法:有没有办法告诉如果Android设备是只有wifi?

- 尝试获取设备ID(IMEI/MEID),如果我不能得到IMEI/MEID号码,那么我可以假设该设备是WiFi的唯一。这不起作用,因为有些手机在进入飞行模式时不会返回设备ID。 - 尝试阅读TelephonyManager.getPhoneType。这不适用于我正在测试的仅支持wifi的设备返回PHONE_TYPE_GSM,而我期望它返回PHONE_TYPE_NONE。

我想知道是否有人能够成功区分wifi专用设备和非wifi专用设备。

回答

4

您可以查询应用程序中的系统功能以查看是否有效。

PackageManager pm = getPackageManager(); 
boolean isAPhone = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); 

如果你关心GSM/CDMA使用更具体的FEATURE_TELEPHONY_GSMFEATURE_TELEPHONY_CDMA

如果设备躺在那里当然没有什么可以做的AFAIK的。

+1

不幸的是我的无线设备认为它是一个GSM手机。 我正在考虑IMEI/MEID和飞行模式的价值结合起来,以决定 - 如果我无法检索IMEI/MEID和飞行模式为关闭的话,我认为这是一个只有WiFi设备。 我检索飞行模式的方法是使用 Settings.System.getInt(context.getContentResolver(), \t Settings.System.AIRPLANE_MODE_ON,0)!= 0; 飞行模式在我的wifi专用测试设备上返回Off。不知道它是否会在其他wifi-only设备上表现相同... – user967113

+0

在我的设备中,我没有gsm模块(仅限wifi设备),但'pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);'返回true。 –

2

以下解决方案更好地为我工作:

TelephonyManager mgr = (TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE); 
return mgr.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE; 

而且下面没有像的Nook平板几台设备的工作:

PackageManager pm = ctx.getPackageManager(); 
return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); 
0

我有类似的问题,以你的,我检查了几种解决方案。其中只有一个工作可靠迄今

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_HIPRITYPE_MOBILE_MMS设备的唯一的事情,但不是TYPE_MOBILE我怀疑这是不是这样的。

相关问题