2013-06-11 158 views
5

我和我的朋友正在開發一個應用程序,使用wifi-direct在Android設備之間傳輸同步音樂。我們的問題是,雖然手機連接後應用程序運行良好,但需要一些手機才能連接,因爲在所有AOSP設備上,似乎只有在進入wifi直接菜單時纔會打開wifi direct(並且在退出時立即關閉)。這使得應用程序內連接相當困難。我們想知道是否有任何方法可以直接從代碼開啓Wi-Fi並保持開啓狀態(如果有人可以向我們推薦如何使用Reflection的詳細說明,那將是非常棒的)。保持WIFI直接打開AOSP設備

謝謝!這裏是我們當前的代碼:

public class Reflector { 
static Method turnOnICS; 
static Method turnOnJB; 
static Method turnOffICS; 

public static void turnOnP2P(WifiP2pManager m, Channel c) { 
    //Log.v("button", "turnOnP2P"); 
    if (android.os.Build.VERSION.SDK_INT == 14 || android.os.Build.VERSION.SDK_INT == 15) { 
     //Log.v("version", "Version is ICS"); 
     try { 
      turnOnICS = WifiP2pManager.class.getDeclaredMethod("enableP2p",WifiP2pManager.Channel.class); 
      turnOnICS.setAccessible(true); 
      turnOnICS.invoke(m, c); 
     } catch (NoSuchMethodException e) { 
      Log.v("ics_error", "ICS enableP2p() not found"); 
     } catch (Exception e) { 
      Log.v("ics_error", "turnOnICS invocation failure"); 
     } 
    } else if (android.os.Build.VERSION.SDK_INT == 16 || android.os.Build.VERSION.SDK_INT == 17) { 
     //Log.v("version", "Version is JB"); 
     try { 
      turnOnJB = NsdManager.class.getDeclaredMethod("setEnabled", boolean.class); 
      turnOnJB.setAccessible(true); 
      turnOnJB.invoke(NsdManager.class, true); 
      //must feed it an nsdmanager, but none exists in wifidirectactivity 
      Log.v("nsd", "problem"); 
     } catch (NoSuchMethodException e) { 
      Log.v("jb_error", "JB setEnabled() not found"); 
     } catch (Exception e) { 
      Log.v("jb_error", "turnOnJB invocation failure"); 
      e.printStackTrace(); 
     } 
    } 
} 

public static void turnOffP2P(WifiP2pManager m, Channel c) { 
    //Log.v("button", "turnOffP2P"); 
    if (android.os.Build.VERSION.SDK_INT == 14 || android.os.Build.VERSION.SDK_INT == 15) { 
     //Log.v("version", "Version is ICS"); 
     try { 
      turnOffICS = WifiP2pManager.class.getDeclaredMethod("disableP2p", WifiP2pManager.Channel.class); 
      turnOffICS.setAccessible(true); 
      turnOffICS.invoke(m, c); 
     } catch (NoSuchMethodException e) { 
      Log.v("ics_error", "ICS disableP2P() not found"); 
     } catch (Exception e) { 
      Log.v("ics_error", "turnOffICS invocation failure"); 
     } 
    } 
} 

public static void printAll(){ 
    Method[] list = WifiP2pManager.class.getDeclaredMethods(); 
    for(Method m : list){ 
     Log.v("tag",m.getName()); 
    } 
} 

}

+0

你有沒有找到一種方法讓Wifi直接開啓?我面臨同樣的問題,一旦wifi直接退出,我不得不手動去設置打開它。 – windchime

+0

不,我們從來沒有想過。希望Android開發者現在已經使這個功能更易於訪問。 – cbartondock

回答

0

謝謝你問這個問題......它已經我們一直在冥思苦想,因爲我們添加wifi直連功能,以我們的應用程序的問題。

通過瀏覽來自不同製造商的多款手機的設置,並閱讀thisthis(其中細節並不十分精確,但它是我們所能找到的最好的)這樣的頁面後,我們得出結論沒有必要單獨開啓WiFi Direct 本身:無論何時啓用WiFi,都會啓用它。所以,至多,您的應用程序需要turn on WiFi

但是,WiFi Direct 掃描(以及被掃描的可見性)是您通過轉到WiFi Direct設置頁面啓動的。

離開該頁面可能會停止掃描(雖然第三方appscananddo開始自己掃描),但不應禁用WiFi直連。這將毫無意義......正如你所說,這將使應用程序難以使用WiFi Direct,但apps確實可以成功使用它。當你離開設置頁面時,你看到的是什麼讓WiFi Direct被禁用?