将Android设备连接到WiFi编程,无需用户交互

lf3rwulv  于 2023-02-27  发布在  Android
关注(0)|答案(2)|浏览(205)

我需要在不与用户交互的情况下以编程方式将Android设备连接到WiFi。值得注意的是,这款应用是专门打造的,不会出现在Play商店或公开部署(我这么说是因为我需要做的事情可能会有严重的安全隐患)。
下面是我如何以编程方式连接设备

TextView textFeedback = findViewById(R.id.text);

ConnectivityManager.NetworkCallback wifiConnectionCallback = new ConnectivityManager.NetworkCallback(){
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
        Log.e(logTAG, "wifi connected");
        textFeedback.setText("wifi connected");
    }

    @Override
    public void onLosing(@NonNull Network network, int maxMsToLive) {
        super.onLosing(network, maxMsToLive);
        Log.e(logTAG, "losing wifi connection");
        textFeedback.setText("losing wifi connection");
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
        Log.e(logTAG, "lost wifi connection");
        textFeedback.setText("lost wifi connection");
    }

    @Override
    public void onUnavailable() {
        super.onUnavailable();
        Log.e(logTAG, "user closed wifi connection");
        textFeedback.setText("user closed wifi connection");
    }
};

// instantiate connectivity manager
ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(this.CONNECTIVITY_SERVICE);

// connect to phl via wifi
Thread wifiConnectionThread = new Thread(new Runnable()
{
    @Override
    public void run()
    {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
        {
            NetworkSpecifier networkSpecifier  = new WifiNetworkSpecifier.Builder()
                        .setSsid(ssid)
                        .build();
            NetworkRequest networkRequest  = new NetworkRequest.Builder()
                        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                        .setNetworkSpecifier(networkSpecifier)
                        .build();
            connectivityManager.requestNetwork(networkRequest, wifiConnectionCallback);
        }
    }
});
wifiConnectionThread.start();

这个功能运行良好,但有一个例外。它会提示用户询问他们是否要连接到网络。这是有问题的,因为即使没有用户,我也需要设备连接(因此需要以编程方式来完成此操作,通常不会有用户在场)。(最好不需要对设备进行root)?例如,是否可以进行设置,使用户只被提示一次,从那一刻起就是自动的?

fzsnzjdm

fzsnzjdm1#

几年前,我在开发一个小型网关以收集BLE传感器的数据并通过Wi-Fi将其推送到后端时遇到了完全相同的问题。
当时我使用了GitHub中公开的一个小库,叫做WifiUtils,你可以在this link下面找到这个库。
它使用起来非常简单,你可以从GitHub的www.example.com上获得很多信息README.md。
启用Wi-Fi:

WifiUtils.withContext(getApplicationContext()).enableWifi();

扫描Wi-Fi网络:

WifiUtils.withContext(getApplicationContext()).scanWifi(this::getScanResults).start();

private void getScanResults(@NonNull final List<ScanResult> results)
{
    if (results.isEmpty())
    {
        Log.i(TAG, "SCAN RESULTS IT'S EMPTY");
        return;
    }
    Log.i(TAG, "GOT SCAN RESULTS " + results);
}

最后和他们联系起来:

WifiUtils.withContext(getApplicationContext())
    .connectWith("JohnDoeWiFi", "JohnDoePassword")
    .setTimeout(40000)
    .onConnectionResult(new ConnectionSuccessListener() {
        @Override
        public void success() {
            Toast.makeText(MainActivity.this, "SUCCESS!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void failed(@NonNull ConnectionErrorCode errorCode) {
            Toast.makeText(MainActivity.this, "EPIC FAIL!" + errorCode.toString(), Toast.LENGTH_SHORT).show();
        }
    })
    .start();

因为这个库的所有代码都在GitHub中,你可能会在那里找到更多的信息。

ckocjqey

ckocjqey2#

很抱歉你不能这么做...
实际Android设备连接的最佳解决方案是启动意图打开WiFi设置并观察当前WiFi网络。
要启用WiFi,您必须询问用户!!!

相关问题