【问题标题】:Checking Tethering USB/Bluetooth is active检查网络共享 USB/蓝牙是否处于活动状态
【发布时间】:2017-04-18 17:25:10
【问题描述】:

问题

我试图在用户启用或禁用高于 Android KitKat 的 Android 设备的网络共享功能时通知用户。

尽管通过反射访问了 WIFI Tethering 隐藏 API,但我无法找到类似的方法来告诉我是否启用了通过 USB/蓝牙的 Tethering。

对于 USB 网络共享

到目前为止,我将接收器清单声明更改为如下内容:

<receiver android:name=".features.tethering.TetheringReceiver">
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED"/>
        <action android:name="android.intent.action.ums_connected" />
        <action android:name="android.net.conn.TETHER_STATE_CHANGED" />
    </intent-filter>
</receiver>

有了这个,当 USB Tether 被禁用/启用时,我确实可以接收到一些操作,但是它不会发送当前状态,这意味着我收到了这个操作,但如果不是活动的,我只收到 3 个数组(ConnectivityManager. EXTRA_AVAILABLE_TETHER、ConnectivityManager.EXTRA_ACTIVE_TETHER 和 ConnectivityManager.EXTRA_ERRORED_TETHER)。

我在检查 ConnectivityManager 的源代码时发现了一个名为 tether 的方法,尽管我需要 WRITE_SETTINGS 权限。 有没有其他方法可以在没有写入设置权限的情况下检查 USB 共享状态?

对于蓝牙网络共享

因为蓝牙有点不同,到目前为止我无法接收任何广播或找到获取网络共享蓝牙当前状态的方法。

我把收到的东西改成这样了,但是我什么都收不到:

 <receiver android:name=".features.tethering.TetheringReceiver">
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" />
        <action android:name="android.intent.action.ums_connected" />
        <action android:name="android.net.conn.TETHER_STATE_CHANGED" />
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
        <action android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" />
        <action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
        <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
    </intent-filter>
</receiver>

另外,我声明了以下权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

总结

我正在寻找一种无需任何危险权限即可了解 USB 和蓝牙网络共享当前状态的方法。有没有办法做到这一点?

我也确实在here 上应用了这个解决方案,但没有成功。

【问题讨论】:

    标签: android bluetooth usb tethering


    【解决方案1】:

    启用网络共享后,Android 的 /sys/class/net 文件夹中会出现一个额外的网络接口(@98​​7654328@ 用于 USB 网络共享,ap0 用于我设备上的 wlan 热点)。

    您可以使用NetworkInterface 类列出所有网络接口:https://developer.android.com/references/java/net/NetworkInterface.html

    getHardwareAddress() 函数需要NetPermission

    如果rndis0ap0 在列表中,则启用网络共享

    也许可以看到https://airtower.wordpress.com/2010/07/29/getting-network-interface-information-in-java/

    另一种方法是使用 shell 命令ls /sys/class/net,它也列出了所有接口。问题是我的android是root的,我不知道是否可以在没有root的情况下访问/sys/class/net文件夹中的信息 通常你可以在android中执行shell命令并从它们那里获取信息,就像http://www.stackoverflow.com/questions/20932102/execute-shell-command-from-android

    应用在 android 上拥有更多权限,因此您可以显示为您的应用,无需 root 即可读取受保护的文件夹,请参阅http://denniskubes.com/2012/09/25/read-android-data-folder-without-root

    【讨论】:

    • 它适用于 USB 网络共享,谢谢!不过,你有什么蓝牙网络共享的解决方案吗?
    • 与蓝牙的网络共享在技术上是 PPP over bluetooth 并在 android 中使用蓝牙 PAN 配置文件。在stackoverflow.com/questions/22864670/… 中就像一个解决方案。 android中的所有网络共享都是IP地址的简单转发。这就是为什么命令 cat /proc/sys/net/ipv4/ip_forward 的输出是一个明确的指示,如果在任何接口(USB、蓝牙,...)上启用了网络共享,如果它是 1,则建立网络共享连接,如果它是 0 否网络共享连接已建立
    • 蓝牙的问题是启用tethering时它会等待连接,只要没有PAN连接(没有配对设备)就不会设置IP转发
    • 您好,我刚刚尝试了您的解决方案,但是根据不同的设备,它可能会出现或 rndis0 和 ap0 或 fe80::f6f5:24ff:fed5:e7b6%wlan0 或只是 fe80::f6f5:24ff:fed5 :e7b6。我正在关注这个例子airtower.wordpress.com/2010/07/29/…
    猜你喜欢
    • 2022-01-01
    • 2011-12-21
    • 1970-01-01
    • 2020-01-11
    • 2019-12-10
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多