Question

I am trying to make an apps that will store all wifi BSSID and RSS into an SQLite Database. (my SQLite table named "scanres"

here is part of my code on my onCreate():

wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); //jgn lupa manifest xml nya kasih permission!!!
    if (wifi.isWifiEnabled() == false)
    {
        wifi.setWifiEnabled(true);
    }   

    x = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context c, Intent intent) 
        {
            results = wifi.getScanResults();
            size = results.size();
            if (size > 0) {
                for (int i=0; i<size; i++){
                    ScanResult scanresult = wifi.getScanResults().get(i);
                    int rssi = scanresult.level;
                    String bssid = scanresult.BSSID;
                    datavar.execSQL("insert into scanres values('"+bssid+"',"+rssi+")");
                }
                unregisterReceiver(x); //stops the continuous scan
            } else {
                unregisterReceiver(x); 
                Toast.makeText(SearchActivity.this, "FAIL", Toast.LENGTH_LONG).show();
            }
        }
    };

    //wifiscan start
    new wifiscan1().execute();

and here is my wifiscan1 , I'm using AsyncTask:

public class wifiscan1 extends AsyncTask<Void, String, Void>{
    ProgressDialog pd = new ProgressDialog (SearchActivity.this);

    protected void onPreExecute(){
        pd.setMessage("wifi scan...");
        pd.setIndeterminate(true);
        pd.show();
    }

    protected void onPostExecute(Void result){
        pd.dismiss();
    }

    @Override
    protected Void doInBackground(Void... params){
        registerReceiver(x, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        wifi.startScan();
        return null;
    }
}

I want to make this app to scan for 12 times in a row. I tried using for loop , but the next scan already started before the current scan is done, causing the current scan to be skipped.

how do I make the next scan to be started after the previous scan is done?

UPDATE: my logcat

05-08 16:10:42.869: E/Database(15427):  at com.arranda.insidefek.SearchActivity.onCreate(SearchActivity.java:44)
05-08 16:11:00.919: E/Database(15427):  at com.arranda.insidefek.SearchActivity.onCreate(SearchActivity.java:44)
05-08 16:15:19.239: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:152)
05-08 16:15:19.239: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.249: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:153)
05-08 16:15:19.249: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.269: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:152)
05-08 16:15:19.269: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.269: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:153)
05-08 16:15:19.269: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.289: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:152)
05-08 16:15:19.289: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.299: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:153)
05-08 16:15:19.299: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.309: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:152)
05-08 16:15:19.309: E/Database(15682):  at com.arranda.insidefek.SearchActivity$wifiscan1.doInBackground(SearchActivity.java:1)
05-08 16:15:19.329: E/Database(15682):  at com.arranda.insidefek.SearchActivity.onCreate(SearchActivity.java:44)
05-08 16:15:19.819: E/AndroidRuntime(15682): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$wifiscan1$1@40573ba8
05-08 16:15:19.819: E/AndroidRuntime(15682): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.arranda.insidefek.SearchActivity$wifiscan1$1@40573ba8
05-08 16:15:19.819: E/AndroidRuntime(15682):    at com.arranda.insidefek.SearchActivity$wifiscan1$1.onReceive(SearchActivity.java:174)
05-08 16:15:26.099: E/AndroidRuntime(15700): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$wifiscan1$1@4054f2d8
05-08 16:15:26.099: E/AndroidRuntime(15700): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.arranda.insidefek.SearchActivity$wifiscan1$1@4055b3a0
05-08 16:15:26.099: E/AndroidRuntime(15700):    at com.arranda.insidefek.SearchActivity$wifiscan1$1.onReceive(SearchActivity.java:174)
05-08 16:15:33.499: E/AndroidRuntime(15711): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$wifiscan1$1@40541cd0
05-08 16:15:33.499: E/AndroidRuntime(15711):    at com.arranda.insidefek.SearchActivity$wifiscan1$1.onReceive(SearchActivity.java:169)
05-08 16:15:40.329: E/AndroidRuntime(15721): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$wifiscan1$1@40559ae8
05-08 16:15:40.329: E/AndroidRuntime(15721): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.arranda.insidefek.SearchActivity$wifiscan1$1@40559ae8
05-08 16:15:40.329: E/AndroidRuntime(15721):    at com.arranda.insidefek.SearchActivity$wifiscan1$1.onReceive(SearchActivity.java:174)
05-08 16:16:23.159: E/AndroidRuntime(15792): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$wifiscan1$1@40559988
05-08 16:16:23.159: E/AndroidRuntime(15792): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.arranda.insidefek.SearchActivity$wifiscan1$1@40559988
05-08 16:16:23.159: E/AndroidRuntime(15792):    at com.arranda.insidefek.SearchActivity$wifiscan1$1.onReceive(SearchActivity.java:173)
05-08 16:18:01.519: E/Database(15901):  at com.arranda.insidefek.SearchActivity.onCreate(SearchActivity.java:44)
05-08 16:18:02.559: E/AndroidRuntime(15901): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$1@40532608
05-08 16:18:02.559: E/AndroidRuntime(15901):    at com.arranda.insidefek.SearchActivity$1.onReceive(SearchActivity.java:86)
05-08 16:18:09.689: E/Database(15915):  at com.arranda.insidefek.SearchActivity.onCreate(SearchActivity.java:44)
05-08 16:18:09.919: E/AndroidRuntime(15915): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.arranda.insidefek.SearchActivity$1@40532650
05-08 16:18:09.919: E/AndroidRuntime(15915):    at com.arranda.insidefek.SearchActivity$1.onReceive(SearchActivity.java:86)
Was it helpful?

Solution 2

well, the problem is solved by myself. what i do is just put the wifi.startScan() on the onRecieve() method and with the help from an integer named count

so my code is look like this now:

x = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context c, Intent intent) 
            {
                datavar.execSQL("delete from hasilscan");
                results = wifi.getScanResults();
                size = results.size();
                if (size > 0) {
                    for (int i=0; i<size; i++){
                        ScanResult scanresult = wifi.getScanResults().get(i);
                        int rssi = scanresult.level;
                        String bssid = scanresult.BSSID;
                        datavar.execSQL("insert into hasilscan values('"+bssid+"',"+rssi+")");
                    }
                    count++;
                    if (count < 12) { //because i want the wifi scan to be repeated 12 times in a row
                        wifi.startScan();
                    } else {
                        unregisterReceiver(x); //stops the continuous scan  
                    }
                } else {
                    unregisterReceiver(x); 
                    Toast.makeText(MainActivity.this, "FAIL", Toast.LENGTH_LONG).show();
                }
            }
        };

with this code, the new scan is started after the previous scan is done so it wont interrupt the previous scan

OTHER TIPS

In the onPostExecute() of the AsyncTask, check whether the required result is achieved. If you want to run the task again, then call the AsyncTask again in the onPostExecute() method.

For e.g:

int i = 0;
public class wifiscan1 extends AsyncTask<Void, String, Void>{
    ProgressDialog pd = new ProgressDialog (SearchActivity.this);

    protected void onPreExecute(){
        pd.setMessage("wifi scan...");
        pd.setIndeterminate(true);
        pd.show();
    }

    protected void onPostExecute(Void result){
        pd.dismiss();
        if(result){
            if(i < 12) {
                new wifiscan1().execute();
            }
        }
    }

    @Override
    protected Void doInBackground(Void... params){
        registerReceiver(x, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        wifi.startScan();
        return null;
    }
}

As AsyncTasks run in the background thread, the processes run in main UI thread couldn't control the working of background thread. So you have to call AsyncTask instance again as soon as one is completed.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top