【问题标题】:Android not connecting to WIFI ProgrammaticallyAndroid未以编程方式连接到WIFI
【发布时间】:2021-04-15 18:30:16
【问题描述】:
 package com.example.wifiscanner;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.telecom.Connection;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;


public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {

    private WifiManager wifiManager;
    private ListView listView;
    private Button button;
    private int size = 0;
    private List<ScanResult> results;
    private ArrayList<String> arrayList = new ArrayList<>();
    private ArrayAdapter arrayAdapter;
    private String ssid = "SLT-FIBRE";
    private String password = "VMEKF27*";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                scanWifi();
            }
        });

        listView = findViewById(R.id.listview);
        wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);

        if (!wifiManager.isWifiEnabled()) {

            Toast.makeText(this, "Wifi is disabled", Toast.LENGTH_SHORT).show();
            wifiManager.setWifiEnabled(true);

        }

        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
        listView.setAdapter(arrayAdapter);

        ConnectToNetworkWPA(ssid,password);
        scanWifi();


    }

    public void startScan() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                scanWifi();
            }
        }, 5 * 1000);
    }


    @AfterPermissionGranted(123)
    public void scanWifi() {

        String[] perm = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE};

        if (EasyPermissions.hasPermissions(this, perm)) {

            arrayList.clear();
            registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
            boolean scanStarted = wifiManager.startScan();

            if (scanStarted) {
                Toast.makeText(this, "Scanning true", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Scanning false", Toast.LENGTH_SHORT).show();
            }

            Toast.makeText(this, "PERMISSIONS HAVE BEEN GRANTED", Toast.LENGTH_SHORT).show();


        } else {

            EasyPermissions.requestPermissions(this, "WE REQUIRE THESE PERMISSIONS FOR THE APP TO FUNCTION", 123, perm);
        }

    }


    BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            results = wifiManager.getScanResults();

            unregisterReceiver(this);

            for (ScanResult scanResult : results) {
                arrayList.add(" " + scanResult.SSID + "   " + scanResult.frequency + "    " + scanResult.level + "   " + scanResult.BSSID);
                arrayAdapter.notifyDataSetChanged();


            }

        }

    };

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

    }

    @Override
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {

        scanWifi();
    }

    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {

        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            new AppSettingsDialog.Builder(this).build().show();
        }

    }

    public void ConnectToNetworkWPA(String SSID, String password) {
        try {
            WifiConfiguration conf = new WifiConfiguration();
            conf.SSID = "\"" + SSID + "\"";   // Please note the quotes. String should contain SSID in quotes

            conf.preSharedKey = "\"" + password + "\"";

            conf.status = WifiConfiguration.Status.ENABLED;
            conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);


            WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            int networkId = wifiManager.addNetwork(conf);

            Log.d("connecting", conf.SSID + " " + conf.preSharedKey);
            Log.d("after connecting", conf.SSID + " " + conf.preSharedKey);


            wifiManager.disconnect();
            wifiManager.enableNetwork(networkId, true);
            wifiManager.reconnect();
            Log.d("re connecting", SSID + " " + conf.preSharedKey);

            final NetworkRequest requestForWifi =
                    new NetworkRequest.Builder()
                            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                            .build();

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

            final ConnectivityManager.NetworkCallback  networkCallbackWifi = new ConnectivityManager.NetworkCallback(){

                @Override
                public void onAvailable(@NonNull Network network) {

                    
                }

                @Override
                public void onLost(@NonNull Network network) {

                    
                }
            };

            connectivityManager.requestNetwork(requestForWifi, networkCallbackWifi);



        } catch (Exception ex) {
            ex.getMessage();
            ex.printStackTrace();


        }
    }

    public void BroadCast() {

        if (wifiManager.isWifiEnabled()) {
            wifiManager.setWifiEnabled(false);
        }

        WifiConfiguration netConfig = new WifiConfiguration();

        netConfig.SSID = "HM3355";
        netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
        netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

        try {
            Method setWifiApMethod = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            boolean apstatus = (Boolean) setWifiApMethod.invoke(wifiManager, netConfig, true);

            Method isWifiApEnabledmethod = wifiManager.getClass().getMethod("isWifiApEnabled");
            while (!(Boolean) isWifiApEnabledmethod.invoke(wifiManager)) {
            }
            ;
            Method getWifiApStateMethod = wifiManager.getClass().getMethod("getWifiApState");
            int apstate = (Integer) getWifiApStateMethod.invoke(wifiManager);
            Method getWifiApConfigurationMethod = wifiManager.getClass().getMethod("getWifiApConfiguration");
            netConfig = (WifiConfiguration) getWifiApConfigurationMethod.invoke(wifiManager);
            Log.e("CLIENT", "\nSSID:" + netConfig.SSID + "\nPassword:" + netConfig.preSharedKey + "\n");

        } catch (Exception e) {

            Log.e(this.getClass().toString(), "", e);

        }

    }
}

         

我正在尝试以编程方式将我的 android 应用程序连接到我的 esp32 wifi 芯片,但它不起作用。代码编译和运行没有问题,但它没有连接到指定的网络。没有显示错误,即使我在调试时看到 ssid 和密码正确通过方法但不明白为什么它无法连接到 esp32 ,当我使用这些凭据时我的电脑可以连接。

【问题讨论】:

    标签: android esp32


    【解决方案1】:

    您当前拥有的内容将为 Wi-Fi 网络设置凭据和连接,但如果该网络没有未完成的请求,Android 的网络部分会将其拆除(或永远不会启动)。

    如果您还想启动 Wi-Fi 网络,您需要像现在一样设置凭据并请求 Wi-Fi,如下所示:

    final NetworkRequest requestForWifi =
      new NetworkRequest.Builder()
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
      .build();
    
    final ConnectivityManager connectivityManager = (ConnectivityManager)
      context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
    final NetworkCallback networkCallbackWifi = new NetworkCallback() {
      @Override
      void onAvailable(Network network) {
          // Once this callback triggers, you've connected to Wi-Fi
          Toast.makeText(context, "CONNECTED TO TRD", Toast.LENGTH_SHORT).show();
      }
    
      @Override
      void onLost(Network network) {
          // Triggers when this network is lost.
          Toast.makeText(context, "NOT CONNECTED TO TRD", Toast.LENGTH_SHORT).show();
      }
    };
    
    connectivityManager.requestNetwork(requestForWifi, networkCallbackWifi);
    

    最后,像这样将这个方法签名更改为 void 并删除之前的 boolean 返回值周围的任何逻辑:

    public void ConnectToNetworkWPA(String networkSSID, String password)
    

    networkCallbackWifi#onAvailable 回调触发之前,您不会知道您已连接,因此让其他方法返回 true/false 是不正确的。

    【讨论】:

    • 我是这样添加的
    • 不,我遇到了问题。请参阅我将您给我的代码添加到“连接到 WPA 方法”中,我希望这是正确的。接下来,代码编译并运行没有错误,但没有按预期工作。我们可以为此添加一个检查并启用 wifi 吗?
    • 哦,是wifi被禁用的问题吗?你能在设备上启用wifi,然后看看代码是否按预期工作吗?
    • 这样我们可以在添加代码之前确认启用 wi-fi 将解决问题。
    • 我确保在设备上启用了 wifi 但仍然是相同的结果,我认为问题在于我的代码执行方式,请你运行它吗? .另外我在添加您的建议后将代码重新发布在顶部,请检查是否正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多