5

Tôi phải gửi gói UDP đến mô-đun WiFi (được cung cấp AP riêng) không có kết nối internet nhưng khi tôi kết nối thiết bị di động với AP, Android chuyển hướng các gói của tôi trên giao diện dữ liệu di động vì nó có kết nối internet.Gửi yêu cầu qua WiFi (không có kết nối) ngay cả khi dữ liệu di động BẬT (có kết nối) trên Android M

Tôi đã sử dụng mã dưới đây để làm công việc của tôi, nhưng nó dường như không làm việc trên Android M.

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void setWifiInterfaceAsDefault() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkRequest.Builder builder = new NetworkRequest.Builder(); 
    NetworkRequest networkRequest= builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) 
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 
      .build(); 

    connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback()); 
} 

Tôi cũng đã thêm

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

trên AndroidManifest.xml của tôi và tôi đảm bảo bản thân mình rằng Settings.System.canWrite(this) trả về true nhưng vẫn không có gì.

Xin cảm ơn trước.

+0

Bạn tôi bạn đã tìm ra một giải pháp? Tôi có yêu cầu chính xác. – AppleGrew

+0

Tôi đã thực hiện giải pháp mô phỏng kết nối trên thiết bị IoT để cho phép Android nghĩ rằng thiết bị IoT có kết nối. Bạn có thể làm điều đó đặt một tập tin void gọi là generate_204 trên máy chủ gốc và thêm một số url để dns máy chủ của bạn. Tôi biết đó là một cách giải quyết kỳ lạ nhưng đối với tôi đã làm việc. Hy vọng tôi đã giúp bạn. –

+0

Cảm ơn, nhưng tiếc là đó không phải là một lựa chọn cho tôi. Thiết bị IoT không nằm trong tầm kiểm soát của tôi. – AppleGrew

Trả lời

2

Kết nối mạng bằng ConnectivityManager.setProcessDefaultNetwork() ngăn không cho chuyển vùng và cho phép truy cập TCP đầy đủ. Vì vậy, trong callback onAvailable(), bạn có thể ràng buộc quá trình ứng dụng với mạng đó thay vì mở một kết nối đến một URL cụ thể.

ConnectivityManager connection_manager = 
(ConnectivityManager) activity.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE); 

NetworkRequest.Builder request = new NetworkRequest.Builder(); 
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 

connection_manager.registerNetworkCallback(request.build(), new NetworkCallback() { 

    @Override 
    public void onAvailable(Network network) { 
     ConnectivityManager.setProcessDefaultNetwork(network); 
    } 
} 

Original answer

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