【问题标题】: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 卡插槽的平板电脑,但只能用于数据连接,不能用于通话。

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

【问题讨论】:

    标签: android tablet


    【解决方案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% 进行复制和粘贴

      【讨论】:

      • 这段代码说明了设备使用移动数据的能力?只有在活动网络已连接并且属于移动(及相关)类型的情况下,我们才能说该设备具有移动数据功能,但在所有其他情况下,我们不能确定该设备不具有移动数据功能。跨度>
      猜你喜欢
      • 2013-01-12
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2022-09-30
      相关资源
      最近更新 更多