手機連着wifi時優先用4G訪問網絡

參考文章
https://blog.csdn.net/qq_32120667/article/details/77834469
https://blog.csdn.net/u010019468/article/details/72886859
代碼說明
權限申請 <uses-permission android:name="android.permission.WRITE_SETTINGS"/>申請權限方式如下

 //    https://stackoverflow.com/questions/32083410/cant-get-write-settings-permission/32083622#32083622
    public void youDesirePermissionCode(Activity context) {
        Log.e("##########test", "-----youDesirePermissionCode------");

        boolean permission;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            permission = Settings.System.canWrite(context);
        } else {
            permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
        }
        if (permission) {
            //do your code
            work_main();
        } else {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                context.startActivityForResult(intent, MainActivity.CODE_WRITE_SETTINGS_PERMISSION);
            } else {
                ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, MainActivity.CODE_WRITE_SETTINGS_PERMISSION);
            }
        }
    }

選擇4G優先的代碼

				NetworkRequest.Builder builder = new NetworkRequest.Builder();

                // 設置指定的網絡傳輸類型(蜂窩傳輸) 等於手機網絡
                builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

                // 設置感興趣的網絡功能
                builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

                // 設置感興趣的網絡:計費網絡
                // builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);

                NetworkRequest request = builder.build();
                ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {


                    /**
                     * Called when the framework connects and has declared amx new network ready for use.
                     * This callback may be called more than once if the {@link Network} that is
                     * satisfying the request changes.
                     *
                     */
                    @TargetApi(Build.VERSION_CODES.M)
                    @Override
                    public void onAvailable(Network network) {
                        super.onAvailable(network);
                        Log.i("test", "已根據功能和傳輸類型找到合適的網絡");

                        // 可以通過下面代碼將app接下來的請求都綁定到這個網絡下請求
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            connectivityManager.bindProcessToNetwork(network);
                        } else {
                            // 23後這個方法捨棄了
                            ConnectivityManager.setProcessDefaultNetwork(network);
                        }

                        // 也可以在將來某個時間取消這個綁定網絡的設置
                        // if (Build.VERSION.SDK_INT >= 23) {
                        //      onnectivityManager.bindProcessToNetwork(null);
                        //} else {
                        //     ConnectivityManager.setProcessDefaultNetwork(null);
                        //}

                        UiHandler.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    Log.e("##########test", "----loadUrl----");
                                    webView.loadUrl("https://m.baidu.com/from=1019023c/s?word=ip&ts=5299444&t_kt=0&ie=utf-8&fm_kl=5b36a6c8a7&rsv_iqid=0487751263&rsv_t=3a5cqEKIiwgQkhwUieQ2%252FLzJXKWceNBHmA78%252FYd6XdGu8nFD3WRIEUtWAqHdbW8&sa=ib&rsv_pq=0487751263&rsv_sug4=2833&ss=110000000001&inputT=875&tj=1");
                                    addContentView(webView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        });


                        //                    connectivityManager.unregisterNetworkCallback(this);
                        // 只要一找到符合條件的網絡就註銷本callback
                        // 你也可以自己進行定義註銷的條件
                    }


                    public void onUnavailable() {
                        super.onUnavailable();
                        Log.e("##########test", "onUnavailable");
                    }

                    public void onLost(Network network) {
                        Log.e("##########test", "onLost");
                    }
                };
                connectivityManager.requestNetwork(request, callback);
            }

測試方法

4G下 chrome 百度ip是 223.111.66.89
4g+wifi    chrome 百度ip是 119.137.52.187
4g+wifi   app顯示ip是 223.111.66.89
只連4g   app顯示ip是 223.111.66.89
只連wifi    app顯示沒有找到4g網絡 

代碼分享
完整的代碼下載點擊這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章