Android 7 ConnectivityManager requestNetwork()行为

Keb*_*man 2 android android-networking

我正在使用一些代码来检测移动数据和蜂窝网络是否可用,如下所示:

final ConnectivityManager connection_manager =
                (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);

boolean mobileDataEnabled = false;

try {
    Class cmClass = Class.forName(connection_manager.getClass().getName());
    Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
    method.setAccessible(true); // Make the method callable
    // get the setting for "mobile data"
    mobileDataEnabled = (Boolean)method.invoke(connection_manager);
} catch (Exception e) {
}

if(mobileDataEnabled == true) {
    Log.d(TAG, "mobileDataEnabled == true");
} else {
    Log.d(TAG, "mobileDataEnabled == false");
}

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

connection_manager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback()
{
    @Override
    public void onAvailable(Network network)
    {Log.d(TAG, "requestNetwork onAvailable()");}

    @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()");}
});
Run Code Online (Sandbox Code Playgroud)

到目前为止,这已经正常工作,如果可以使用移动数据,则会触发onAvailable()回调.但是,我刚刚尝试使用android 7设备,虽然mobileDataEnabled设置为true,表明网络可用,但没有任何requestNetwork()回调被触发.

有谁知道这个领域的android 7中是否有任何变化?我至少会期待一个回调被调用,但什么都没有回来.

Keb*_*man 8

我找到了答案..我只需要将NET_CAPABILITY_INTERNET添加到请求构建器中,如下所示:

request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
Run Code Online (Sandbox Code Playgroud)