6

如何在打开 WiFi 的同时在 Android 中启动 3G 数据连接?我试过了

IConnectivityManager.setMobileDataEnabled(enabled); // via reflection

它可以在模拟器中运行,但在我的真实手机(Droid 2)中,它会短暂打开然后再次关闭。

从 shell(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
4

3 回答 3

2

据我了解,在不修改 Android 平台源代码(至少版本 2.3 和 4)的情况下,不可能同时连接 3g 和 WiFi。主要问题是在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>

然后订阅连接/断开事件的ConnectivityService读取此 config.xml 。在连接处理程序中,它决定它应该如何处理其他连接:

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-<--------------------------
于 2012-03-13T06:50:42.783 回答
0

您可以尝试通过修改您的连接服务来同时保持两者处于活动状态,但我建议您不要这样做,因为它很可能会破坏您的电池寿命。

如果您想尝试一下,请参见此处(显然,请确保您有备份)

于 2012-03-07T13:20:49.533 回答
0

如果您尝试连接到特定机器,可以尝试ConnectivityManager.requestRouteToHost

于 2012-03-12T18:31:32.073 回答