user1908607
user1908607

Reputation:

problems with android.location.geocoder

I know there has been a lot of questions on the site about the IOExeption : service not available.....I have checked all the answers i could find on the subject... i'm running it as async task which seems to be working fine but still getting the same exception.

I have used isPresent() on previous attempts although it is not in the following code and i am using the same phone. i have the internet permission. i have tried to change target to google api to see if that was the problem but it made no difference.

This is a vital part of a forth year project so any help would be serious. ps never worked with java or android before very recently so forgive any rookie looking coding ty..

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    view1 = (TextView) findViewById(R.id.textView1);
    view2 = (TextView)findViewById(R.id.textView2);
    view3 = (TextView)findViewById(R.id.textView4);
    b1 = (Button) findViewById(R.id.button1);

    locationManager =
            (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    //provider =
      //      locationManager.getProvider(LocationManager.GPS_PROVIDER);

    final LocationListener listener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            view2.setText(Double.toString(location.getLatitude()));
            view3.setText(Double.toString(location.getLongitude()));
            Double lat = Double.valueOf(location.getLatitude());
            Double longTemp = Double.valueOf(location.getLatitude());
            new geo().execute(lat,longTemp);
            }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            // TODO Auto-generated method stub

        }

    };
    b1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            locReqest();
        }

        private void locReqest() {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, listener);
        }
    });

}

class geo extends AsyncTask<Double, Void, String>{
    Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
    @Override
    protected String doInBackground(Double... params) {
           Address address = null;
           List<Address> addresses = null;
            try {
                // Call the synchronous getFromLocation() method by passing in the lat/long values.
                addresses = geocoder.getFromLocation(params[0].doubleValue(),params[1].doubleValue(), 1);
                address = addresses.get(0);
                if (address != null){
                    return "Got your address : " + address.getCountryName().toString();
                }
            } catch (IOException e) {
                e.printStackTrace();
                return "failed";
            }
            return"fail";
    }
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //view1.setText(result);
        Toast.makeText(getApplicationContext(), "The address is: " + result, Toast.LENGTH_LONG).show();
    }


}

heres the logcat

12-16 23:06:53.855: W/System.err(23578): java.io.IOException: Service not Available
12-16 23:06:53.865: W/System.err(23578):    at android.location.Geocoder.getFromLocation(Geocoder.java:136)
12-16 23:06:53.865: W/System.err(23578):    at com.boggerTech.local.Main$geo.doInBackground(Main.java:102)
12-16 23:06:53.880: W/System.err(23578):    at com.boggerTech.local.Main$geo.doInBackground(Main.java:1)
12-16 23:06:53.900: W/System.err(23578):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-16 23:06:53.900: W/System.err(23578):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-16 23:06:53.905: W/System.err(23578):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-16 23:06:53.915: W/System.err(23578):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-16 23:06:53.915: W/System.err(23578):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-16 23:06:53.915: W/System.err(23578):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-16 23:06:53.920: W/System.err(23578):    at java.lang.Thread.run(Thread.java:856)
12-16 23:07:10.440: W/System.err(23578): java.io.IOException: Service not Available

Upvotes: 7

Views: 12547

Answers (3)

Fawwaz M Amin
Fawwaz M Amin

Reputation: 1

Solved it by signing into my google account in the emulator.

Upvotes: 0

Sai
Sai

Reputation: 1

The best solution to this problem is to just to Open the AVD Manager which is present under the list when you select which mobile device you run on and just clear all data in it let it reboot and then run your program again...this worked for me

Upvotes: 0

Yaroslav Mytkalyk
Yaroslav Mytkalyk

Reputation: 17105

Geocoder.isPresent() can return false on some devices.

If it returns true and you still have problems you can create your own Geocoder by using The Google Geocoding API

I made a platform-independent Geocoder library which is available at github and Maven Central

dependencies {
    compile 'com.github.doctoror.geocoder:library:[version]'
}

Edit: the previous answer contained a short example implementation of implementing Geocoder.

Upvotes: 12

Related Questions