检查Tethering USB / Bluetooth是否处于活动状态

时间:2017-04-18 17:25:11

标签: android bluetooth usb tethering

问题

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

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

用于USB Tethering

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

<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 tethering状态?

用于蓝牙连接

因为蓝牙有点不同,到目前为止,我无法接收任何广播或找到获得束缚蓝牙当前状态的方法。

我将收到的内容更改为此类内容,但我无法收到任何内容:

 <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上应用此解决方案,但没有成功。

1 个答案:

答案 0 :(得分:1)

启用网络共享时,android的/sys/class/net文件夹中有一个额外的网络接口(如果是usb网络共享,则为rndis0;如果是设备上的wlan热点,则为ap0

您可以使用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