參考文章
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網絡
代碼分享
完整的代碼下載點擊這裏