我可以从代码打开WiFi-Direct吗?在Android API-14(ICS)上

时间:2011-12-20 06:28:26

标签: android-wifi android android-4.0-ice-cream-sandwich

我在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
   }

3 个答案:

答案 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。检查以下源代码: