2017-04-18 56 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轉發 –