2013-10-15 3 views
1

Я пытаюсь получить адрес, используя lat, lng.
Но его не работает при вставке кода ниже. Я очень ценю любую помощь.
Я получаю исключение все время, а не значение, в чем ошибка?Не удается получить адрес google maps v2

Спасибо заранее.

 googleMap.setOnMapClickListener((OnMapClickListener) new OnMapClickListener() { 

      @Override 
      public void onMapClick(LatLng point) { 
       // TODO Auto-generated method stub 



        final LatLng pt = point; 

        marker2 = googleMap.addMarker(new MarkerOptions() 
        .position(pt) 
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))); 



        final ProgressDialog progressDialog = ProgressDialog.show(
          MainActivity.this, 
          "Searching Location....", "Please wait...."); 


        new Thread(new Runnable(){ 
         public void run(){ 
          try { 




            Toast.makeText(getBaseContext(), GeocoderUtil.getAddress(marker2.getPosition(), MainActivity.this), 5).show(); 


           }catch(Exception e) 
           { 


            runOnUiThread(new Runnable() { 
             public void run() { 

              progressDialog.dismiss(); 

              Toast.makeText(getBaseContext(),"error.", 5).show(); 
             } 
            }); 


           }}} 

        ).start(); 

Исключение:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at com.maps.maps.MainActivity$1.onMapClick(MainActivity.java:442) 
    at com.google.android.gms.maps.GoogleMap$.onMapClick(Unknown Source) 
    at com.google.android.gms.maps.internal.h$a.onTransact(Unknown Source) 
    at android.os.Binder.transact(Binder.java:297) 
    at bor.a(SourceFile:93) 
    at maps.af.q.b(Unknown Source) 
    at maps.ap.bo.b(Unknown Source) 
    at maps.ap.bk.onSingleTapConfirmed(Unknown Source) 
    at maps.bt.g.onSingleTapConfirmed(Unknown Source) 
    at maps.bt.i.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:4945) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

Используете ли вы маркер Google, и если пользователь нажимает маркер, вы хотите получить адрес? – Shadow

+0

да. Я использую maponclickListener, который правильно лат/lng, но когда я пробовал код выше, он просматривает его и его не обрабатывает. Я пытался его отладить, но заявление, включая геокодер и остальную часть кода, пропущено. мне, как заставить его работать? Спасибо в Advance – jason

+1

Если вы получаете длинное значение lat, чем просто написать список

address = geoCoder.getFromLocation (широта, долгота, 1); , если (addresses.size()> 0) { для (INT индекс = 0; индекса

ответ

3

Следуйте этот код, чтобы получить адрес:

  final TextView address = (TextView) infoWindow.findViewById(R.id.Address); 
     address.setText(GeoCoderUtil.getAddress(marker.getPosition(), CurrentActivity.this)); 

    GeoCoderUtil.java: 


    import java.io.IOException; 
    import java.text.DecimalFormat; 
    import java.util.List; 

    import android.content.Context; 
    import android.location.Address; 
    import android.location.Geocoder; 
    import android.location.Location; 
    import android.util.Log; 
    import android.widget.Toast; 

    import com.google.android.gms.maps.model.LatLng; 

    public class GeoCoderUtil { 

     public static String getAddress(LatLng latLng, Context context) { 
      Geocoder geocoder = new Geocoder(context); 
      double latitude = latLng.latitude; 
      double longitude = latLng.longitude; 

      String address = ""; 

      try { 
    Log.i("Address Info","Address based opn geocoder"); 
       List<Address> addresses = geocoder.getFromLocation(latitude, 
         longitude, 1); 

       if (addresses != null && !addresses.isEmpty()) { 
        Address returnedAddress = addresses.get(0); 
        StringBuilder strReturnedAddress = new StringBuilder(); 
        int addressLineIndex = returnedAddress.getMaxAddressLineIndex(); 

        int addressLinesToShow = 2; 
    //    To get address in limited lines 
        if (addressLineIndex < 2) { 
         addressLinesToShow = addressLineIndex; 
        } 
        for (int p = 0; p < addressLinesToShow; p++) { 
         strReturnedAddress 
           .append(returnedAddress.getAddressLine(p)).append(
             "\n"); 
        } 
        address = strReturnedAddress.toString(); 
       } else { 
        address = "Address not available"; 

       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       address = "Address not available"; 
       Log.e("Address not found","Unable to get Address in info window"); 
      } 
      return address; 
     } 

     public static String getDistanceByUnit(double startLatitude, double startLongitude, double endLatitude, double endLongitude) { 
      float[] distance = new float[1]; 
      Log.i("Distance","Distance from source to end"); 
      Location.distanceBetween(startLatitude, startLongitude, endLatitude, 
        endLongitude, distance); 
      String distanceByUnit = "Not Available"; 

      DecimalFormat d = new DecimalFormat("0.00"); 
      if (distance[0] > 999.99) { 
       distance[0] = distance[0]/1000; 
       distanceByUnit = String.valueOf(d.format(distance[0])) + " Km"; 
      } else { 
       distanceByUnit = String.valueOf(d.format(distance[0])) + " m"; 
      } 
      return distanceByUnit; 
     } 
    } 
+0

Привет, SHylu.I пробовал ваш код. Я получаю исключение. Я обновил свой код выше, пожалуйста, проверьте его и сообщите мне, где он. Проблемы снова. – jason

+0

Какое исключение вы получаете, дайте мне знать. –

+0

получение исключения в списке

линия. Обновлен мой код. Пожалуйста, посмотрите. – jason

0

Используйте это.

Кодер геокодирования;

public String PointToLoc(LatLng pos) 
{ 
String address=""; 
try { 

List<Address>addresses=coder.getFromLocation(pos.latitude,pos.longitude,1); 

if (addresses.size()>0) 
{ 

for (int index=0;index<addresses.get(0).getMaxAddressLineIndex();index++) 

      address += addresses.get(0).getAddressLine(index)+""; 

     Log.d("Address",""+ address); //full address 
     Log.d("Address1",""+ addresses.get(0).getLocality()); //city 
     Log.d("Address2",""+ addresses.get(0).getSubLocality()); //area 

    } 


    } 
catch (IOException e) 
     {   
      e.printStackTrace(); 
     } 
    return address; 
} 
    @Override 
    public void onInfoWindowClick(Marker marker) { 
    String cur_address=PointToLoc(marker.getPosition()); 
    //Toast the above string.You will get it. 

    } 
+0

Я использовал Geocoder coder = new Geocoder (MainActivity.this, Locale.getDefault()); для переменной coder, о которой вы упомянули выше, но я получил услугу, недоступен. Я проверяю документ для mapsv2. По-видимому, геокодер не поддерживается. Что это за работа? Еще раз спасибо за вопрос – jason

+0

объявить его внутри инструкции try – Shadow

+0

Пробовал это, но говорит, что сервис недоступен, думая об использовании API геокодирования Google! – jason

10

АДРЕС :: ОТ LAT N LONG IN MAP V2:

String address = ""; 
    Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault()); 
     try { 
      List<Address> addresses = geoCoder.getFromLocation(latitude ,longitude , 1); 
      if (addresses.size() > 0) 
       { 
       for (int index = 0; 
       index < addresses.get(0).getMaxAddressLineIndex(); index++) 
       address += addresses.get(0).getAddressLine(index) + " "; } 
          } 
     catch (IOException e) {   
      e.printStackTrace(); 
      } 
googleMap_v2.animateCamera(CameraUpdateFactory.zoomTo(15)); 
      current_location.setText("Latitude:" + latitude + ", Longitude:"+ longitude); 
      current_address.setText("current Address :" + address); 
      googleMap_v2.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("current status")); 
     }} 
+0

исключение gtting в списке

line.Updated мой код, пожалуйста, посмотрите. Спасибо, – jason

+1

Спасибо, что сработал. Перезагрузите устройство. + 1 – jason

+0

приветствуется :) –

0

Используйте это:

// An AsyncTask class for accessing the GeoCoding Web Service 
    private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{ 

     @Override 
     protected List<Address> doInBackground(String... locationName) { 
      // Creating an instance of Geocoder class 
      Geocoder geocoder = new Geocoder(getBaseContext()); 
      List<Address> addresses = null; 

      try { 
       // Getting a maximum of 3 Address that matches the input text 
       addresses = geocoder.getFromLocationName(locationName[0], 3); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return addresses; 
     } 

     @Override 
     protected void onPostExecute(List<Address> addresses) { 

      if(addresses==null || addresses.size()==0){ 
       Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show(); 
      } 

      // Clears all the existing markers on the map 
      googleMap.clear(); 

      // Adding Markers on Google Map for each matching address 
      for(int i=0;i<addresses.size();i++){ 

       Address address = (Address) addresses.get(i); 

       // Creating an instance of GeoPoint, to display in Google Map 
       latLng = new LatLng(address.getLatitude(), address.getLongitude()); 

       String addressText = String.format("%s, %s", 
       address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "", 
       address.getCountryName()); 

       markerOptions = new MarkerOptions(); 
       markerOptions.position(latLng); 
       markerOptions.title(addressText); 

       googleMap.addMarker(markerOptions); 

       // Locate the first location 
       if(i==0) 
        googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); 
      } 
     } 
Смежные вопросы