2013-06-11 3 views
5

Мы с моим другом разрабатываем приложение, которое передает синхронизированную музыку между устройствами Android с использованием wifi-direct. Наша проблема заключается в том, что, хотя приложение работает достаточно хорошо, когда телефоны подключены, требуется некоторое занятие, чтобы подключить телефоны, потому что на всех устройствах AOSP кажется, что Wi-Fi direct включен только при входе в прямое меню wifi (и сразу же закрывается при выходе). Это затрудняет соединение в приложении. Нам было интересно, есть ли способ включить Wi-Fi прямо из кода и сохранить его (если кто-нибудь может обратиться к подробному описанию того, как это сделать, используя Reflection, который был бы фантастическим).Сохранение Wifi-Direct Включение устройств 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 Direct on? Я сталкиваюсь с той же проблемой, что после прямого выхода извне, я должен вручную перейти к настройкам, чтобы включить его. – windchime

+0

Нет, мы так и не поняли. Надеюсь, разработчики Android уже сделали эту функциональность более доступной. – cbartondock

ответ

0

Спасибо за этот вопрос ... это был вопрос, мы боролись с, как мы добавим WiFi Direct особенности в наше приложение.

Просмотрев настройки на нескольких телефонах разных производителей и прочитав такие страницы, как this и this (которые, по общему признанию, неточны в деталях, но это лучшее, что мы могли бы найти), мы пришли к выводу что нет необходимости отдельно включать WiFi Direct как таковой: он включен, когда включен WiFi. Таким образом, самое большее ваше приложение должно будет turn on WiFi.

Тем не менее, WiFi Direct сканирование (и видимость для сканирования) - это то, что вы инициируете, перейдя на страницу настроек WiFi Direct.

Оставив эту страницу может остановить сканирование (хотя 3-партии appscananddo начать свое собственное сканирование), но не следует отключать Wi-Fi Direct. Это не имеет никакого смысла ... как вы говорите, это затрудняет (невозможно) для приложений использовать WiFi Direct, но apps действительно использует его. Что вы видите, что казалось, что WiFi Direct отключается, когда вы покинули эту страницу настроек?