以编程方式将安卓设备连接到 wifi,无需用户交互

问题描述 投票:0回答:2

我需要在不与用户交互的情况下以编程方式将 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();

除了一个例外,这工作得很好。它会提示用户询问他们是否愿意连接到网络。这是有问题的,因为即使没有用户,我也需要连接设备(因此需要以编程方式执行此操作,周围通常不会有用户)。有没有办法做到这一点(最好不要生根设备)?例如,是否可以将其设置为仅提示用户一次,并且从那时起它是自动的?

android android-permissions android-wifi
2个回答
1
投票

几年前,我在开发一个小型网关以从我们的 BLE 传感器收集数据并通过 Wi-Fi 将其推送到我们的后端时遇到了完全相同的问题。

当时我用的是GitHub上公开的一个小库,叫WifiUtils。您可以在此链接之后找到该库。

使用起来非常简单,您可以从 GitHub 的 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 中,您可能会在那里找到更多信息。


0
投票

对不起你不能这样做...

实际Android设备连接的最佳解决方案是启动意图打开WiFi设置并观察当前的WiFi网络。

要启用 WiFi,您必须向用户询问!!!

© www.soinside.com 2019 - 2024. All rights reserved.