2013-06-11 33 views
5

Bạn tôi và tôi đang phát triển một ứng dụng phát trực tuyến nhạc đồng bộ giữa các thiết bị Android sử dụng tính năng wifi trực tiếp. Vấn đề của chúng tôi là trong khi ứng dụng hoạt động khá tốt khi điện thoại được kết nối, phải mất một số thao tác để kết nối điện thoại vì tất cả các thiết bị AOSP xuất hiện trực tiếp wifi chỉ khi bật menu trực tiếp wifi (và ngay lập tức đóng khi thoát). Điều này làm cho kết nối trong ứng dụng khá khó khăn. Chúng tôi đã tự hỏi nếu có bất kỳ cách nào để bật wifi trực tiếp từ mã và giữ nó trên (nếu có ai có thể giới thiệu chúng tôi đến một mô tả chi tiết về cách làm điều này bằng cách sử dụng Reflection đó sẽ là tuyệt vời).Giữ Wifi trực tiếp được bật trên các thiết bị AOSP

Cảm ơn! Đây là mã hiện tại của chúng tôi:

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

Bạn đã tìm cách giữ Wifi Direct chưa? Tôi phải đối mặt với cùng một vấn đề mà một khi thoát ra trực tiếp wifi, tôi phải tự đi đến các thiết lập để bật nó lên. – windchime

+0

Không, chúng tôi chưa bao giờ tìm ra. Hy vọng rằng các nhà phát triển Android đã làm cho chức năng này dễ truy cập hơn bây giờ. – cbartondock

Trả lời

0

Cảm ơn bạn đã đặt câu hỏi này ... đó là một câu hỏi chúng tôi đã vật lộn với khi chúng ta thêm WiFi Direct tính năng để ứng dụng của chúng tôi.

Sau khi xem qua các cài đặt trên một số điện thoại từ các nhà sản xuất khác nhau, và đọc các trang như thisthis (được thừa nhận là không chính xác trong chi tiết, nhưng đó là điều tốt nhất chúng tôi có thể tìm thấy), chúng tôi đã đi đến kết luận không cần phải bật WiFi trực tiếp mỗi se: tính năng này được bật bất cứ khi nào WiFi được bật. Vì vậy, nhiều nhất, ứng dụng của bạn sẽ cần phải turn on WiFi.

Tuy nhiên, WiFi Direct quét (và mức độ hiển thị được quét) là những gì bạn bắt đầu bằng cách truy cập trang cài đặt WiFi Direct.

Rời khỏi trang đó có thể dừng quá trình quét (mặc dù bên thứ ba appscananddo bắt đầu quét riêng), nhưng không nên tắt WiFi Direct. Điều đó sẽ không có ý nghĩa gì cả ... như bạn nói, điều đó sẽ khiến cho các ứng dụng sử dụng WiFi Direct khó khăn (không thể), nhưng apps sẽ sử dụng thành công. Bạn đã thấy điều gì khiến cho dường như WiFi Direct bị vô hiệu hóa khi bạn rời khỏi trang cài đặt đó?

Các vấn đề liên quan