在地理codeR不可用服务 [英] Service not available in geoCoder

查看:136
本文介绍了在地理codeR不可用服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够得到经度和纬度,但得到的地址我得到了一个错误。

公共布​​尔的onTouchEvent(MotionEvent事件,图形页面图形页面)

{

 如果(event.getAction()== 0)

   {

的GeoPoint P = MapView.getProjection()在。fromPixels(

  (int)的event.getX(),

  (int)的event.getY());


地理codeR地理codeR =新的地缘codeR(getBaseContext(),Locale.getDefault());

 尝试

   {

   名单<地址>地址=地理coder.getFromLocation(p.getLatitudeE6()/ 1E6,
                            p.getLongitudeE6()/ 1E6,1);

    字符串添加=「;

       如果(address.size()大于0)

          {

              的for(int i = 0; I< address.get(0).getMaxAddressLineIndex();我++)

        添加+ = address.get(0).getAddressLine(我)+\ N的;

          }

    Toast.makeText(getBaseContext(),添加,Toast.LENGTH_SHORT).show();

            }赶上(IOException异常E)

            {

                e.printStackTrace();

            }

            返回true;

        }

        返回false;
 

}

我的logcat - >

  12月2日至14号:27:35.717:WARN / System.err的(452):java.io.IOException异常:服务不可用
一十二月2日至14号:27:35.727:WARN / System.err的(452):在android.location.Geo coder.getFromLocation(GEO coder.java:117)
一十二月2日至14号:27:35.727:WARN / System.err的(452):在com.parkhya.SecondGps.MainActivity $ MapOverlay.onTouchEvent(MainActivity.java:47)
一十二月2日至14号:27:35.745:WARN / System.err的(452):在com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63)
一十二月2日至14号:27:35.745:WARN / System.err的(452):在com.google.android.maps.MapView.onTouchEvent(MapView.java:643)
一十二月2日至14号:27:35.757:WARN / System.err的(452):在android.view.View.dispatchTouchEvent(View.java:3766)
一十二月2日至14号:27:35.757:WARN / System.err的(452):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
一十二月2日至14号:27:35.757:WARN / System.err的(452):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
一十二月2日至14号:27:35.767:WARN / System.err的(452):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
一十二月2日至14号:27:35.767:WARN / System.err的(452):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
一十二月2日至14号:27:35.777:WARN / System.err的(452):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
一十二月2日至14号:27:35.777:WARN / System.err的(452):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
一十二月2日至14号:27:35.777:WARN / System.err的(452):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
一十二月2日至14号:27:35.777:WARN / System.err的(452):在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
一十二月2日至14号:27:35.786:WARN / System.err的(452):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
一十二月2日至14号:27:35.786:WARN / System.err的(452):在android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
一十二月2日至14号:27:35.796:WARN / System.err的(452):在android.os.Handler.dispatchMessage(Handler.java:99)
一十二月2日至14号:27:35.796:WARN / System.err的(452):在android.os.Looper.loop(Looper.java:123)
一十二月2日至14号:27:35.796:WARN / System.err的(452):在android.app.ActivityThread.main(ActivityThread.java:4627)
一十二月2日至14号:27:35.806:WARN / System.err的(452):在java.lang.reflect.Method.invokeNative(本机方法)
一十二月2日至14号:27:35.816:WARN / System.err的(452):在java.lang.reflect.Method.invoke(Method.java:521)
一十二月2日至14号:27:35.816:WARN / System.err的(452):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
一十二月2日至14号:27:35.825:WARN / System.err的(452):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
一十二月2日至14号:27:35.837:WARN / System.err的(452):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

下面是我的方式来获得的地址,即使地理codeR失败...但首先让我解释一下我自己的经验与地理codeR

有关一些未知的原因,地理codeR工作正常的话,会突然断裂!

我观察到的是,经过一段时间(可以是天),地理codeR开始抛出服务不可用例外。

修改 - >正如基督教,抛出异常,甚至就是为present()返回true< - 修改完

真是奇怪,因为它是工作的罚款之前,没有更改的配置发生了:

  • 在相同的设备
  • 在同一个Android版本
  • 在相同的应用程序
  • 在同一清单
  • WIFI和运行,在设置中启用设备位置的功能

当然,的东西的变化,但是,暂时,我们不知道到底是什么。 有开了约一个错误:问题38009:4.1.1地理codeR抛出异常:IOException异常:服务不可用

最后发表对这个线程(ATTOW)大概是在Android的4.0.x的+目标API x周期性重现的

作为解决方法,您可以使用谷歌地图

下面是我的地理coderHelper类,它以失败提供的情况下,地理codeR启动了谷歌地图B计划。 以我为例,我在城市名只是兴趣,但你基本上可以得到谷歌地图JSON输出任何数据availalbe

用法:

  

新的地缘coderHelper()fetchCityName(背景下,位置)。   然后做财产以后在例如code onPostExecute()(发送广播,调用监听器方法,设置一个TextView文本,等等)

地理coderHelper类:

 包COM< your_package> .location;

进口的java.util.List;
进口java.util.Locale中;

进口org.apache.http.client.methods.HttpGet;
进口org.apache.http.impl.client.BasicResponseHandler;
进口org.json.JSONArray;
进口org.json.JSONObject;

进口android.content.Context;
进口android.location.Address;
进口android.location.Geo codeR;
进口android.location.Location;
进口android.net.http.AndroidHttpClient;
进口android.os.AsyncTask;
进口android.util.Log;

公共类地理coderHelper
{
    私有静态最后AndroidHttpClient ANDROID_HTTP_CLIENT = AndroidHttpClient.newInstance(GEO coderHelper.class.getName());

    私人布尔运行= FALSE;

    公共无效fetchCityName(最终上下文CONTEX,最终定位位置)
    {
        如果(运行)
            返回;

        新的AsyncTask<虚空,虚空,字符串>()
        {
            在preExecute保护无效()
            {
                运行=真;
            };

            @覆盖
            保护字符串doInBackground(空... PARAMS)
            {
                字符串的cityName = NULL;

                如果(GEO coder.is present())
                {
                    尝试
                    {
                        地理codeR地理codeR =新的地缘codeR(CONTEX,Locale.getDefault());
                        名单<地址>地址=地理coder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
                        如果(addresses.size()大于0)
                        {
                            的cityName = addresses.get(0).getLocality();
                        }
                    }
                    赶上(异常忽略)
                    {
                        //过了一段时间,地理codeR开始trhow服务不availalbe异常。真是奇怪,因为在此之前(同一台设备,同样的Andr​​oid版本等工作..
                    }
                }

                如果(的cityName!= NULL)//即地理codeR成功
                {
                    返回的cityName;
                }
                否则//即地理codeR失败
                {
                    返回fetchCityNameUsingGoogleMap();
                }
            }

            //地理codeR :-(失败
            //我们的B计划:谷歌地图
            私人字符串fetchCityNameUsingGoogleMap()
            {
                串googleMapUrl =htt​​p://maps.googleapis.com/maps/api/geo$c$c/json?latlng=+ location.getLatitude()+,
                        + location.getLongitude()+&放大器,传感器=假放,语言= zh的;

                尝试
                {
                    JSONObject的googleMa presponse =新的JSONObject(ANDROID_HTTP_CLIENT.execute(新HTTPGET(googleMapUrl)
                            新BasicResponseHandler()));

                    //很多嵌套循环..不是很大 - >使用EX pression代替
                    //所有结果中环
                    JSONArray结果=(JSONArray),其中googleMa presponse.get(结果);
                    的for(int i = 0; I< results.length();我++)
                    {
                        //这个结果中的所有地址中环
                        的JSONObject结果= results.getJSONObject(ⅰ);
                        如果(result.has(address_components))
                        {
                            JSONArray addressComponents = result.getJSONArray(address_components);
                            //在所有的地址分量loop找到一个地方或sublocality
                            对于(INT J = 0; J< addressComponents.length(); J ++)
                            {
                                JSONObject的addressComponent = addressComponents.getJSONObject(J);
                                如果(result.has(类型))
                                {
                                    JSONArray类型= addressComponent.getJSONArray(类型);

                                    //寻找本地和sublocality
                                    字符串的cityName = NULL;

                                    对于(INT K = 0; K< types.length(); k ++)
                                    {
                                        如果(地方.equals(types.getString(K))及和放大器;的cityName == NULL)
                                        {
                                            如果(addressComponent.has(long_name))
                                            {
                                                的cityName = addressComponent.getString(long_name);
                                            }
                                            否则如果(addressComponent.has(SHORT_NAME))
                                            {
                                                的cityName = addressComponent.getString(SHORT_NAME);
                                            }
                                        }
                                        如果(sublocality.equals(types.getString(K)))
                                        {
                                            如果(addressComponent.has(long_name))
                                            {
                                                的cityName = addressComponent.getString(long_name);
                                            }
                                            否则如果(addressComponent.has(SHORT_NAME))
                                            {
                                                的cityName = addressComponent.getString(SHORT_NAME);
                                            }
                                        }
                                    }
                                    如果(的cityName!= NULL)
                                    {
                                        返回的cityName;
                                    }
                                }
                            }
                        }
                    }
                }
                赶上(异常忽略)
                {
                    ignored.printStackTrace();
                }
                返回null;
            }

            保护无效onPostExecute(字符串的cityName)
            {
                运行= FALSE;
                如果(的cityName!= NULL)
                {
                    //做些事情的cityName
                    Log.i(地理coderHelper的cityName);
                }
            };
        }。执行();
    }
}
 

希望这会有所帮助。

I am able to get longitude and latitude but getting address i got an error.

public boolean onTouchEvent(MotionEvent event, MapView mapView)

{

  if(event.getAction()==0)

   {

GeoPoint p = mapView.getProjection().fromPixels(

  (int) event.getX(),

  (int) event.getY());


Geocoder geoCoder=new Geocoder(getBaseContext(),Locale.getDefault());

 try

   {

   List<Address> address = geoCoder.getFromLocation( p.getLatitudeE6() / 1E6,
                            p.getLongitudeE6() / 1E6, 1);

    String add="";

       if(address.size()>0)

          {

              for (int i=0; i<address.get(0).getMaxAddressLineIndex();i++)

        add += address.get(0).getAddressLine(i) + "\n";

          }

    Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();

            } catch (IOException e) 

            {   

                e.printStackTrace();

            }

            return true;    

        }

        return false;

}

My Logcat -->

02-14 12:27:35.717: WARN/System.err(452): java.io.IOException: Service not Available
02-14 12:27:35.727: WARN/System.err(452):     at android.location.Geocoder.getFromLocation(Geocoder.java:117)
02-14 12:27:35.727: WARN/System.err(452):     at com.parkhya.SecondGps.MainActivity$MapOverlay.onTouchEvent(MainActivity.java:47)
02-14 12:27:35.745: WARN/System.err(452):     at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63)
02-14 12:27:35.745: WARN/System.err(452):     at com.google.android.maps.MapView.onTouchEvent(MapView.java:643)
02-14 12:27:35.757: WARN/System.err(452):     at android.view.View.dispatchTouchEvent(View.java:3766)
02-14 12:27:35.757: WARN/System.err(452):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
02-14 12:27:35.757: WARN/System.err(452):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-14 12:27:35.767: WARN/System.err(452):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-14 12:27:35.767: WARN/System.err(452):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-14 12:27:35.777: WARN/System.err(452):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-14 12:27:35.777: WARN/System.err(452):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
02-14 12:27:35.777: WARN/System.err(452):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
02-14 12:27:35.777: WARN/System.err(452):     at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
02-14 12:27:35.786: WARN/System.err(452):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
02-14 12:27:35.786: WARN/System.err(452):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
02-14 12:27:35.796: WARN/System.err(452):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 12:27:35.796: WARN/System.err(452):     at android.os.Looper.loop(Looper.java:123)
02-14 12:27:35.796: WARN/System.err(452):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-14 12:27:35.806: WARN/System.err(452):     at java.lang.reflect.Method.invokeNative(Native Method)
02-14 12:27:35.816: WARN/System.err(452):     at java.lang.reflect.Method.invoke(Method.java:521)
02-14 12:27:35.816: WARN/System.err(452):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-14 12:27:35.825: WARN/System.err(452):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-14 12:27:35.837: WARN/System.err(452):     at dalvik.system.NativeStart.main(Native Method)

解决方案

Here is my way to get the address even if Geocoder failed... but first let me explain my own experience with Geocoder:

For some unknown reason, Geocoder works fine then, suddenly break!.

What I observed is that, after a while (can be days), Geocoder start to throw "Service not available" exception.

EDIT-> As mentioned by Christian, the exception is thrown even is isPresent() returns true.<-EDIT END

Really weird since it was working fine before and no configuration changed occurred:

  • same device
  • same Android version
  • same app
  • same manifest
  • WIFI up and running, Device location feature enabled in settings

Of course, something changed, but, for the time being, we don't know exactly what. There is a bug opened about that: Issue 38009: 4.1.1 Geocoder throwing exception: IOException: Service not Available

Last post on this thread (ATTOW) "Probably it's periodically reproducible in android 4.0.x + target API x"

As a workaround, you can use Google Map

Here is my GeocoderHelper class that provides a 'Google Map' B Plan in case Geocoder start to fails. In my case, I am just interested in CityName, but you can basically get any data availalbe in google map JSON output

Usage:

new GeocoderHelper().fetchCityName(context, location); Then do somthing in onPostExecute() of example code (send broadcast, invoke listener method, set a textView text, whatever)

GeocoderHelper Class:

package com.<your_package>.location;

import java.util.List;
import java.util.Locale;

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.json.JSONArray;
import org.json.JSONObject;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.Log;

public class GeocoderHelper
{
    private static final AndroidHttpClient ANDROID_HTTP_CLIENT = AndroidHttpClient.newInstance(GeocoderHelper.class.getName());

    private boolean running = false;

    public void fetchCityName(final Context contex, final Location location)
    {
        if (running)
            return;

        new AsyncTask<Void, Void, String>()
        {
            protected void onPreExecute()
            {
                running = true;
            };

            @Override
            protected String doInBackground(Void... params)
            {
                String cityName = null;

                if (Geocoder.isPresent())
                {
                    try
                    {
                        Geocoder geocoder = new Geocoder(contex, Locale.getDefault());
                        List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                        if (addresses.size() > 0)
                        {
                            cityName = addresses.get(0).getLocality();
                        }
                    }
                    catch (Exception ignored)
                    {
                        // after a while, Geocoder start to trhow "Service not availalbe" exception. really weird since it was working before (same device, same Android version etc..
                    }
                }

                if (cityName != null) // i.e., Geocoder succeed
                {
                    return cityName;
                }
                else // i.e., Geocoder failed
                {
                    return fetchCityNameUsingGoogleMap();
                }
            }

            // Geocoder failed :-(
            // Our B Plan : Google Map
            private String fetchCityNameUsingGoogleMap()
            {
                String googleMapUrl = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + location.getLatitude() + ","
                        + location.getLongitude() + "&sensor=false&language=fr";

                try
                {
                    JSONObject googleMapResponse = new JSONObject(ANDROID_HTTP_CLIENT.execute(new HttpGet(googleMapUrl),
                            new BasicResponseHandler()));

                    // many nested loops.. not great -> use expression instead
                    // loop among all results
                    JSONArray results = (JSONArray) googleMapResponse.get("results");
                    for (int i = 0; i < results.length(); i++)
                    {
                        // loop among all addresses within this result
                        JSONObject result = results.getJSONObject(i);
                        if (result.has("address_components"))
                        {
                            JSONArray addressComponents = result.getJSONArray("address_components");
                            // loop among all address component to find a 'locality' or 'sublocality'
                            for (int j = 0; j < addressComponents.length(); j++)
                            {
                                JSONObject addressComponent = addressComponents.getJSONObject(j);
                                if (result.has("types"))
                                {
                                    JSONArray types = addressComponent.getJSONArray("types");

                                    // search for locality and sublocality
                                    String cityName = null;

                                    for (int k = 0; k < types.length(); k++)
                                    {
                                        if ("locality".equals(types.getString(k)) && cityName == null)
                                        {
                                            if (addressComponent.has("long_name"))
                                            {
                                                cityName = addressComponent.getString("long_name");
                                            }
                                            else if (addressComponent.has("short_name"))
                                            {
                                                cityName = addressComponent.getString("short_name");
                                            }
                                        }
                                        if ("sublocality".equals(types.getString(k)))
                                        {
                                            if (addressComponent.has("long_name"))
                                            {
                                                cityName = addressComponent.getString("long_name");
                                            }
                                            else if (addressComponent.has("short_name"))
                                            {
                                                cityName = addressComponent.getString("short_name");
                                            }
                                        }
                                    }
                                    if (cityName != null)
                                    {
                                        return cityName;
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ignored)
                {
                    ignored.printStackTrace();
                }
                return null;
            }

            protected void onPostExecute(String cityName)
            {
                running = false;
                if (cityName != null)
                {
                    // Do something with cityName
                    Log.i("GeocoderHelper", cityName);
                }
            };
        }.execute();
    }
}

Hope this will help.

这篇关于在地理codeR不可用服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆