Подтвердить что ты не робот

Могу ли я включить WiFi-Direct из кода? на Android API-14 (ICS)

Я использую новый API Wi-Fi Direct от Google на Android 4.0 и в примере кода они отправляют Пользователь в Настройки, чтобы активировать режим WiFi -Direct.

Есть ли способ запустить его по коду???

все, что они предлагают, это прослушивание WIFI_P2P_STATE_CHANGED_ACTION намерения, а затем использовать этот код

String action = intent.getAction();

if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {

   // UI update to indicate wifi p2p status.
   int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);

   if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
       // Wifi Direct mode is enabled

   } else {
       // Wifi Direct mode is disabled
   }
4b9b3361

Ответ 1

Да, есть способ, использующий отражение. Работает на моем GSII (и изящно выходит из строя без Wifi Direct HTC Sensation), но поскольку это отражение, оно может не работать на всех телефонах.

p2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE);
channel = p2pManager.initialize(getApplicationContext(),
        getMainLooper(), null);

try {
    Class<?> wifiManager = Class
            .forName("android.net.wifi.p2p.WifiP2pManager");

    Method method = wifiManager
            .getMethod(
                "enableP2p",
                new Class[] { android.net.wifi.p2p.WifiP2pManager.Channel.class });

    method.invoke(p2pManager, channel);

} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Обратите внимание:

На желе Bean и выше, когда вы пытаетесь использовать API WifiP2pManager, WiFi-Direct автоматически включается (пока включен WiFi), поэтому нет необходимости использовать этот хак.

Ответ 2

Нет, все, что вы могли сделать, это уведомить пользователя о включении WiFi.

Ответ 3

На некоторых устройствах, хотя поддерживается Wi-Fi direct, он не активируется из-за некоторых системных ошибок. Здесь более надежный способ проверить, включен ли он (к сожалению, он требует root) с помощью Kotlin.

val matcher = "^mNetworkInfo .* (isA|a)vailable: (true|false)"
    .toPattern(Pattern.MULTILINE)
    .matcher(su("dumpsys ${Context.WIFI_P2P_SERVICE}"))
if (!matcher.find()) return "Root unavailable"
if (matcher.group(2) != "true") return "Wi-Fi Direct unavailable"
return "Wi-Fi Direct available"

Это должно работать для Android 4.3 - 8.1. Проверьте исходный код ниже: