首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConnectionManager在使用`TRANSPORT_CELLULAR`时不进行网络回调

ConnectionManager在使用`TRANSPORT_CELLULAR`时不进行网络回调
EN

Stack Overflow用户
提问于 2018-09-04 11:34:00
回答 1查看 1.6K关注 0票数 11

更新:工作:TRANSPORT_CELLULAR连接只有在TRANSPORT_WIFI断开时才可用。启用WiFi时,除非在手机的开发人员设置中启用了同时的蜂窝数据,否则不会收到回调。

每当手机的蜂窝数据连接发生变化时,我都会尝试接收回叫。我需要知道它什么时候关机,什么时候开。

我以前用TelephonyManagerPhoneStateListener.LISTEN_SERVICE_STATE来做这件事,但是现在我想在registerNetworkCallback中使用ConnectionManager

以下代码示例已在Android模拟器(API 28)、华为P20 Lite (API 26)、HTC M8 (API 23)和摩托罗拉G6 (API 26)上试用。当我打开/关闭移动数据或激活飞机模式时,它们都不会调用任何回调。

People say this should work

代码语言:javascript
复制
    NetworkRequest.Builder builder = new NetworkRequest.Builder();

    builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

    connManager.registerNetworkCallback(builder.build(), new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            Log.d("Conman Test", "onAvailable");
        }

        @Override
        public void onLost(Network network) {
            Log.d("Conman Test", "onLost");
        }

        @Override
        public void onUnavailable() {
            Log.d("Conman Test", "onUnavailable");
        }

        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
            Log.d("Conman Test", "onCapabilitiesChanged");
        }

        @Override
        public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
            Log.d("Conman Test", "onLinkPropertiesChanged");
        }
    });

我试过NetworkCapabilities.TRANSPORT_WIFI,它在所有的设备上都能正常工作。所以为什么不NetworkCapabilities.TRANSPORT_CELLULAR

EN

回答 1

Stack Overflow用户

发布于 2018-09-19 18:05:18

我还没有尝试使用NetworkCapabilities来解决这个问题,但我使用了另一种方法来确定我的设备是通过蜂窝连接还是通过wifi连接。

我刚注册了一个接收器

代码语言:javascript
复制
  <receiver android:name=".NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
  </receiver>

我增加了许可

代码语言:javascript
复制
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

然后我做了以下工作

代码语言:javascript
复制
public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnectedOrConnecting();

        if(activeNetwork ==null){
            Log.d("Connectivity","Not connected");
            return;
        }

        boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

        if(isConnected  && isWiFi){
            Log.d("Connectivity","WIFI");
        }else{
            Log.d("Connectivity","CELLULAR");
        }
    }
}

对于奥利奥设备,您可能需要在活动或服务中注册接收器,而不是清单。

作为一个例子

代码语言:javascript
复制
public class MainActivity extends Activity {

    IntentFilter filter1;

    @Override
    public void onCreate() {
        filter1 = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(myReceiver, filter1);
    }

    //The BroadcastReceiver that listens for network change
    private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equalsIgnoreCase("android.net.conn.CONNECTIVITY_CHANGE")) {
                Log.d(TAG,"connectivity change");

             ConnectivityManager cm =
            (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnectedOrConnecting();

        if(activeNetwork ==null){
            Log.d("Connectivity","Not connected");
            return;
        }

        boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

        if(isConnected  && isWiFi){
            Log.d("Connectivity","WIFI");
        }else{
            Log.d("Connectivity","CELLULAR");
        }
            }
        }
    };

    @Override
    public void onDestroy() {
        unregisterReceiver(myReceiver);
    }
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52165382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档