Điều này là không thể trên các thiết bị trước Android 5.0 (Lollipop). Hệ điều hành chỉ giữ một giao diện tại một thời điểm và các ứng dụng không có bất kỳ sự kiểm soát nào đối với lựa chọn này.
Trên các thiết bị chạy Android 5.0 trở lên, bạn có thể sử dụng API đa mạng mới để chọn giao diện bạn muốn sử dụng cho lưu lượng truy cập mạng.
Dưới đây là các bước để thực hiện điều này, từ Android 5.0 changelog:
Để chọn và kết nối với một mạng lưới tự động từ ứng dụng của bạn, hãy làm theo các bước sau:
- Tạo một
ConnectivityManager
.
- Sử dụng các lớp
NetworkRequest.Builder
để tạo ra một đối tượng NetworkRequest
và xác định các tính năng mạng và vận chuyển loại ứng dụng của bạn là quan tâm.
- Để quét cho các mạng phù hợp, hãy gọi
requestNetwork()
hoặc registerNetworkCallback()
, và vượt qua trong các đối tượng NetworkRequest
và một thực hiện ConnectivityManager.NetworkCallback
. Sử dụng phương pháp requestNetwork()
nếu bạn muốn chủ động chuyển sang mạng phù hợp sau khi phát hiện được; để chỉ nhận thông báo cho các mạng đã quét mà không chủ động chuyển đổi, hãy sử dụng phương thức registerNetworkCallback()
thay thế.
Khi hệ thống phát hiện một mạng phù hợp, mạng sẽ kết nối với mạng và gọi hàm gọi lại có sẵn. Bạn có thể sử dụng đối tượng Mạng từ cuộc gọi lại để nhận thêm thông tin về mạng hoặc để hướng lưu lượng truy cập đến sử dụng mạng đã chọn.
Cụ thể, nếu bạn muốn để buộc giao thông qua 3G/LTE, thậm chí nếu có một món quà tín hiệu WiFi, bạn muốn sử dụng một cái gì đó như thế này:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// If you want to use a raw socket...
network.bindSocket(...);
// Or if you want a managed URL connection...
URLConnection conn = network.openConnection(...);
}
// Be sure to override other options in NetworkCallback() too...
}
Nguồn
2015-04-24 02:20:40
lớn thông tin! Cảm ơn nhiều! Bạn có một ý tưởng về cách khóa vào 3G của bên NDK không? (Duy trì kết nối với 3G ở c/C++, khi tôi kết nối với máy chủ với NDK) – frankish
API này chỉ có sẵn trong khung Java của Android, vì vậy nếu bạn muốn truy cập nó từ bên trong NDK, bạn phải sử dụng JNI để tạo một cuộc gọi từ C++ sang Java. –
Xin chào @TrevorJohns, nếu tôi sử dụng phương pháp này để gửi các yêu cầu Http trong "onAvailable", chúng sẽ được gửi từ mạng được chỉ định không? Ví dụ, tôi đang sử dụng AsyncHttpClient cho điều đó. Nếu tôi gọi client.Get() trong onAvailable, yêu cầu đó có được định tuyến thông qua mạng được chỉ định không? – Konstantinos