检测安卓设备是不是具有移动数据功能

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】:

使用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% 进行复制和粘贴

【讨论】:

这段代码说明了设备使用移动数据的能力?只有在活动网络已连接并且属于移动(及相关)类型的情况下,我们才能说该设备具有移动数据功能,但在所有其他情况下,我们不能确定该设备不具有移动数据功能。跨度>

以上是关于检测安卓设备是不是具有移动数据功能的主要内容,如果未能解决你的问题,请参考以下文章

如何检测安卓设备的移动?

Android 检测设备是不是为模拟器

检测游戏是不是在安卓模拟器中运行

Android检测设备是不是有root权限

获取双卡安卓移动设备中两个 sim 卡插槽的 IMEI

检测浏览器/设备是不是支持双击事件