在Android 9及更高版本中,可以通过设置网络优先级来同时使用以太网和Wi-Fi。下面是一个示例代码,演示了如何实现此功能:
首先,在AndroidManifest.xml文件中添加以下权限:
然后,在MainActivity.java文件中添加以下代码:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private ConnectivityManager.NetworkCallback networkCallback;
private ConnectivityManager connectivityManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setupNetworkCallback();
registerNetworkCallback();
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void setupNetworkCallback() {
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Log.d(TAG, "Network available: " + network.toString());
// 设置以太网为首选网络
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(network);
} else {
ConnectivityManager.setProcessDefaultNetwork(network);
}
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
Log.d(TAG, "Network lost: " + network.toString());
// 解绑网络
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(null);
} else {
ConnectivityManager.setProcessDefaultNetwork(null);
}
}
};
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void registerNetworkCallback() {
NetworkRequest.Builder requestBuilder = new NetworkRequest.Builder();
requestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
connectivityManager.registerNetworkCallback(requestBuilder.build(), networkCallback);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void unregisterNetworkCallback() {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
unregisterNetworkCallback();
}
}
}
此示例代码中,我们首先检查设备的Android版本是否高于或等于LOLLIPOP(API级别21)。然后,我们创建一个ConnectivityManager.NetworkCallback
实例,该实例负责处理网络状态变化的回调。在onAvailable()
方法中,我们将以太网设置为首选网络,而在onLost()
方法中,我们解绑网络。
最后,在onCreate()
方法中,我们获取系统的ConnectivityManager实例,并使用registerNetworkCallback()
方法注册回调。在onDestroy()
方法中,我们使用unregisterNetworkCallback()
方法取消注册回调。
请注意,这段代码只是一个示例,您可能需要根据您的具体需求进行修改和调整。