Android WiFi не може да получи SSID и BSSID от ScanResult

Получих този код, който искам да сканирам за мрежите и след това да го запиша в списъка. Но проблемът е, че ssid и bssid не се показват. Всичко друго се показва, но не и ssid.

Освен това кой е най-добрият начин за актуализиране на списъка всяка секунда, за да можете да видите силата на сигнала действителния сигнал?

import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.wifi.R;

public class MainActivity extends Activity {

    WifiManager wifiManager;
    WifiScanReceiver wifiReciever;
    ListView list;
    String wifis[];
    WifiInfo wifiInfo;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = (ListView) findViewById(R.id.text);
        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiReciever = new WifiScanReceiver();
        wifiInfo = wifiManager.getConnectionInfo();
        wifiManager.startScan();
    }



    protected void onPause() {
        unregisterReceiver(wifiReciever);
        super.onPause();
    }

    protected void onResume() {
        registerReceiver(wifiReciever, new IntentFilter(
                WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        super.onResume();
    }

    class WifiScanReceiver extends BroadcastReceiver {
        @SuppressLint("UseValueOf")
        public void onReceive(Context c, Intent intent) {
            List<ScanResult> wifiScanList = wifiManager.getScanResults();
            wifis = new String[wifiScanList.size()];
            for (int i = 0; i < wifiScanList.size(); i++) {
                wifis[i] = ((wifiScanList.get(i)).toString());
            }

            list.setAdapter(new ArrayAdapter<String>(getApplicationContext(),
                    android.R.layout.simple_list_item_1, wifis));
        }
    }
}

person Isac    schedule 20.04.2015    source източник
comment
ако имате обект networkConfig, можете да получите неговия ssid   -  person KOTIOS    schedule 20.04.2015
comment
използвай wifiInfo.getSSID();   -  person Strider    schedule 20.04.2015
comment
да, знам, но това сканира всички мрежи, така че когато сложа wifiInfo.getSSID(); Получавам само 1 wifi име, също съм свързан, вместо името на всички мрежи.   -  person Isac    schedule 20.04.2015


Отговори (1)


Можете да получите SSID и BSSID от обекта ScanResult, като използвате wifiScanList.get(i).SSID и wifiScanList.get(i).BSSID. След това просто го добавете към другите данни, върнати от toString().

Вижте Документация тук.

Първо, декларирайте вашия ArrayAdapter като променлива на екземпляр и извикайте setAdapter() в onCreate():

ArrayAdapter adapter;
ListView list;
ArrayList<String> wifis;
WifiInfo wifiInfo;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    list = (ListView) findViewById(R.id.text);
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    wifiReciever = new WifiScanReceiver();
    wifiInfo = wifiManager.getConnectionInfo();

    wifis = new ArrayList<String>(); //initialize wifis
    wifis.add("loading...");
    adapter = new ArrayAdapter<String>(getApplicationContext(),
                        android.R.layout.simple_list_item_1, wifis)
    list.setAdapter(adapter);

    wifiManager.startScan(); //make sure this is the last call
}

Променено BroadcastReceiver:

class WifiScanReceiver extends BroadcastReceiver {
        @SuppressLint("UseValueOf")
        public void onReceive(Context c, Intent intent) {
            List<ScanResult> wifiScanList = wifiManager.getScanResults();
            //wifis = new String[wifiScanList.size()]; //remove this
            wifis.clear(); //add this
            for (int i = 0; i < wifiScanList.size(); i++) {
                String ssid = wifiScanList.get(i).SSID; //Get the SSID
                String bssid =  wifiScanList.get(i).BSSID //Get the BSSID
                //use add here:
                wifis.add( ssid + " " + bssid + " " +((wifiScanList.get(i)).toString()) ); //append to the other data
            }

            adapter.notifyDataSetChanged(); //add this
            wifiManager.startScan(); //start a new scan to update values faster

            //ArrayAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),
             //       android.R.layout.simple_list_item_1, wifis)
            //list.setAdapter(adapter);
        }
    }

Това пак ще се актуализира само при всеки резултат от сканиране. Не мисля, че е препоръчително да актуализирате ListView всяка секунда, може да искате да преосмислите подхода си за показване на RSSI нива. Можете да имате едно щракване за всеки SSID и да имате подробен изглед с TextView, където актуализирате RSSI всяка секунда за текущия SSID.

person Daniel Nugent    schedule 20.04.2015
comment
Благодаря, това работи :) кой е най-добрият начин да продължите да актуализирате списъка за действителни стойности? - person Isac; 20.04.2015
comment
Получавам това съобщение E/AndroidRuntime﹕ ФАТАЛНО ИЗКЛЮЧЕНИЕ: main java.lang.RuntimeException: Не може да се започне дейност. От линейния адаптер = нов ArrayAdapter‹String›(getApplicationContext(), android.R.layout.simple_list_item_1, wifis); - person Isac; 20.04.2015
comment
редактирах кода си и получих двете декларирани като променливи на екземпляр и setcontentview :S - person Isac; 20.04.2015
comment
Какво обаждане трябва да има след списъка? защото все още получавам грешки :S - person Isac; 20.04.2015
comment
сега това е само низът за зареждане през цялото време, вече не мога да видя никакви мрежи - person Isac; 20.04.2015
comment
това работи :) благодаря много. Бърз въпрос, ако имате време, как можете да решите какъв е резултатът от сканирането? Например искам да премахна клеймото за време, което е вътре в сканирането. Как мога да направя това? - person Isac; 20.04.2015
comment
@Isac Ще трябва да не използвате toString() и просто да извлечете данните, от които се нуждаете, от ScanResult обекта. Разгледайте документацията в линка. - person Daniel Nugent; 20.04.2015