Могу ли я включить 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
}
Ответы
Ответ 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. Проверьте исходный код ниже: