我有一个使用 Java 构建的 Android 应用程序,在 Android 13 和 API 版本 33 上运行。
该应用程序提供 webView,但我希望在应用程序启动后,如果未连接 WIFI(我不需要担心蜂窝连接 - 仅 WIFI),就能够提供本地资源。
我当前的设置是这样的:
权限:
AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private WebView myWebView;
private Context context;
@Override
@SuppressLint("SetJavaScriptEnabled")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myWebView = findViewById(R.id.activity_main_webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setGeolocationEnabled(true);
myWebView.setWebViewClient(new MyWebViewClient());
if (DetectInternetConnection.checkIfAppIsConnectedToWIFI(this)) {
myWebView.loadUrl("https://remote-web-address");
} else {
myWebView.loadUrl("file:///android_asset/local-html-page.html");
}
// and so on...
DetectInternetConnection.java:
package com.mycompany.app;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
class DetectInternetConnection {
public static boolean checkIfAppIsConnectedToWIFI(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
return true;
}
}
}
return false;
}
}
但是我的应用程序总是加载远程 webview 内容。 因为
checkIfAppIsConnectedToWIFI
方法始终返回 true。
即使我关闭了运行模拟器的机器或设备本身的 WIFI。
试试这个方法:
public class DetectInternetConnection {
public static boolean checkIfAppIsConnectedToWIFI(Context context) {
ConnectivityManager connectivityManager = context.getSystemService(ConnectivityManager.class);
if (connectivityManager == null) return false;
Network currentNetwork = connectivityManager.getActiveNetwork();
if (currentNetwork == null) return false;
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
if (caps == null) return false;
return caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
}
该方法
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
检查当前网络是否支持通过WiFi传输,而不是检查WiFi当前是否处于活动状态并已连接。
相反,您应该同时使用
capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
和 capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
来检查是否存在有效的 WiFi 连接。
public static boolean checkIfAppIsConnectedToWIFI(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
return true;
}
}
}
return false;
}