web-dev-qa-db-ja.com

Android Wi-Fiがインターネットにアクセスできない場合、Lollipopはデフォルトでモバイルデータになりますか?

接続しているAndroid Lollipopにインターネットアクセスがない場合、Wi-Fiはデフォルトでモバイルデータに設定されているようです。これがどこかに公式に文書化されているかどうか誰かが知っていますか?

インターネットを持たないWi-Fiを介してマシンに接続する必要があるアプリケーションがあります。電話が自動的にLTEに切り替わるため、お客様からWi-Fi接続が機能しなくなったとの報告がありました。

私の理解では、電話はまだWi-Fi接続を維持しますが、インターネットへのアクセスを提供することに加えてLTEを使用します( Lollipop-feature-spotlight-Android-now-defaults-to -mobile-data-when-wi-fi-has-no-internet-access-signal-icon-adds-a-for-no-connection )。

この機能についての私の理解は間違っていますか?もしそうなら、インターネットなしでWi-Fiを強制的に使用する方法はありますか?特に開発者向けドキュメントでは、これについて何も見つかりませんでした。

どんな助けでも本当にありがたいです。

18
Florian

@ianhanniballakeの回答を拡張するために、 ConnectivityManager.setProcessDefaultNetwork() を使用してネットワークをバインドすると、ローミングが防止され、完全なTCPアクセスが可能になることがわかりました。したがって、 onAvailable() コールバック特定のURLへの接続を開くのではなく、アプリケーションプロセスをそのネットワークにバインドできます。

ConnectivityManager connection_manager = 
    (ConnectivityManager) activity.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

connection_manager.registerNetworkCallback(request.build(), new NetworkCallback() {

    @Override
    public void onAvailable(Network network) {
        ConnectivityManager.setProcessDefaultNetwork(network);
    }
}

APIレベル23以降:次のOnAvailableメソッドを使用してください。

@Override
public void onAvailable(Network network) {
    connection_manager.bindProcessToNetwork(network);
}
25
Tez

デフォルトでは、Android 5.0は、アクティブなインターネット接続があることを検出したネットワーク経由でのみネットワークリクエストを送信するため、Wi-Fiに「接続」されている場合でも、データを送信することはありません。ネットワーク。

ただし、 Android 5.0 APIガイド は、新しい複数ネットワークのサポートについて説明しています。

Android 5.0は、アプリが特定の機能を備えた利用可能なネットワークを動的にスキャンし、それらへの接続を確立できるようにする新しいマルチネットワークAPIを提供します。この機能は、アプリでSUPL、MMS、キャリア課金ネットワークなどの特殊なネットワークが必要な場合、または特定の種類のトランスポートプロトコルを使用してデータを送信する場合に役立ちます。

これにより、 NetworkRequest for TRANSPORT_WIFI タイプを構築し、 Network.openConnection() を受信したときにトラフィックを Network.openConnection() 経由で転送できます。 (onAvailable()callback)== Wi-Fiネットワークにインターネットアクセスがない場合でも、Wi-Fi経由で特定の接続を行う必要がある場合。

8
ianhanniballake

Android 5.0は、アプリが特定の機能を備えた利用可能なネットワークを動的にスキャンし、それらへの接続を確立できるようにする新しいマルチネットワークAPIを提供します。 詳細はこちら

したがって、解決策は ConnectivityManager.requestNetwor() です。

1
Petr Duchek

これは、独自のアプリ内から接続の問題を解決しようとする人にとっては解決策ではありません。しかし、グーグルクロームのようないくつかの標準的なアプリで非インターネットWiFiにアクセスするための解決策を探してここに来る人のために:

電話の設定で「モバイルデータ」を無効にするだけで、Chromeまたは他のアプリがWiFiに簡単にアクセスできます。

0
Jpsy