新闻开始前的Android应用程序扫描

时间:2014-07-28 21:59:18

标签: android

我还发布了Android爱好者,不确定它是否正确的位置..

我们已经创建了一个应用程序来扫描wifi热点/ AP,因此我们可以读取SSID和RSSI。我们有一些打开热点的测试手机,并将SSID硬编码到应用程序中。当APP首次启动时,一切正常,我们点击AP(复选框)并点击开始(按钮)。当我们关闭应用并再次启动它时,只要我们点击AP(复选框)它就开始扫描甚至虽然我们没有点击开始按钮。我们每次都需要在手机上重新安装应用程序。任何人都可以帮助我们解决这个BUG /不需要的功能,因为它会减慢我们的速度。

这是主要活动的代码。

非常感谢您的帮助。

    public class RssiMyActivity extends Activity{
    // Declare global variables
    private WifiManager mainWifiObj;
    private WifiScanReceiver wifiReciever;
    private ListView list;
    private ArrayAdapter<String> adapter;
    private List<String> ap_details = new ArrayList<String>();

    private static String ssid;
    private int testCount;
    private CheckBox a1, a2, a3, a4, a5, a6;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rssi_my);
        list = (ListView) findViewById(R.id.listView1);
        mainWifiObj = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiReciever = new WifiScanReceiver();
    // Get make a connection to database to get test count
    ReceiveFromDB receiver = new ReceiveFromDB();
    receiver.execute();

    // Update the test count
    testCount = ReceiveFromDB.getCount();
    testCount += 1;

    // Check to see what value testCount is
    Log.e("Values for testCount", String.valueOf(testCount));

    Button start;
    start = (Button) findViewById(R.id.start);
    start.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // Timer added to get new scan result once every 2 seconds
            Timer myTimer = new Timer();

            myTimer.schedule(new TimerTask()
            {
                @Override
                public void run()
                {
                    TimerMethod();
                }
            }, 0, 4000);
        }
    });

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

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

    a1 = (CheckBox) findViewById(R.id.AP1);
    a2 = (CheckBox) findViewById(R.id.AP2);
    a3 = (CheckBox) findViewById(R.id.AP3);
    a4 = (CheckBox) findViewById(R.id.AP4);
    a5 = (CheckBox) findViewById(R.id.AP5);
    a6 = (CheckBox) findViewById(R.id.AP6);
}

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

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

// Timer method to run at the same time as the main activity
private void TimerMethod()
{
    this.runOnUiThread(Timer_Tick);
}

/*
 * Runnable method add code to here to refresh at specified time
 */
private Runnable Timer_Tick = new Runnable()
{
    @Override
    public void run()
    {
        try
        {
            // start a scan of ap's
            mainWifiObj.startScan();
        }
        catch (Exception e)
        {
            e.getStackTrace();
        }
    }
};

class WifiScanReceiver extends BroadcastReceiver
{
    @SuppressLint("UseValueOf")
    public void onReceive(Context c, Intent intent)
    {
        // Clear details to refresh the screen for each new scan
        if (ap_details.size() > 0)
        {
            try
            {
                ap_details.clear();
                adapter.clear();
                adapter.notifyDataSetChanged();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        try
        {
            // Get all Objects from the scan
            List<ScanResult> wifiScanList = mainWifiObj.getScanResults();
            List<ScanResult> temp = new ArrayList<ScanResult>();

            // Run through each signal and retrieve the mac ssid rssi
            for (ScanResult aWifiScanList : wifiScanList)
            {
                StringBuilder sb = new StringBuilder();

                // Pull out the info we need
                ssid = aWifiScanList.SSID;

                // Check which ap's are selected
                if (checkDisplay())
                {
                    // Add info to StringBuilder
                    sb.append(aWifiScanList.SSID).append("\n");
                    sb.append(String.valueOf(aWifiScanList.level)).append("\n");
                    sb.append("Test: ").append(String.valueOf(testCount)).append("\n");

                    // Add to List that will be displayed to user
                    ap_details.add(sb.toString());

                    // Also add to a temporary ScanResult List to use later
                    temp.add(aWifiScanList);
                }
            }

            // Create an String Array twice the size of the temporary
            // ScanResult
            // this will be the Array to use as the parameters for sending
            // to the database
            String[] items = new String[temp.size() + temp.size() + 1];

            int num1 = 0;
            int num2 = 1;

            // Add the ssid and rssi of each object to the Array
            for (ScanResult aTemp : temp)
            {
                items[num1] = aTemp.SSID;
                items[num2] = String.valueOf(aTemp.level);

                num1 += 2;
                num2 += 2;
            }

            // Add the test value
            items[num1] = String.valueOf(testCount);

            // Pass Array to the Async method use executeOnExecutor this
            // allows for the use
            // of the Looper.prepare() method to stop app from crashing
            new ConnectToDB().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, items);

            // Display the list of all the signals on the device
            adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, ap_details);
            list.setAdapter(adapter);

        }
        catch (Exception e)
        {
            e.getStackTrace();
        }
    }
}

/*
 * Method to check which AP's are been used
 */
public boolean checkDisplay()
{
    if (a1.isChecked())
    {
        if (ssid.equalsIgnoreCase("TestPhone1"))
        {
            return true;
        }
    }
    if (a2.isChecked())
    {
        if (ssid.equalsIgnoreCase("TestPhone2"))
        {
            return true;
        }
    }
    if (a3.isChecked())
    {
        if (ssid.equalsIgnoreCase("TestPhone3"))
        {
            return true;
        }
    }
    if (a4.isChecked())
    {
        if (ssid.equalsIgnoreCase("TestPhone4"))
        {
            return true;
        }
    }
    if (a5.isChecked())
    {
        if (ssid.equalsIgnoreCase("TestPhone5"))
        {
            return true;
        }
    }
    if (a6.isChecked())
    {
        if (ssid.equalsIgnoreCase("TestPhone6"))
        {
            return true;
        }
    }

    return false;
}

2 个答案:

答案 0 :(得分:1)

您永远不会在计时器任务上调用cancel()将其从Timer计划程序中删除。尝试将其插入用于阻止其扫描的按钮中。

如果这不起作用,请尝试在计时器本身上调用cancel()。

答案 1 :(得分:1)

确定它正常工作,不确定它是否正确但工作正常。我只需取消注册reciecer并通过调用两个方法&#34; onPause()和onResume()&#34;再次注册它。一个接一个,就在startScan()方法之前。见代码:

private Runnable Timer_Tick = new Runnable()
{
    @Override
    public void run()
    {
        try
        {
            // unRegister Receiver wifiReciever
            onPause();
            // register Receiver wifiReciever
            onResume();

            // start a scan of ap's
            mainWifiObj.startScan();
        }
        catch (Exception e)
        {
            e.getStackTrace();
        }
    }
};

很想知道这是否是正确的方法。