我试图在启用或禁用高于Android KitKat的Android设备的网络共享功能时通知用户。
尽管通过反射访问了WIFI Tethering隐藏的API,但是我无法找到类似的方式告诉我是否启用了通过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 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上应用此解决方案,但没有成功。
答案 0 :(得分:1)
启用网络共享时,android的/sys/class/net
文件夹中有一个额外的网络接口(如果是usb网络共享,则为rndis0
;如果是设备上的wlan热点,则为ap0
。
您可以使用NetworkInterface
类列出所有网络接口: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.stackoverflow.com/questions/20932102/execute-shell-command-from-android
应用对Android有更多权限,因此您可以将其显示为您的应用,以便在没有root的情况下阅读受保护的文件夹,请参阅http://denniskubes.com/2012/09/25/read-android-data-folder-without-root