Проверка модема USB/Bluetooth активна
проблема
Я пытаюсь уведомить пользователя, когда он включает или отключает функцию привязки для устройств Android выше, чем Android KitKat.
Несмотря на доступ к скрытому API WIFI Tethering через рефлексию, я не смог найти аналогичный способ сказать мне, включено ли Tethering через 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 отключен / включен, однако он не отправляет текущее состояние, то есть я получаю это действие, но если оно не активно или нет, я получаю только 3 массива (ConnectivityManager.EXTRA_AVAILABLE_TETHER, ConnectivityManager.EXTRA_ACTIVE_TETHER и ConnectivityManager.EXTRA_ERRORED_TETHER).
Я проверял исходный код ConnectivityManager и нашел метод с именем tether, хотя для этого мне нужны разрешения WRITE_SETTINGS. Есть ли другой способ проверить состояние usb-модема без разрешения на настройку записи?
Для модема Bluetooth
Поскольку Bluetooth немного отличается, пока я не смог получить какую-либо трансляцию или найти способ узнать текущее состояние модема Bluetooth.
Я изменил полученное на что-то вроде этого, но я не смог ничего получить:
<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 и Bluetooth модем без каких-либо опасных разрешений. Есть какой-либо способ сделать это?
Я также применил это решение здесь, но безуспешно.
1 ответ
Если модем включен, в /sys/class/net
папка андроида (rndis0
в случае USB-модема или ap0
в случае wlan hotspot на моем устройстве).
Вы можете перечислить все сетевые интерфейсы, используя 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/
альтернатива - использовать команду оболочки ls /sys/class/net
это также перечисляет все интерфейсы. проблема в том, что мой андроид рутирован и я не знаю, возможно ли получить доступ к информации в /sys/class/net
Папка без рута обычно вы можете выполнять команды оболочки в Android и получать информацию от них, как в /questions/48231987/vyipolnit-komandu-obolochki-iz-android
Приложения имеют больше прав на Android, так что вы можете появляться как приложение для чтения защищенных папок без рута, см. http://denniskubes.com/2012/09/25/read-android-data-folder-without-root