检查网络共享 USB/Bluetooth 是否处于活动状态
Checking Tethering USB/Bluetooth is active
问题
我试图在用户为 Android 高于 Android KitKat 的设备启用或禁用网络共享功能时通知他。
尽管通过反射访问隐藏的 WIFI 网络共享 API,但我无法找到类似的方法来告诉我是否启用了通过 USB/Bluetooth 的网络共享。
用于 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 处于 disabled/enabled 时,我确实可以接收到一些动作,但是它不会发送当前状态,这意味着我收到了这个动作,但如果是否处于活动状态,我只收到 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 的 /sys/class/net
文件夹中有一个额外的网络接口(rndis0
在 usb 网络共享的情况下或 ap0
在 wlan 的情况下我设备上的热点)。
您可以使用 NetworkInterface
class 列出所有网络接口:https://developer.android.com/references/java/net/NetworkInterface.html
getHardwareAddress()
函数需要 NetPermission
如果 rndis0
或 ap0
在列表中启用网络共享
也许会看到 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.whosebug.com/questions/20932102/execute-shell-command-from-android
中一样
应用程序在 android 上拥有更多权限,因此您可以显示为您的应用程序无需 root 即可读取受保护的文件夹,请参阅 http://denniskubes.com/2012/09/25/read-android-data-folder-without-root
问题
我试图在用户为 Android 高于 Android KitKat 的设备启用或禁用网络共享功能时通知他。
尽管通过反射访问隐藏的 WIFI 网络共享 API,但我无法找到类似的方法来告诉我是否启用了通过 USB/Bluetooth 的网络共享。
用于 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 处于 disabled/enabled 时,我确实可以接收到一些动作,但是它不会发送当前状态,这意味着我收到了这个动作,但如果是否处于活动状态,我只收到 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 的 /sys/class/net
文件夹中有一个额外的网络接口(rndis0
在 usb 网络共享的情况下或 ap0
在 wlan 的情况下我设备上的热点)。
您可以使用 NetworkInterface
class 列出所有网络接口:https://developer.android.com/references/java/net/NetworkInterface.html
getHardwareAddress()
函数需要 NetPermission
如果 rndis0
或 ap0
在列表中启用网络共享
也许会看到 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.whosebug.com/questions/20932102/execute-shell-command-from-android
应用程序在 android 上拥有更多权限,因此您可以显示为您的应用程序无需 root 即可读取受保护的文件夹,请参阅 http://denniskubes.com/2012/09/25/read-android-data-folder-without-root