0
点赞
收藏
分享

微信扫一扫

【uni-app】基于uni-app的Android离线打包,wifi物联网

豆丁趣 2022-04-23 阅读 165
android

背景:公司有款产品内置wifi模块,需要Android端提供接口供前端uni-app去调用。主要功能分为开启wifi、关闭wifi、连接wifi。

重点:以下会涉及Android10以下以及Android10(包括harmony系统)以上的连接方法。

1.首先判断有没有开启wifi,未开启则提示开启(同)

//判断wifi开启和关闭
    public boolean isWifi() {
        WifiManager wifiManager = (WifiManager) 
                                  getApplicationContext().getSystemService(WIFI_SERVICE);

        if(wifiManager.isWifiEnabled()) {
            return true;
        } else {
            return false;
        }
    }

2.开启连接指定的目标wifi(异)

(1)Android10以下连接方法,首先获取前端传入的两个参数,分别是wifi名称和wifi密码

//Android 10 以下版本wifi连接
    public boolean linkWifi(String ssid, String pass) {

        WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);

        WifiConfiguration conf = new WifiConfiguration();

        //如果有连接隐藏wifi需求的话,增加conf.hiddenSSID = true这句代码,加上此句则可以检索到隐藏wifi
        //conf.hiddenSSID = true;

        conf.SSID = "\"" + networkSSID + "\"";

        //对于WPA网络密码采用以下输入方式
        conf.preSharedKey = "\"" + networkPass + "\"";
        wifiManager.addNetwork(conf);
        @SuppressLint("MissingPermission") List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for (WifiConfiguration i : list) {
            if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
                wifiManager.disconnect();
                wifiManager.enableNetwork(i.networkId, true);
                wifiManager.reconnect();
                break;
            }
        }
        return true;
    }

(2)Android10以上连接方法(P2P),首先获取前端传入的两个参数,分别是wifi名称和wifi密码

public boolean linkWifi (String ssid, String pass) throws InterruptedException{
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
        {
            NetworkSpecifier specifier =
                    new WifiNetworkSpecifier.Builder()
                            .setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX))
                            .setWpa2Passphrase(pass)
                            .build();

            NetworkRequest request =
                    new NetworkRequest.Builder()
                            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                            .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                            .setNetworkSpecifier(specifier)
                            .build();

            ConnectivityManager connectivityManager = (ConnectivityManager)
                    getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

            ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    //表示使用该网络
                    connectivityManager.bindProcessToNetwork(network);
                }

                @Override
                public void onUnavailable() {
                    return;
                }
            };
            connectivityManager.requestNetwork(request, networkCallback);
            // Release the request when done.
            // connectivityManager.unregisterNetworkCallback(networkCallback);
        }
        return true;
    }

3.断开当前所连接的wifi

    @RequiresApi(api = Build.VERSION_CODES.M)
    public boolean recoverywifi ()
    {
        //Android 10 以上断开方法
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            ConnectivityManager connectivityManager =(ConnectivityManager)
                    getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            connectivityManager.bindProcessToNetwork(null);
            WifiManager wifiManager = (WifiManager) 
                            getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            wifiManager.disconnect();
        }
        else{
            //Android 10 以下断开方法
            WifiManager wifiManager = 
               (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            wifiManager.disconnect();
        }
        return true;
    }

小结:Android10以上的手机调用连接wifi代码的时候都会出现弹窗,需要用户允许才能连接目标wifi,属于正常现象。硬件的配置、手机的性能、信号的强弱都会对连接wifi的速度有影响,所以连接过程中检索转圈属于正常现象。

举报

相关推荐

0 条评论