如何使用API v33检查Android 13应用程序是否连接到WIFI

问题描述 投票:0回答:2

我有一个使用 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。

java android wifi android-13 android-connectivitymanager
2个回答
1
投票

试试这个方法:

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);
    }
}

0
投票

该方法

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.