手机连着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网络 

代码分享
完整的代码下载点击这里 https://download.csdn.net/download/codehxy/11465126

如何判断移动网络是否可以用
5.0以下

public static boolean isMobileEnableReflex(Context context) {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        Method getMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");
        getMobileDataEnabledMethod.setAccessible(true);
        return (Boolean) getMobileDataEnabledMethod.invoke(connectivityManager);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

5.0以上

public boolean getMobileDataState()
{
    try
    {
        TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled");

        if (null != getMobileDataEnabledMethod)
        {
            boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService);

            return mobileDataEnabled;
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Error getting mobile data state", ex);
    }

    return false;
}
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 通常情况下,安卓项目应该可以在手机上无需使用数据线运行。您需要将您的应用程序打包并安装在的手机上,这样您就可以在手机上使用它了。如果您遇到了无法在手机上运行的问题,可能是由于您的应用程序的设置或权限问题导致的。建议您仔细查看您的应用程序的设置和权限,并确保它们正确地配置和分配。如果您还有疑问,请提供更多的细节,我会尽力帮助您。 ### 回答2: 运行安卓项目需要手机与电脑连接数据线并使用软件是比较常见的情况,但是否正常取决于具体的应用场景和需求。以下是可能的情况: 一种情况是开发者在进行安卓应用程序开发的过程中,需要通过电脑上的开发工具来运行和测试应用程序,这种情况下,手机需要通过数据线与电脑连接。开发者可以通过该数据线连接方式在开发工具中进行代码的调试和布局的调整,以便实查看应用程序在手机上的运行情况。这在开发和调试阶段是正常的操作流程。 另一种情况是普通用户在正常使用手机过程中需要连接数据线并使用软件。这种情况下,可能是由于用户的手机存在某些故障或限制,导致无法正常使用软件或进行某些操作。连接数据线并使用软件是一种临的解决方案,以便通过电脑上的软件对手机进行维修或修复。但正常情况下,应该是不需要通过数据线和软件来操作手机的。 综上所述,运行安卓项目需要通过数据线连接手机并使用软件,这取决于具体的应用场景和需求。在开发和调试阶段,这是正常的操作流程。而在普通用户正常使用手机的情况下,是不需要通过数据线和软件来操作手机的,因为手机应该能够独立运行应用程序。 ### 回答3: 运行的安卓项目只能通过数据线连接手机并使用软件,属于一种正常的情况。在开发和调试阶段,连接手机使用数据线是常见的做法,可以直接在开发环境中运行和测试应用程序。通过数据线连接,可以实查看应用程序的运行情况,并在需要的候进行调试和修改。此外,通过数据线连接手机还可以方便地将应用程序安装在手机上,进行更加真实和全面的测试。在其他一些应用场景下,如使用一些特殊的调试工具或软件,连接手机通过数据线使用软件也是必要的。总之,通过数据线连接手机使用软件是开发和测试过程中的一种常见方式,可以有效地提高开发效率和保证应用程序的质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值