Запуск 3G-соединения вручную в Android и его включение - PullRequest
6 голосов
/ 01 марта 2012

Как запустить подключение для передачи данных 3G в Android при включенном WiFi?Я попробовал

IConnectivityManager.setMobileDataEnabled(enabled); // via reflection

, и он работает в эмуляторе, но в моем реальном телефоне (Droid 2) он кратковременно включается и снова выключается.

Из оболочки (adb shell) ip link предоставляет подробную информацию о 3G-соединении:

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

Однако оно доступно только при выключенном WiFi,Когда WiFi включен, и я пытаюсь включить его вручную, он жалуется, что устройство ppp0 не существует.

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

Когда я пытаюсь отобразить устройство, я даже не могу его найти

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

Ответы [ 3 ]

2 голосов
/ 13 марта 2012

Как я понимаю, невозможно одновременно подключить 3g и WiFi без изменения исходного кода платформы Android (по крайней мере, версии 2.3 и 4). Основная проблема заключается в жестко заданных приоритетах соединений, определенных в 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>

Этот config.xml затем читается ConnectivityService , который подписан на события подключения / отключения. А в обработчике соединения он решает, что делать с другими соединениями:

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-<--------------------------
0 голосов
/ 12 марта 2012

Если вы пытаетесь подключиться к определенной машине, вы можете попробовать ConnectivityManager.requestRouteToHost .

0 голосов
/ 07 марта 2012

Вы можете попытаться сохранить обе активности одновременно, изменив службу подключения, но я бы посоветовал против этого, так как это, скорее всего, сократит срок службы батареи.

См. здесь если вы все равно хотите попробовать (и, конечно, убедитесь, что у вас есть резервная копия)

...