私は、ユーザーがインターネット接続のないアクセスポイントに接続し、デバイスを構成してから自宅のWifiネットワークに接続するオンボーディングプロセスがあるIoTアプリに取り組んでいます。
Android 8デバイスは、アクセスポイントから切断し、以前に構成したネットワークに再接続して、いくつかの問題を引き起こしています。これは、Android 8のセクション this link のシームレス接続から導入された接続更新に関連していると想定しています。
互換性のあるデバイスでは、高品質の保存済みネットワークが近くにあるときにWi-Fiが自動的にアクティブになります。
私の質問は、インターネット接続なしでアクセスポイントに接続したままにし、搭乗手続きを完了する必要があるため、この動作を無効にする方法です。
同じ問題がありました。私がしたことは、搭乗プロセスにステップを追加することです。そこでユーザーをそこに移動して設定を行い、データのないこのネットワークを手動で追加し、システムによって表示されるポップアップを受け入れます。
私はまだ本当の解決策を見つけていません。ただし、eWeLinkと呼ばれるアプリを見たことがありますが、それはオープンソースプロジェクトではありません。
ディスカッションに少し追加したかっただけです。私はしばらくbindProcessToNetworkを使用していますが、Shawn Chenが説明しているように、ネットワークなしでWiFiに接続すると、WiFiが失われるのを修正できます。これは、モバイルネットワークを同時に使用することを困難にする、強引なソリューションです。ただし、ルーティングテーブルはwifiデバイスを示していますが、Android 6のどこかで、モバイルにリクエストを強制し始めた場所ではかなり壊れています。
とにかく、実際には、以下に説明するソケットレベルでバインドできます。これは、プロセスがWiFiネットワークにバインドされていても、モバイルを使用したい場合に役立ちます。 WiFiを検索する代わりに(プロセスをバインドする代わりに実験を行っていました)、モバイルの「ネットワーク」オブジェクトを検索して、それにソケットを構築します。
必要なのは、Android WiFi接続をドロップしないことを示すものです。
HttpUrlConnectionではソケットを取得できないため、okhttpを使用して接続ごとのレベルでソケットを取得できます。私はOkHttpの2.7.5を使用していますが、3つ以上のバージョンのOkHttpと非常によく似ています。
現在のネットワークを取得し、それぞれを処理してWiFiネットワークを見つけます。
Network[] networks = connectivityManager.getAllNetworks();
次に、次のようなURLを作成します。
String url = "http://someurl";
HttpUrlConnection uconn = new OkUrlFactory( new OkHttpClient().setSocketFactory(network.getSocketFactory())).open(url)
これはすべて、いくつかの接続で問題なく機能し、場合によっては、使用した一連の接続でも機能します。 Androidはネットワーク上でアクティビティが発生しているという知識を使用していますが、一時停止してモバイルの使用に戻ります。Android 9 wifiは欠陥があり、 tは、ソケットソリューションを使用して粘着性を高める方法を理解しました。
同じ問題がありました。これがAndroid 8+デバイスでこの問題を修正する方法です。1. Android 8+デバイスがWiFIと携帯デバイスを自動的に切り替えるため。以下のコードを削除しました。 。つまり、wifiへの移動を強制するコード。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkRequest.Builder request = new NetworkRequest.Builder();
Log.i("forceCellularConnection","request WIFI enable");
request.addCapability(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.setProcessDefaultNetwork(network);
connectivityManager.bindProcessToNetwork(network);
}
}
});
}
新しい接続を行う前にwifi接続を忘れるように、以下のコードも追加しました。デバイスがWiFIを切断するのにしばらく時間がかかります。新しいWIFI SSIDに接続する前に遅延を追加しました。
this.wifiManager.disableNetwork(configuration.networkId);
this.wifiManager.removeNetwork(configuration.networkId);
this.wifiManager.saveConfiguration(); // Not needed in API level 26 and above
私が試して接続作業を支援した回避策は次のとおりです。私の場合も、インターネットが接続されていないWiFiを接続する必要があります。そのピアツーピア接続。
接続を2〜3回試みました
new CountDownTimer(16000, 2000) {
また、WiFiの状態を確認するために、以下の放送受信機を作成しました。そして、接続を行いました。
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d("WifiReceiver", ">>>>SUPPLICANT_STATE_CHANGED_ACTION<<<<<<");
SupplicantState supl_state = ((SupplicantState) intent
.getParcelableExtra(WifiManager.EXTRA_NEW_STATE));
switch (supl_state) {
case ASSOCIATED:
Log.i("SupplicantState", "ASSOCIATED");
// authMsg = "ASSOCIATED";
break;
case ASSOCIATING:
// authMsg = "ASSOCIATING";
Log.i("SupplicantState", "ASSOCIATING");
break;
case AUTHENTICATING:
// authMsg = "AUTHENTICATING";
Log.i("SupplicantState", "Authenticating...");
break;
case COMPLETED:
authMsg = "CONNECTED";
Log.i("SupplicantState", "Connected");
final ConnectivityManager connection_manager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
});
break;
case DISCONNECTED: