更新:工作:TRANSPORT_CELLULAR连接只有在TRANSPORT_WIFI断开时才可用。启用WiFi时,除非在手机的开发人员设置中启用了同时的蜂窝数据,否则不会收到回调。
每当手机的蜂窝数据连接发生变化时,我都会尝试接收回叫。我需要知道它什么时候关机,什么时候开。
我以前用TelephonyManager和PhoneStateListener.LISTEN_SERVICE_STATE来做这件事,但是现在我想在registerNetworkCallback中使用ConnectionManager。
以下代码示例已在Android模拟器(API 28)、华为P20 Lite (API 26)、HTC M8 (API 23)和摩托罗拉G6 (API 26)上试用。当我打开/关闭移动数据或激活飞机模式时,它们都不会调用任何回调。
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
发布于 2018-09-19 18:05:18
我还没有尝试使用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");
}
}
}对于奥利奥设备,您可能需要在活动或服务中注册接收器,而不是清单。
作为一个例子
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);
}
}https://stackoverflow.com/questions/52165382
复制相似问题