检测安卓设备是不是具有移动数据功能
Posted
技术标签:
【中文标题】检测安卓设备是不是具有移动数据功能【英文标题】:Detect if an android device has mobile data capability检测安卓设备是否具有移动数据功能 【发布时间】:2014-12-17 22:44:22 【问题描述】:我想检测设备是否具有移动数据功能。我所说的移动数据功能并不是指活动的或已连接的移动数据连接,而是指使用移动数据的能力。
我目前使用以下
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY))
//I assume device has mobile data capability
这在大多数情况下都可以正常工作,但有一种情况 - 如果设备没有呼叫功能,但只能利用蜂窝网络进行数据连接。此类设备通常是带有 SIM 卡插槽的平板电脑,但只能用于数据连接,不能用于通话。
在这种情况下以及在所有其他情况下,如何检测设备是否具有移动数据功能?最好的方法是什么?
【问题讨论】:
【参考方案1】:我自己找到了解决方案。发布给其他可能需要的人。
ConnectivityManager cm = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (ni == null)
// Device does not have mobile data capability
来自 getNetworkInfo(int networkType) 的文档:
参数: networkType 整数,指定您感兴趣的网络类型。
返回:请求的网络类型的 NetworkInfo 对象或 null 如果设备不支持该类型。这种方法需要 来电者持有许可 android.Manifest.permission.ACCESS_NETWORK_STATE。
此方法也可以扩展为检查其他类型的网络。只需将所需的 networkType 放入 getNetworkInfo() 中即可。
就个人而言,我仅在以下情况下执行此测试
getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
返回假。然后,此检查可以确认设备是否具有移动数据功能,即使它没有电话功能(某些平板电脑就是这种情况)。如果设备具有 FEATURE_TELEPHONY,我假设它具有移动数据功能。这样我们可以在大多数情况下减少执行时间。
【讨论】:
【参考方案2】:嗯,我还没有测试过,但是如果它有数据连接,那么它的网络位置可能已启用,因此您可以使用 FEATURE_LOCATION_NETWORK
【讨论】:
我不确定它是否会给出预期的结果。 FEATURE_LOCATION_NETWORK 实际上可能取决于电话基站 ID 或其他东西。如果您只是打算使用移动数据(当您不在 wifi 区域时),您甚至不必一直在手机网络上保持注册状态。当移动数据关闭(设备切换到 wifi 或用户手动关闭数据)时,设备可能只是完全关闭蜂窝无线电。所以定位功能更可能依赖于电话。不幸的是,我无法测试并确定,因为我实际上没有这些设备之一。 :(【参考方案3】:使用ConnectivityManager
和NetworkInfo
检查当前的连接状态:
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo eventInfo = cm.getActiveNetworkInfo();
//first check to see if an active connection exists
if (eventInfo != null
&& eventInfo.getState() == NetworkInfo.State.CONNECTED)
//now checks for the type of connection
switch(eventInfo.getType())
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
//is mobile connection
break;
else
//device currently in a disconnected state, including connecting
*psudo 代码,可能无法 100% 进行复制和粘贴
【讨论】:
这段代码说明了设备使用移动数据的能力?只有在活动网络已连接并且属于移动(及相关)类型的情况下,我们才能说该设备具有移动数据功能,但在所有其他情况下,我们不能确定该设备不具有移动数据功能。跨度>以上是关于检测安卓设备是不是具有移动数据功能的主要内容,如果未能解决你的问题,请参考以下文章