I'm working on an application which loads a map ( as an image). I'm using a customized view to load the image. I have to perform a wifi scan and store the results whenever the user touches the map.
I have declared the wifi manager this way:
public static WifiManager wifi;
so that I can use it inside my customized view. When I call wifi.startScan();
from the customized view it doesn't perform the scan. It runs without errors or exceptions but no scan result is available.
This is the code of my broadcast receiver:
public class WifiReceiver extends BroadcastReceiver {
/*
* This receiver will set a flag in the main activity to indicate the new scan result has been set
* it will set the new result too.
*
*/
public void onReceive(Context c, Intent intent) {
result=wifi.getScanResults();
Log.d("surveyTool","scanning result set");
}
}
As far as understand how scanning work, whenever wifi.startScan()
is called, the code inside onReceiver()
should be executed when the scan result is available. But this is not happening.
Can anyone tell me what is wrong here?? or what should I do in order to start the scan from my customized view?
Note: I have added the needed permission and scan works if I call it inside the MainActivity **EDIT: **
I have registered the receiver in the MainActivity using this:
receiverWifi = new WifiReceiver();
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
I'm calling wifi.startScan()
in onTouch()
function in my customized view:
@Override
public boolean onTouch(View v, MotionEvent event) {
// the coordinate of the touch point
x=event.getX();
y=event.getY();
try {
touchManager.update(event);
// single point touch
if (touchManager.getPressCount() == 1) {
position.add(touchManager.moveDelta(0)); // to keep the point drawn at the touch location
info.addToStartPoint(touchManager.moveDelta(0));
if((touchManager.moveDelta(0).getX()==0 && touchManager.moveDelta(0).getY()== 0))
{
PreviousPoint= CurrentPoint;
CurrentPoint=info.Map(x, y);
if(CurrentPoint.getX()!=PreviousPoint.getX() && CurrentPoint.getY()!= PreviousPoint.getY())
{
// the point is on the image
if(CurrentPoint.getX()!=-1 && CurrentPoint.getY()!= -1)
{
MainActivity.wifi.startScan();
MainActivity.counter++;
Log.d("surveyTool","touch: "+MainActivity.counter);
MainActivity.location=CurrentPoint;
MainActivity.newLocationAvailable=true;
MainActivity.AddNewFingerprin();
}
// Log.d("surveyTool", " new touch event occurred");
// here do the surveying and other stuff
}
}
}
else {
if (touchManager.getPressCount() == 2) {
Vector2D current = touchManager.getVector(0, 1);
Vector2D previous = touchManager.getPreviousVector(0, 1);
float currentDistance = current.getLength();
float previousDistance = previous.getLength();
if (previousDistance != 0) {
scale *= currentDistance / previousDistance; // for the zoom
info.setZoomFactor(scale);
}// end of != 0
}// end of if ==2
}// end of else
invalidate(); // will cause a redraw
}
catch(Throwable t) {
}
return true;
}
EDIT
I unregister the receiver in onPause()
and I register it again in onResume()
.
Since you unregister your broadcast receiver onPause() of the activity , once your activity is destroyed you will not be able to get the system broadcast for wifi scan results available whenever you call wifi.startScan()
You will need to define a broadcast receiver and register it in the xml to be able to listen to scan results outside the activity.
Make receiver for that:
In your Manifest add
Now whenever you call wifiManager.startScan() from any activity or anywhere else in the application you will get a system broadcast