我在Android 4.0上使用谷歌的新Wi-Fi Direct API 在示例代码中,他们将用户发送到设置,以激活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
}
答案 0 :(得分:13)
是的,有一种方法可以使用反射。在我的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();
}
请注意:
在Jelly Bean及以上版本中,当您尝试使用WifiP2pManager
API时,会自动启用WiFi-Direct(只要WiFi处于打开状态),因此无需使用此hack。
答案 1 :(得分:2)
不,您所能做的就是通知用户打开WiFi。
答案 2 :(得分:0)
在某些设备上,即使支持Wi-Fi Direct,由于某些系统错误,也无法启用。这是一种更可靠的方法,可以使用Kotlin检查它是否已启用(不幸的是它需要root)。
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。检查以下源代码: