2011-12-20 49 views
13

我正在使用谷歌Android 4.0 的新Wi-Fi Direct API以及它們將用戶發送到設置的示例代碼,以激活WiFi -Direct模式。我可以從代碼打開WiFi-Direct嗎?在Android API-14(ICS)上

有沒有辦法通過代碼啓動它?

所有,它們的價格是聽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

不知道它適用於4.0,但它只是對以前: HTTP:// WWW .tutorialforandroid.com/2009/10/turn-on-on-wifi-in-android-using.html – Carlos 2012-03-26 11:02:13

回答

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(); 
} 

請注意:

在果凍豆及以上,當您嘗試使用WifiP2pManager API,WiFi直連,將自動啓用(只要有WiFi上),所以沒有需要使用這個黑客。

+0

我想補充說,直接在JB和以上(至少在AOSP上)的WiFi並不是始終處於活動狀態 - 它似乎只是。如果你直接看WiFi的聽衆,一段時間後會自動關閉。但是,如果您打開wifi直接菜單,它會重新啓動。您可能必須讓主機執行對等搜索或初始化以便能夠找到。可能是節電的伎倆。我也發現它是阻塞的,因爲當它接受連接時,整個系統會鎖定並且有時無法連接。 (系統邀請) – Mgamerz 2013-01-21 05:14:18

+0

並添加一件事:此代碼僅在Wifi開啓時纔有效。我的手機(LG Mach 4.0.4)拋出的方法沒有找到,如果它關閉,但它的工作原理,如果它已經打開。 – Mgamerz 2013-01-21 22:52:04

+0

@Mgamerz Wierd,當它處於開啓或關閉狀態時,它在GSII上工作(如果它關閉,它會自動打開它,但實際工作需要幾秒鐘,雖然方法立即返回) – 2013-01-22 09:28:51

2

沒有,你可以做的是通知用戶打開無線網絡連接。

+0

有沒有辦法檢查它是否在不等待意圖? - 例如,如果用戶在運行我的應用程序之前打開了... – zaxy78 2011-12-20 10:07:42

0

在某些設備上,即使支持Wi-Fi直連,但由於某些系統錯誤而未啓用。這裏有一個更可靠的方法來檢查它是否啓用(不幸的是它需要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。下面檢查源代碼:

相關問題