找不到符号类 android.net.ConnectivityManager.NetworkCallback



我在Android中遇到了一个错误。尝试使用

registerNetworkCallback(NetworkRequest request, ConnectivityManager.NetworkCallback networkCallback)

该 api 用于寄存器接收有关满足给定 NetworkRequest 的所有网络的通知。 https://developer.android.com/reference/android/net/ConnectivityManager.html

错误消息是

Error:(29, 39) error: cannot find symbol class NetworkCallback

我的理解是NetworkCallback是android.net.ConnectivityManager中的一个嵌套静态类。 proguard.pro 不保留该类。所以编译器找不到它。

代码是

import android.net.ConnectivityManager.NetworkCallback;
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = null;
if (android.os.Build.VERSION.SDK_INT >= 21) {
    builder = new NetworkRequest.Builder();
    builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
    builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
    NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    };
    NetworkRequest networkRequest = builder.build();
    connMgr.requestNetwork(networkRequest, networkCallback);
    connMgr.registerNetworkCallback(networkRequest, networkCallback);
}

proguard.pro 是

-keep class android.net.** { *; }

格拉德尔构建是

compileSdkVersion 25
buildToolsVersion '25.0.3'
minSdkVersion 15
targetSdkVersion 25

如何修复错误?

我设法做到了

import android.net.ConnectivityManager;
...
...

然后,我创建了一个特定的回调

private ConnectivityManager.NetworkCallback x = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        Log.d(TAG, "requestNetwork onAvailable()");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            connectivityManager.bindProcessToNetwork(network);
             }
        } else {
            //This method was deprecated in API level 23
            ConnectivityManager.setProcessDefaultNetwork(network);
        }

       // Your job can be done here ..
       // then
        connectivityManager.unregisterNetworkCallback(this);
    }
    @Override
    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
        Log.d(TAG, "requestNetwork onCapabilitiesChanged()");
    }
    @Override
    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
        Log.d(TAG, "requestNetwork onLinkPropertiesChanged()");
    }
    @Override
    public void onLosing(Network network, int maxMsToLive) {
        Log.d(TAG, "requestNetwork onLosing()");
    }
    @Override
    public void onLost(Network network) {
        Log.d(TAG, "requestNetwork onLost()");
    }
};
...
...

然后,在您的主程序中,例如,如果您想使用 WiFi 连接,而无需访问互联网

   NetworkRequest.Builder builder = new NetworkRequest.Builder();
    builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    builder.removeTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
    builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    NetworkRequest request = builder.build();
    final ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    connectivityManager.requestNetwork(request, x);

相关内容

  • 没有找到相关文章

最新更新