2015-04-23 28 views
5

Tôi nhận thấy rằng khi phát trực tuyến âm thanh từ máy chủ từ xa thông qua kết nối 3G (di động) và trong khi WIFI bị ngắt kết nối hoặc TẮT, ngay khi WIFI được kích hoạt và kết nối, kết nối qua 3G bị ngắt.Cách duy trì kết nối thông qua mạng di động sau khi kết nối WIFI trên Android?

Tôi muốn ứng dụng tiếp tục sử dụng 3G ngay cả khi WIFI được kết nối quá bây giờ. Tôi muốn làm điều này để giữ liên tục. (Người dùng có thể chọn tham gia/không tham gia/từ hành vi này).

Có cờ, khóa đặc biệt, v.v. cho mục đích này không?

Trả lời

11

Đ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:

  1. Tạo một ConnectivityManager.
  2. 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.
  3. Để 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... 

} 
+0

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

+1

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. –

+1

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

Các vấn đề liên quan