2017-04-18 107 views
1

问题

我想,当他可以启用或禁用Android设备比Android奇巧更高的束缚功能来通知用户。检查网络共享USB /蓝牙激活

尽管通过反射访问WIFI Tethering隐藏的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系绳禁用/启用,但它不发送当前状态,这意味着我收到此操作,但如果处于活动状态则不会收到,我只收到3个数组(ConnectivityManager.EXTRA_AVAILABLE_TETHER,ConnectivityManager.EXTRA_ACTIVE_TETHER和ConnectivityManager.EXTRA_ERRORED_TETHER)。

我在检查ConnectivityManager的源代码,并且发现了一个叫做系绳的方法,虽然我需要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上应用此解决方案,但没有成功。

回答

1

束缚时启用有在机器人的/sys/class/net文件夹中的额外的网络接口(在WLAN热点的情况下,在USB网络共享或ap0的情况下rndis0我的设备上)。

您可以列出使用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 t帽子也列出了所有的接口。问题是,我的Android扎根,我不知道是否有可能访问在/sys/class/net文件夹中的信息,而不根 通常你可以在android系统执行shell命令,并从他们那里得到的信息像http://www.stackoverflow.com/questions/2/execute-shell-command-from-android

应用对Android有更多的权利,所以你可以出现你的应用程序来阅读没有根的受保护的文件夹,请参阅http://denniskubes.com/2012/09/25/read-android-data-folder-without-root

+0

它适用于USB绑定,谢谢! 虽然,你有蓝牙网络共享的解决方案吗? – iGoDa

+0

与蓝牙网络连接技术上* PPP over Bluetooth *并在Android中使用蓝牙PAN配置文件。在http://stackoverflow.com/questions/22864670/enable-bluetooth-tethering-android-programmatically就像一个解决方案。 Android中的所有绑定都是IP地址的简单转发。这就是为什么如果在任何接口(USB,蓝牙......)上启用共享功能时,命令“cat/proc/sys/net/ipv4/ip_forward”的输出是一个明确的指示符,如果是0,则不建立共享连接 –

+0

蓝牙的问题在于,启用共享功能时等待连接,只要没有PAN连接(没有配对设备),就不会设置IP转发 –