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

时间:2014-12-17 22:44:23

标签: android tablet

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

我目前使用以下

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    //I assume device has mobile data capability
}

这适用于大多数情况,但只有一个 - 如果设备没有呼叫设施但能够利用蜂窝网络进行数据连接。此类设备通常是具有SIM卡插槽的平板电脑,但它只能用于数据连接,而不能用于呼叫。

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

3 个答案:

答案 0 :(得分:5)

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

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) 返回false。然后,此检查可以确认设备是否具有移动数据功能,即使它没有电话功能(某些平板电脑就是这种情况)。如果设备有FEATURE_TELEPHONY,我认为它具有移动数据功能。这样我们可以在大多数情况下减少执行时间。

答案 1 :(得分:0)

嗯我还没有测试过这个,但如果它有数据连接,那么它在网络上的位置可能已启用,因此你可以使用FEATURE_LOCATION_NETWORK

答案 2 :(得分:0)

使用ConnectivityManagerNetworkInfo检查当前的连接状态:

    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%在copy& amp;糊