检测android设备是否具有移动数据功能

检测android设备是否具有移动数据功能,android,tablet,Android,Tablet,我想检测设备是否具有移动数据功能。所谓移动数据能力,我不是指活动或连接的移动数据连接,而是指使用移动数据的能力 我目前使用以下方法 if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { //I assume device has mobile data capability } 这在大多数情况下都能正常工作,但只有一种情况——如果设备没有呼叫设施,但能够利用蜂窝网络进行数据连接。这类设

我想检测设备是否具有移动数据功能。所谓移动数据能力,我不是指活动或连接的移动数据连接,而是指使用移动数据的能力

我目前使用以下方法

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    //I assume device has mobile data capability
}
这在大多数情况下都能正常工作,但只有一种情况——如果设备没有呼叫设施,但能够利用蜂窝网络进行数据连接。这类设备通常是带有SIM卡插槽的平板电脑,但只能用于数据连接,不能用于通话


在这种情况下以及在所有其他情况下,如何检测设备是否具有移动数据功能?最好的方法是什么?

嗯,我还没有测试过,但是如果它有数据连接,那么它在网络上的位置可能已启用,因此您可以使用功能定位网络使用
连接管理器
网络信息
来检查连接的当前状态:

    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%复制和粘贴

我自己找到了解决方案。为可能需要它的其他人发布它

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\u网络\u状态

这种方法也可以扩展到检查其他类型的网络。只需将所需的networkType放入getNetworkInfo()

就我个人而言,我只在以下情况下执行此测试
getPackageManager().hasSystemFeature(PackageManager.FEATURE\u电话)

返回false。该检查可以确认设备是否具有移动数据功能,即使它没有电话功能(某些平板电脑就是这种情况)。若设备具有电话功能,我假设它具有移动数据功能。这样,在大多数情况下,我们可能会减少执行时间。

我不确定它是否会产生预期的结果。功能位置网络实际上可能取决于电话基站id或其他信息。如果你只是想使用移动数据(当你不在wifi区域时),你甚至不需要一直在手机网络上注册。当移动数据关闭时(设备切换到wifi或用户手动关闭数据),设备可能只是完全关闭了手机无线电。所以定位功能更可能依赖于电话。不幸的是,我无法测试并确定,因为我实际上没有这些设备(该代码说明了设备使用移动数据的能力是什么?只有在活动网络已连接且类型为移动(和相关)的情况下,我们才能说该设备具有移动数据能力,但在所有其他情况下,我们无法确定该设备不具有移动数据能力。