如何检测网络是否(配置为)Android上的移动热点?

时间:2014-07-01 15:43:54

标签: android android-wifi

从Android 4.1开始,您的设备可以检测它是否已连接到移动热点(假设移动热点也在运行Android 4.1或更高版本)。此外,您可以选择将网络标记为移动热点(在“设置/数据使用/溢出”菜单/“移动热点”下)。

但我如何将其视为-user-我是指开发人员?它没有存储在WifiConfiguration中,那么它在哪里?

某些上下文:我想为Android构建一个简单的工具,用于检查您是否连接到您或Android已标记为移动热点的网络。如果是这样,它将检查是否没有其他(非热点)网络可用。如果是这样,它应该连接到这些其他网络,因为它们应该更快并且没有数据上限。为什么?因为我的手机和平板电脑经常连接到(移动)热点,即使有更好的网络可用。

以下是我正在寻找的一些伪代码:

// Check if android has detected mobile hotspot
WifiManager wifiMgr = getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr .getConnectionInfo();
boolean isMobileHotspot = wifiInfo.isMobileHotspot;

2014年7月3日更新

好的,Matiash的答案很好,但ConnectivityManager.isActiveNetworkMetered()只会返回当前网络的值。我确实需要它,所以它帮助了我,但它带我到我的工具/应用程序的下一部分:

如果设备连接到移动热点(或Android调用的“计量网络”),我想检查附近的任何接入点是否是更好的选择。所以我需要知道是否有任何已知的AP(WifiManager.getConfiguredNetworks())在我连接之前也被标记为......

我有List<ScanResult>List<WifiConfiguration>,看起来他们都没有此信息。

让我回到最初的问题:有没有办法在数据使用情况下检索移动热点(由Android和/或用户配置)?而这次我的意思是所有人。

更新2014年7月7日

我在AOSP问题跟踪器中发布了一个功能请求,用于访问(只读)NetworkPolicyManager。 Plz在这里投票:https://code.google.com/p/android/issues/detail?id=73206&thanks=73206&ts=1404719243

3 个答案:

答案 0 :(得分:6)

您可以致电ConnectivityManager.isActiveNetworkMetered()

来访问此信息

这将返回活动连接是否为热点(如数据使用 - >移动热点中所定义)。

关于第二部分,我很抱歉,但我不认为这是可能的。该标志不是公共的,即使您通过反射获得了可用于检索它的对象(android.net.NetworkPolicyManager):

Object npm = Class.forName("android.net.NetworkPolicyManager").getDeclaredMethod("from", Context.class).invoke(null, this);
Object policies = npm.getClass().getDeclaredMethod("getNetworkPolicies").invoke(npm);

调用getNetworkPolicies()需要MANAGE_NETWORK_POLICY权限,非系统应用无法,因为它具有“签名”保护级别。

我希望被证明不正确。 :)也许查看管理此信息的Android活动的源代码(https://github.com/android/platform_packages_apps_settings/blob/master/src/com/android/settings/net/DataUsageMeteredSettings.java),特别是buildWifiPref()方法,将提供一些线索。

答案 1 :(得分:0)

我不知道你想要的是什么,但你可以通过检查ip检查你的设备是否连接到网络。 您可以使用下面的工具查看您是否有ip,并且知道他是否已连接到网络。

public static Boolean check_connection(final Context _context)
  {
      boolean connected;

      ConnectivityManager conectivtyManager = (ConnectivityManager) _context
              .getSystemService(Context.CONNECTIVITY_SERVICE);

      if (conectivtyManager.getActiveNetworkInfo() != null
              && conectivtyManager.getActiveNetworkInfo().isAvailable()
              && conectivtyManager.getActiveNetworkInfo().isConnected())
      {
          connected = true;

      } else
      {
          connected = false;
      }
      return connected;
  }

答案 2 :(得分:0)

    //Check if hotspot tethering is enabled
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean isMobileData = connectivityManager.isActiveNetworkMetered();

        if(isMobileData) {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface networkInterface : interfaces) {
                if (networkInterface.getName().equals("ap0")) {
                    //Tethering is enabled
                    SendHotspotEnabledHandler sendHotspotEnabledHandler = new SendHotspotEnabledHandler(new WeakReference<Context>(SendInstalledAppsService.this));
                    sendHotspotEnabledHandler.execute();
                    break;
                }
            }
        }

    } catch (SocketException e) {
    }