有没有一种新的方法或方式来扫描访问点而不是WifiManager.StartScan?

问题描述

WifiManager.StartScan已在API 28中弃用 https://developer.android.com/reference/android/net/wifi/WifiManager#startScan()

你好! 我的应用程序需要使用WifiManager.StartScan()要求扫描附近的访问点,但它已正常工作,但是现在我将targetSdkVersion和compileSdkVersion更改为API 29 i不再起作用。有没有其他方法可以做到这一点?该应用程序只需要显示在家中的SSID即可选择它,并将该数据发送到设备(IoT),它将尝试与他们的接入点连接。该代码适用于targetSdkVersion 28

final WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        final List<ScanResult> results = new ArrayList<>();

        wiFiScanResultsbroadcast = new broadcastReceiver() {
            @Override
            public void onReceive(Context context,Intent intent) {
                for (ScanResult temp : wifiManager.getScanResults()){
                    if(!results.contains(temp)){
                        results.add(temp);
                    }
                }
            }
        };

        registerReceiver(wiFiScanResultsbroadcast,new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

        wifiManager.startScan();

        if(cdt1 != null) cdt1.cancel();

        ArrayAdapter<String> arrayAdapter2 = new ArrayAdapter<>(context,android.R.layout.simple_list_item_1);
        arrayAdapter2.add("Buscando Puntos de Acceso...");
        spinner.setAdapter(arrayAdapter2);

        cdt1 = new CountDownTimer(8000,8000) {
            @Override
            public void onTick(long l) {

            }

            @Override
            public void onFinish() {

                findViewById(R.id.reloadAPView).clearanimation();
                final Spinner spinner = (Spinner) findViewById(R.id.spinneRSSID);

                final ArrayAdapter<String> arrayAdapter3 = new ArrayAdapter<>(context,android.R.layout.simple_list_item_1);
                final int[] select = {0};

            /*if(results != null && results.size() == 1 && results.get(0).SSID.isEmpty()){
                results.clear();
            }*/

                if(results != null && results.size() > 0){

                    Collections.sort(results,new Comparator<ScanResult>() {                                   // Se ordenan los resultados de mayor a menor intensidad de señal.
                        @Override
                        public int compare(ScanResult lhs,ScanResult rhs) {
                            if(lhs.level > rhs.level){
                                return -1;
                            }else if(lhs.level < rhs.level){
                                return 1;
                            }else{
                                return 0;
                            }
                        }
                    });

                    for(ScanResult ap : results){

                        if(!ap.SSID.toString().startsWith("SmartHeat_")
                                && !ap.SSID.toString().startsWith("miCalorex_")
                                && !ap.SSID.toString().isEmpty()){
                            Log.d("SSID",":"+ap.SSID);
                            if(ap.frequency > 3000){
                                arrayAdapter3.add(ap.SSID + " (5GHz)");
                            }else{
                                arrayAdapter3.add(ap.SSID);
                            }
                        }
                    }
                }

                if(arrayAdapter3.getCount() <= 0){
                    arrayAdapter3.clear();
                    arrayAdapter3.add("No se encontraron redes");
                }

                spinner.setAdapter(arrayAdapter3);
                spinner.setSelection(0);
                /*if(arrayAdapter2.getCount() > 0){

                    boolean selectedOk = false;
                    for(int i = 0; i < arrayAdapter2.getCount(); i++){
                        if(!arrayAdapter2.getItem(i).contains("5GHz")){
                            spinner.setSelection(i);
                            selectedOk = true;
                            break;
                        }
                    }

                    if(!selectedOk){
                        spinner.setSelection(0);
                    }
                }*/
                spinner.setonItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> adapterView,View view,int i,long l) {
                        if(!adapterView.getItemAtPosition(i).toString().contains("Buscando Puntos de Acceso") &&
                                !adapterView.getItemAtPosition(i).toString().contains("No se encontraron redes")){
                            selectedAP[0] = adapterView.getItemAtPosition(i).toString();
                            verifiSsid(selectedAP);
                        }
                    }

                    @Override
                    public void onnothingSelected(AdapterView<?> adapterView) {

                    }
                });

            }
        };
        cdt1.start();

我用API 28得到此结果,相反,我在ScanResult temp中得到空响应:wifiManager.getScanResults() debug

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)