user1741274
user1741274

Reputation: 757

LocationManager requestLocationUpdates() in GPS Android

I have developed an application as a service that handles basic HTTP requests. When the phone receives a HTTP Post request like: http ://IP:port/gps/on, it should register to the GPS listener like the following:

 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,200,0,locationListener); 

But, as this code is present inside the handler, I am getting the below error:

8.614: E/AndroidRuntime(21211): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.os.Handler.<init>(Handler.java:121)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at com.example.devicecommunication.ConnectService$HttpFileHandler.registerGPS(ConnectService.java:4281)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at com.example.devicecommunication.ConnectService$HttpFileHandler.handle(ConnectService.java:700)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at org.apache.http.protocol.HttpService.doService(HttpService.java:243)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:187)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at com.example.devicecommunication.ConnectService$WorkerThread.run(ConnectService.java:4987) 

Can you please let me know if I have to use handler/ Looper for this? And any example of how to do this. Thanks in advance!

Code to register GPS is called by a class that handles HTTP requests:

public String registerGPS(){
String gps= "";
if(!gpsSensor){
if(isGpsOn(appContext))
{
Log.d("GPS on","Using GPS Provider here"); 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,200,0,locationListener);
gps = "***********GPS Provider registered here *********************";
}
else
{
Log.d("GPS off","using NETWORK Provider here");
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,200,0,locationListener);
gps = "***********Network provider registered here *********************";
}
}
gpsSensor = true;
return gps; 
}

Upvotes: 1

Views: 10550

Answers (3)

user1741274
user1741274

Reputation: 757

In my Handler for Post, I passed an extra String to my service and started the service again. In onStartCommand(), I get the extra from the intent and then call requestLocationUpdates(), so it is done on the main thread. This solved my requirement. Thanks everyone for the help!

Upvotes: 0

Rarw
Rarw

Reputation: 7663

The error you're getting is because you're trying to run something from a background thread that requires the main thread. The code you provided does not show me the set up of this thread but to get the location set up back to the UI/Main thread you should be able to just create a new runnable using runOnUiThread as shown below.

private Runnable runnable = new Runnable() {
public void run() {  
    runOnUiThread(new Runnable() { 
        public void run(){ 
            //set up your listener here
        } 
    }); 
}

Just another comment, that you mention GPS, UI/Main thread actions, and HTTP post it just sounds like this could be set up using an AsyncTask. I'd have to see more code but that might make your life easier if you havent looked into it alraedy.

Upvotes: 1

Sagar Maiyad
Sagar Maiyad

Reputation: 12733

public class LocationLog extends Thread {
    LocationManager lm;
    LocationHelper loc;
    String latString, lngString = null;

    public LocationLog(Context context, String latString, String lngString) {
        loc = new LocationHelper();
        lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    }

    public void run() {
        Looper.prepare();
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc);
        Looper.loop();
    }
}

then use in your service class:

private void LocationLog() {
        new LocationLog(context, latString, lngString).start();
        Log.d(latString, getClass().getSimpleName());
        Log.d(lngString, getClass().getSimpleName());
        retrieveUserId();
        sendData(user_id);
    }

Upvotes: 0

Related Questions