2012-03-01 9 views
6

Jak rozpocząć połączenie danych 3G w systemie Android w tym samym czasie, gdy jest włączone WiFi? PróbowałemRęczne uruchamianie połączenia 3G w systemie Android i utrzymywanie go na

IConnectivityManager.setMobileDataEnabled(enabled); // via reflection 

i działa w emulatorze, ale w moim prawdziwym telefonie (Droid 2), to włączy się ponownie krótko potem wycofać.

z powłoki (ADB shell) ip link zapewnia szczegóły połączenia 3G:

15: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3 link/ppp

Jednak jest dostępna tylko po WiFi jest wyłączone. Kiedy Wi-Fi jest włączone i próbuję włączyć je ręcznie, narzeka ono, że urządzenie ppp0 nie istnieje.

bash-3.2# ip link set ppp0 up 
ip link set ppp0 up 
Cannot find device "ppp0" 

Kiedy próbuję listy urządzenie, nie mogę nawet znaleźć to

bash-3.2# ls /dev/ppp* 
ls /dev/ppp* 
/dev/ppp 
+0

Mam przeczucie, że będę musiał skompilować program C, aby natywnie włączyć radio. Po prostu nie mogę uzyskać wystąpienia obiektu Java ConnectivityService, aby wypróbować różne inne wywołania metod na poziomie aplikacji. – Chloe

Odpowiedz

0

Można spróbować utrzymanie zarówno aktywne w tym samym czasie przez zmodyfikowanie connectivityservice, ale ja bym porady przeciwko niemu, ponieważ najprawdopodobniej zniszczy on żywotność baterii.

Zobacz here jeśli chce się spróbować i tak (i ​​upewnij się, że masz kopię zapasową, oczywiście)

+0

Dzięki, widziałem to, ale musi być możliwe do wdrożenia i pracy dla (większości) wszystkich telefonów. – Chloe

+0

Problem polega na tym, że jest to standardowe w systemie Android (niektóre telefony mogą mieć jednocześnie aktywne, ale większość telefonów tego nie robi). Musiałbyś znaleźć sposób na korygowanie kodu Androida w swojej aplikacji (z czego nie jestem pewna, czy jest to możliwe, czy nie). – Andreas

+0

Wiem, że to możliwe, ponieważ widziałem aplikacje do tetheringu. Muszę tylko włączyć je, aby mieć host z interfejsem wielu ip, ale bez mostu. – Chloe

0

Jeśli próbujesz połączyć się z konkretnym urządzeniu można spróbować ConnectivityManager.requestRouteToHost.

+0

Naa próbowałem tego. Nie włącza radia i nie przypisuje adresu IP. Potrzebuję dostępu do dowolnego hosta, a nie tylko konkretnego. – Chloe

2

Jak rozumiem, nie jest możliwe jednoczesne połączenie 3g i Wi-Fi bez modyfikowania kodu źródłowego platformy Android (co najmniej wersje 2.3 i 4). Głównym problemem jest sztywno priorytety połączeń określonych w frameworks/base/core/res/res/values/config.xml:

<!-- This string array should be overridden by the device to present a list of network 
attributes. This is used by the connectivity manager to decide which networks can coexist 
based on the hardware --> 
    <!-- An Array of "[Connection name],[ConnectivityManager connection type], 
[associated radio-type],[priority] --> 
<!--     ^^^^^^^^^^---------- Connection priority --> 

    <string-array translatable="false" name="networkAttributes"> 
     <item>"wifi,1,1,1"</item> 
     <item>"mobile,0,0,0"</item> 
     <item>"mobile_mms,2,0,2"</item> 
     <item>"mobile_supl,3,0,2"</item> 
     <item>"mobile_hipri,5,0,3"</item> 
    </string-array> 

Ten config.xml jest następnie odczytywane przez ConnectivityService który jest zapisany do łączenia/rozłączania wydarzenia. A w menedżerze połączeń decyduje, co powinien zrobić z innymi połączeniami:

private void handleConnect(NetworkInfo info) { 

     //------------8-<-------------------------- 

     // if this is a default net and other default is running 
     // kill the one not preferred 
     if (mNetAttributes[type].isDefault()) { 
      if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != type) { 
       if ((type != mNetworkPreference && 
         mNetAttributes[mActiveDefaultNetwork].mPriority > 
         //         ^^^^^^^^^ --- From config.xml 
         mNetAttributes[type].mPriority) || 
         //     ^^^^^^^^^-------- From config.xml 
         mNetworkPreference == mActiveDefaultNetwork) { 
         // don't accept this one 
         if (DBG) Slog.v(TAG, "Not broadcasting CONNECT_ACTION " + 
           "to torn down network " + info.getTypeName()); 
         teardown(thisNet); 
         return; 
      //------------8-<-------------------------- 
Powiązane problemy