Проверка модема 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

Другие вопросы по тегам