Wraz z przyjacielem opracowujemy aplikację, która przesyła zsynchronizowaną muzykę między urządzeniami z Androidem za pomocą Wi-Fi Direct. Naszym problemem jest to, że chociaż aplikacja działa dość dobrze, gdy telefony są ze sobą połączone, niektóre telefony komórkowe wymagają połączenia, ponieważ na wszystkich urządzeniach AOSP wydaje się, że funkcja Wi-Fi Direct jest włączona tylko po wejściu do bezpośredniego menu Wi-Fi (i natychmiast po zamknięciu jest natychmiast zamykana)). To sprawia, że połączenie w aplikacji jest raczej trudne. Zastanawialiśmy się, czy istnieje jakikolwiek sposób, aby włączyć wifi bezpośrednio z kodu i zachować go (jeśli ktoś mógłby nam polecić dokładny opis, jak to zrobić, używając Reflection, który byłby fantastyczny).Obsługa urządzeń AOSP podłączonych do sieci Wi-Fi
Dzięki! Oto nasz aktualny kod:
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());
}
}
}
Czy znalazłeś sposób, aby utrzymać Wifi Direct na? Mam taki sam problem, że po bezpośrednim wyjściem wifi, muszę ręcznie przejść do ustawień, aby go włączyć. – windchime
Nie, nigdy tego nie odkryliśmy. Mam nadzieję, że twórcy Androida już teraz udostępnili tę funkcjonalność. – cbartondock