我尝试制作一个简单的应用程序,将智能手机连接到指定的wifi网络,并通过闪烁QR代码重定向到显示连接到wifi网络的网络服务器的Web视图。
当我刷新我的QR码(简单的Wifi QR码)时,应用会询问我是否要连接到wifi网络,请确认并重定向到Web视图,但Web视图为空白...看起来像我我已连接到wifi,但无法访问网络...
我的QR码活动的一部分:
public void successFlash(String ssid, String password) {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(password)
.build();
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
public void onAvailable(Network network) {
openActivity_redirect_webview();
}
@Override
public void onUnavailable() {
// do failure processing here..
openQrcodeActivity();
}
};
connectivityManager.requestNetwork(request, networkCallback);
}
我的网络视图活动:
public class activity_redirect_webview extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_redirect_webview);
webView = (WebView) findViewById(R.id.redirect_webview);
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.loadUrl("http://192.168.4.1/index.html");
}
}
AndroidManifest.xml中的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-feature android:name="android.permission.WRITE_SETTINGS"
android:required="false"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.wifi" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
编辑:我的手机是带有Android 10的Samsung Galaxy S20 Ultra
我安装了Network Analyzer应用程序,它确认我没有真正连接到wifi网络。
手动连接到wifi网络:
Screenshot Network Analyzer Manualy connected to wifi
通过扫描“我的应用”中的QR码进行连接:
Screenshot Succes QR Code scan, confirm connection
Screenshot wifi settings actual network Connected via My App
Screenshot Network Analyzer connected to wifi via My App
我们可以看到它好像已连接到wifi网络,但它没有提供我的IP地址,而且我无法ping通我的Web服务器...
我需要在AndrooidManifest中获得更多权限吗?
我不明白为什么当我使用我的应用程序连接到wifi网络时出现此问题...我尝试使用其他wifi网络,这是相同的。 我完全陷入困境,在论坛上找不到任何解决方案...
如果有人可以帮助我, 对不起我的英语不好... 谢谢,
答案 0 :(得分:1)
我终于找到了解决方案,只需要添加一行代码,告诉应用程序将进程绑定到您刚刚连接的wifi网络即可。
connectivityManager.bindProcessToNetwork(network);
最终代码:
public void successFlash(String ssid, String password) {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(password)
.build();
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
public void onAvailable(Network network) {
connectivityManager.bindProcessToNetwork(network);
openActivity_redirect_webview();
}
@Override
public void onUnavailable() {
// do failure processing here..
openQrcodeActivity();
}
};
connectivityManager.requestNetwork(request, networkCallback);
}