6

WiFiがオンになっているときにAndroidで3Gデータ接続を開始するにはどうすればよいですか? 私は試した

IConnectivityManager.setMobileDataEnabled(enabled); // via reflection

エミュレーターでは機能しますが、私の実際の電話 (Droid 2) では、一時的にオンになり、再びオフになります。

シェル (adb シェル) から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>

この 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-<--------------------------
于 2012-03-13T06:50:42.783 に答える
0

特定のマシンに接続しようとしている場合は、ConnectivityManager.requestRouteToHostを試すことができます。

于 2012-03-12T18:31:32.073 に答える
0

接続サービスを変更して両方を同時にアクティブに保つこともできますが、バッテリーの寿命が短くなる可能性が高いため、お勧めしません。

とにかく試してみたい場合は、こちらを参照してください(もちろん、バックアップがあることを確認してください)

于 2012-03-07T13:20:49.533 に答える