2013-03-16 70 views
1

我试图在运行应用程序时使用htc desire c来反转地理代码,其抛出服务不可用异常。但是GeoCoder.isPresent()返回'true'。请帮我找出问题。反向地理代码中的异常

这是我的代码:

public class MainActivity extends Activity { 

LocationManager lManager; 
String provider; 
Location location ; 

@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    lManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 

    provider = lManager.getBestProvider(criteria, false); 
    if(provider!=null && !provider.equals("")){ 

     // Get the location from the given provider 
     location = lManager.getLastKnownLocation(provider); 
    } 

    boolean geoCoder = false; 
    Geocoder geo = new Geocoder(this, Locale.getDefault()); 
    geoCoder = Geocoder.isPresent(); 
    System.out.println("GEO CODER : "+geoCoder); 

    try { 
     List<Address> address = geo.getFromLocation(location.getLatitude(), location.getLongitude(), 3); 
     System.out.println("Size------------- "+address.size()); 

     /*Address addr = address.get(0); 
     System.out.println("City "+addr.getLocality());*/ 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     System.out.println("in here--------------"); 
     e.printStackTrace(); 
    } 

} 

登录:

03-16 10:33:58.609: I/System.out(30398): GEO CODER : true 
03-16 10:33:58.609: I/System.out(30398): in here-------------- 
03-16 10:33:58.609: W/System.err(30398): java.io.IOException: Service not Available 
03-16 10:33:58.619: W/System.err(30398): at android.location.Geocoder.getFromLocation(Geocoder.java:136) 
03-16 10:33:58.619: W/System.err(30398): at com.example.geocoder.MainActivity.onCreate(MainActivity.java:46) 
03-16 10:33:58.619: W/System.err(30398): at android.app.Activity.performCreate(Activity.java:4538) 
03-16 10:33:58.629: W/System.err(30398): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
03-16 10:33:58.629: W/System.err(30398): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161) 
03-16 10:33:58.629: W/System.err(30398): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 
03-16 10:33:58.629: W/System.err(30398): at android.app.ActivityThread.access$600(ActivityThread.java:139) 
03-16 10:33:58.629: W/System.err(30398): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
03-16 10:33:58.629: W/System.err(30398): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-16 10:33:58.629: W/System.err(30398): at android.os.Looper.loop(Looper.java:156) 
03-16 10:33:58.629: W/System.err(30398): at android.app.ActivityThread.main(ActivityThread.java:4987) 
03-16 10:33:58.639: W/System.err(30398): at java.lang.reflect.Method.invokeNative(Native Method) 
03-16 10:33:58.639: W/System.err(30398): at java.lang.reflect.Method.invoke(Method.java:511) 
03-16 10:33:58.639: W/System.err(30398): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-16 10:33:58.639: W/System.err(30398): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-16 10:33:58.649: W/System.err(30398): at dalvik.system.NativeStart.main(Native Method) 
+1

*非常低质量:*您使用的是什么语言?你的代码在哪里?你有什么尝试? – 2013-03-16 04:55:08

+0

@AnilM,你有没有在AndroidManifest.xml中提供Internet权限? – Raynold 2013-03-16 04:56:39

+0

是的......我在AndroidManifest.xml中给出了互联网和访问精细定位权限 – 2013-03-16 04:58:11

回答

1

@smk给你一个有用的链接。为了让你免受大量研究的困扰,我会尽量简短回答你。地理编码器并不总是返回一个值。您可以尝试在for循环中发送3次请求。我应该能够返回至少一次。如果没有,那么他们可能是连接问题,或者可能是其他问题,如服务器不答复您的请求。

我有一个while循环,但我曾尝试过最多10次。有时候,即使连接到互联网,它也不会返回任何东西。然后,我使用this更可靠的方式获取地址每次:

我曾经获取经纬度,然后请求谷歌服务器,回复一个JSOn对象包含有关位置坐标的各种信息。下面是函数:

public JSONObject getLocationInfo() { 

     HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng="+lat+","+lng+"&sensor=true"); 
     HttpClient client = new DefaultHttpClient(); 
     HttpResponse response; 
     StringBuilder stringBuilder = new StringBuilder(); 

     try { 
      response = client.execute(httpGet); 
      HttpEntity entity = response.getEntity(); 
      InputStream stream = entity.getContent(); 
      int b; 
      while ((b = stream.read()) != -1) { 
       stringBuilder.append((char) b); 
      } 
     } catch (ClientProtocolException e) { 
      } catch (IOException e) { 
     } 

     JSONObject jsonObject = new JSONObject(); 
     try { 
      jsonObject = new JSONObject(stringBuilder.toString()); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return jsonObject; 
    } 

我把它叫做如下:

JSONObject ret = getLocationInfo(); 
JSONObject location; 
String location_string; 
try { 
    location = ret.getJSONArray("results").getJSONObject(0); 
    location_string = location.getString("formatted_address"); 
    Log.d("test", "formattted address:" + location_string); 
} catch (JSONException e1) { 
    e1.printStackTrace(); 

} 

希望这有助于。我也厌倦了依靠Geocoder。这对我有效。虽然它可能比地理编码器慢。您可以在网址中使用经纬度坐标替换。尝试在Web浏览器中查看返回的JSON对象。您会看到如何提取地址字符串。尝试并阅读这些线程以及:

Geocoder doesn't always return a valuegeocoder.getFromLocationName returns only null

+0

感谢您的回答Shobhit Puri!我真的很吃惊GeoCoder ......会尽力实现你的答案:) – 2013-03-16 05:30:44

+0

没问题。我也被困在里面一天。所以只是认为一点点就会很好。祝一切顺利。此外,如果您发现Geocoer问题的更好解决方案,请张贴它。 :) – 2013-03-16 05:34:44

+0

当然我会发布,如果我找到更好的解决方案:) – 2013-03-16 05:40:48