gpt4 book ai didi

android - 使用 `TRANSPORT_CELLULAR` 时 ConnectionManager 不提供网络回调

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:58 26 4
gpt4 key购买 nike

更新:它确实有效:TRANSPORT_CELLULAR 连接仅在 TRANSPORT_WIFI 断开时可用。除非您在手机的开发人员设置中启用了同步蜂窝数据,否则在启用 WiFi 时您将不会收到回调。


我正在尝试在手机的蜂窝数据连接发生变化时接收回叫。我基本上需要知道它何时关闭以及何时打开。

我以前使用 TelephonyManagerPhoneStateListener.LISTEN_SERVICE_STATE 来执行此操作,但现在我想使用 ConnectionManagerregisterNetworkCallback

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

People say this should work .

    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呢?

最佳答案

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

我刚刚注册了一个接收器

  <receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>

我添加了权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

然后我做了以下

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

对于 Oreo 设备,您可能需要在 Activity 或服务中注册接收器而不是 list

举个例子

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

关于android - 使用 `TRANSPORT_CELLULAR` 时 ConnectionManager 不提供网络回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52165382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com