1

I'm working on an app that uses the network location, but i've recived some users feedback that says that they never pass this block of code, i'm assuming that the problem is that location changed is never called, but it only happens in a few diveces, and i cant force the failure in mine.

Is there any chance to solve it or control it? showing a toast saying that is unable to find location, will work for me...

I know that if the user reboot his phone, the location will work, but that it's not a solution for the users

I left the code right here...

final LocationManager lm = (LocationManager) thisOfActivity
                        .getSystemService(Context.LOCATION_SERVICE);
                boolean network_enabled = lm
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                // SOME STUFF

                Location net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);


                final LocationListener locationListenerNetwork = new LocationListener() {

                    public void onLocationChanged(Location location) {
                        double lat = location.getLatitude();
                        double lon = location.getLongitude();
                        Log.e("LATLON", lat + "," + lon);
                        lm.removeUpdates(this);

                        // SOME STUFF
                        myTask task = new myTask();

                        if (progress.isShowing())
                            progress.dismiss();
                        task.execute();
                        thisOfActivity.registerForContextMenu(tweetList);
                    }

                    public void onProviderDisabled(String provider) {
                        thisOfActivity
                                .startActivityForResult(
                                        new Intent(
                                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS),
                                        0);
                        if (progress.isShowing())
                            progress.dismiss();
                        MainActivity.accionEnCuro = false;
                        Toast.makeText(
                                thisOfActivity.getApplicationContext(),
                                thisOfActivity.getString(R.string.location),
                                Toast.LENGTH_SHORT).show();
                    }

                    public void onProviderEnabled(String provider) {
                    }

                    @Override
                    public void onStatusChanged(String provider,
                            int status, Bundle extras) {
                        switch( status ) {
                        case LocationProvider.AVAILABLE:
                                Log.e("LocProv", "AVAILABLE");
                            break;
                        case LocationProvider.OUT_OF_SERVICE:
                                Log.e("LocProv", "OUT_OF_SERVICE");
                            break;
                        case LocationProvider.TEMPORARILY_UNAVAILABLE:
                                Log.e("LocProv", "TEMPORARILY_UNAVAILABLE");
                            break;
                        }

                    }
                };

                if (network_enabled) {
                    lm.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER, 0, 0,
                            locationListenerNetwork);
                } else {
                    thisOfActivity
                            .startActivityForResult(
                                    new Intent(
                                            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS),
                                    0);
                    if (progress.isShowing())
                        progress.dismiss();
                    MainActivity.accionEnCuro = false;
                    Toast.makeText(thisOfActivity.getApplicationContext(),
                            thisOfActivity.getString(R.string.location),
                            Toast.LENGTH_LONG).show();
                }

I've tried with the next idea, i think it could work, at least to get a location and not keep the user waiting.

                final LocationManager lm = (LocationManager) thisOfActivity
                        .getSystemService(Context.LOCATION_SERVICE);
                boolean network_enabled = lm
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                // SOME STUFF

                LocationListener locationListenerNetwork = null;

                // Constructor
                class MyThread implements Runnable {
                    LocationListener locationListenerNetwork;
                       public MyThread(LocationListener lln) {
                         locationListenerNetwork = lln;
                       }

                       public void run() {
                       }
                    }

                final Handler myHandler = new Handler();
                //Here's a runnable/handler combo
                final Runnable MyRunnable = new MyThread(locationListenerNetwork)
                {
                    @Override
                    public void run() {
                        if (locationListenerNetwork != null)
                            lm.removeUpdates(locationListenerNetwork);

                        Location location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if(location != null)
                        {
                            double lat = location.getLatitude();
                            double lon = location.getLongitude();

                            Log.e("LATLON", lat + "," + lon);

                            ListView tweetList = (ListView) thisOfActivity
                                    .findViewById(R.id.tweets);
                            jsonUpdateAsyncTask task = new jsonUpdateAsyncTask(
                                    thisOfActivity, Double.toString(lat),
                                    Double.toString(lon), tweetList);

                            if (progress.isShowing())
                                progress.dismiss();
                            task.execute();
                            thisOfActivity.registerForContextMenu(tweetList);
                        }
                        else
                        {
                            if (progress.isShowing())
                                progress.dismiss();
                            MainActivity.accionEnCuro = false;
                            Toast.makeText(thisOfActivity.getApplicationContext(),
                                    thisOfActivity.getString(R.string.location),
                                    Toast.LENGTH_LONG).show();
                        }

                    }               
                };

                locationListenerNetwork = new LocationListener() {

                    public void onLocationChanged(Location location) {
                        double lat = location.getLatitude();
                        double lon = location.getLongitude();
                        Log.e("LATLON", lat + "," + lon);
                        lm.removeUpdates(this);

                        myHandler.removeCallbacks(MyRunnable);

                        ListView tweetList = (ListView) thisOfActivity
                                .findViewById(R.id.tweets);
                        jsonUpdateAsyncTask task = new jsonUpdateAsyncTask(
                                thisOfActivity, Double.toString(lat),
                                Double.toString(lon), tweetList);

                        if (progress.isShowing())
                            progress.dismiss();
                        task.execute();
                        thisOfActivity.registerForContextMenu(tweetList);
                    }

                    public void onProviderDisabled(String provider) {
                        thisOfActivity
                                .startActivityForResult(
                                        new Intent(
                                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS),
                                        0);
                        if (progress.isShowing())
                            progress.dismiss();
                        MainActivity.accionEnCuro = false;
                        Toast.makeText(
                                thisOfActivity.getApplicationContext(),
                                thisOfActivity.getString(R.string.location),
                                Toast.LENGTH_SHORT).show();
                    }

                    public void onProviderEnabled(String provider) {
                    }

                    @Override
                    public void onStatusChanged(String provider,
                            int status, Bundle extras) {
                        switch( status ) {
                        case LocationProvider.AVAILABLE:
                                Log.e("LocProv", "AVAILABLE");
                            break;
                        case LocationProvider.OUT_OF_SERVICE:
                                Log.e("LocProv", "OUT_OF_SERVICE");
                            break;
                        case LocationProvider.TEMPORARILY_UNAVAILABLE:
                                Log.e("LocProv", "TEMPORARILY_UNAVAILABLE");
                            break;
                        }

                    }
                };

                if (network_enabled) {
                    myHandler.postDelayed(MyRunnable, 10 * 1000);

                    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0,locationListenerNetwork);
                } else {

                // MORE STUFF

opinions?

  • check out [this link](http://stackoverflow.com/a/16393534/2345913) and [this link](http://stackoverflow.com/a/16371874/2345913) for ref – CRUSADER May 21 '13 at 10:47
  • 1
    i have found a few solutions like that but this (until where i can see) is for launch the action, but my problem is that once inside the locationListenerNetwork it never goes through onLocationChanged – Ander Murias May 21 '13 at 11:08

0 Answers0