2017-05-15 121 views
1

我在Android中遇到错误。尝试使用找不到符号类android.net.ConnectivityManager.NetworkCallback

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.** { *; } 

gradle这个版本是

compileSdkVersion 25 
buildToolsVersion '25.0.3' 
minSdkVersion 15 
targetSdkVersion 25 

怎么能修正这个错误?

回答

0

我设法与

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); 
+0

谢谢。我会看看它。 –