2

私のアプリの機能の1つは、インターネットを介してデータを送信します。データを送信する前に、接続が存在するかどうかを確認します。

private boolean isConnected() {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo.State val1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
    NetworkInfo.State val2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
    return NetworkInfo.State.CONNECTED.equals(val1) || NetworkInfo.State.CONNECTED.equals(val2);
}

これは、エミュレーターと私がテストしたいくつかの実際のデバイスで完全に正常に機能しました。NullPointerException次に、クライアントからエラーレポートを受け取りました。調査の結果、はgetStateオンラインであることが判明しましたTYPE_MOBILE

どうやら、3G(WiFi専用タブレット)を搭載していないデバイスにconnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)戻ってきたようです。nullNexus 7エミュレーターでテストしましたが、このエラーは発生しませんでした。

したがって、私が興味を持っているのは、明示的に3Gを持たないAVD(つまり、WiFi専用デバイスのAVD)を作成して、そのようなシナリオを調査/テストできるようにすることです。エミュレータオプションに何も見つかりませんでしたが、間違った場所を探しているだけかもしれません。これも可能ですか?

4

2 に答える 2

3

AVDのハードウェア設定を変更して、モデムを削除できるはずです。このオプションにはラベルが付いhw.gsmModemていますが、GSMだけでなく、すべての「セルデータ」接続が無効になると思います。

AVD Managerを使用せずにハードウェアオプションを変更する場合config.iniは、avdのフォルダーにあるファイルを編集します。デフォルトでは、フォルダは次の場所にあります。

  • Linux / Mac: 〜/ .android / avd / yourAvdName

  • Windows Vista / 7 /(8?): C:\ Users \ .android \ yourAvdName

  • Windows XP: C:\ Documents and Settings \ .android \ yourAvdName

次のような行を追加するだけです。

hw.gsmModem=no

詳細については、ここここを参照してください。


F8ただし、エミュレータを押して、代わりに3Gをオフにすることでテストできる場合があります。それがあなたが探しているヌルをシミュレートするかどうかはわかりませんが、一見の価値があります。

その他のショートカットについては、こちらをご覧ください。

于 2013-03-07T15:10:32.757 に答える
1

これには簡単な解決策があるとは思いません。それまでの間、私は自分のコードを次のように採用しました。

private boolean isConnected(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    NetworkInfo info2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo.State val1 = (info1 == null ? null : info1.getState());
    NetworkInfo.State val2 = (info2 == null ? null : info2.getState());
    return (info1 != null && NetworkInfo.State.CONNECTED.equals(val1)) || (info2 != null && NetworkInfo.State.CONNECTED.equals(val2));
}

これはnull、インターフェースが存在しない場合に値を処理します。

于 2013-03-11T10:48:09.673 に答える