2011-03-05 29 views
14

पर IOException फेंकता एंड्रॉयड एमुलेटर 2.2 एपीआई 8 का उपयोग करते हुए मैं IOExceptionGeocoder.getFromLocation एंड्रॉयड एमुलेटर

03-05 19:42:11.073: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol 
03-05 19:42:15.505: WARN/System.err(1823): java.io.IOException: Service not Available 

हो रही मेरी कोड Thats रखें:

private LocationManager manager = null; 
LocationListener locationListener = null; 
double latitude = 0; 
double longtitude = 0; 
List<Address> myList = null; 

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    // httpTranslateGet(); 
    try 
    { 


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


     initLocationListener(); 

     manager.requestLocationUpdates(manager.GPS_PROVIDER, 0, 0, 
       locationListener); 

    } 
    catch (Exception e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

private void initLocationListener() 
{ 
    locationListener = new LocationListener() 
    { 

     @Override 
     public void onLocationChanged(android.location.Location location) 
     { 
      if (location != null) 
      { 

       latitude = location.getLatitude(); 
       longtitude = location.getLongitude(); 


       try 
       { 
        Geocoder geocoder = new Geocoder(WeatherCastDemo.this, Locale.getDefault()); 
        List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 
        myList = geocoder.getFromLocation(
          location.getLatitude(), 
          location.getLongitude(), 10); 

        StringBuilder sb = new StringBuilder(); 
        if (myList.size() > 0) 
        { 
         Address address = myList.get(0); 

         for (int i = 0; i < address 
           .getMaxAddressLineIndex(); i++) 
          sb.append(address.getAddressLine(i)).append(
            "\n"); 

         sb.append(address.getLocality()).append("\n"); 
         sb.append(address.getPostalCode()).append("\n"); 
         sb.append(address.getCountryName()); 

        } 
       } 

       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 

      } 

     } 

     @Override 
     public void onProviderDisabled(String arg0) 
     { 
      // 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) 
     { 

     } 
    }; 
} 

किसी को भी किसी भी विचार है?

मैंने इसे एमुलेटर 2.1 एपीआई 7 के साथ करने में कामयाब रहा है, लेकिन फिर रिवर्स जियोकोडिंग हमेशा खाली परिणाम देती है। कोई भी मेरे कोड की पुष्टि कर सकता है?

धन्यवाद।

धन्यवाद, किरण।

+0

क्या आप फ़ायरवॉल या प्रॉक्सी के अंतर्गत हैं? –

+0

क्या आप अपने एम्यूलेटर के साथ इंटरनेट से जुड़े हुए हैं? ब्राउज़र का उपयोग करके इसे जांचें। –

+0

मैं फ़ायरवॉल/प्रॉक्सी के तहत नहीं हूं और हां, मैं इंटरनेट से कनेक्ट हूं। – rayman

उत्तर

21

यह एमुलेटर के साथ एक पता समस्या है। यह एक वास्तविक डिवाइस पर ठीक काम करता है

2.2 पर एपीआई 8 आप निम्नलिखित स्टैकट्रेस

java.io.IOException: Service not Available 
at android.location.Geocoder.getFromLocation(Geocoder.java:117) 

अधिक जानकारी के लिए यहाँ देखें (और एक संभावित समाधान) मिल जाएगा निम्न URL देखें:

http://code.google.com/p/android/issues/detail?id=8816

यदि आपको निचले एपीआई पर जियोकोडर का उपयोग करने में समस्याएं आ रही हैं तो आपको स्टैकट्रैक की जांच करनी चाहिए। समय-समय पर मैं निम्नलिखित हो रही है:

java.io.IOException: Unable to parse response from server 
at android.location.Geocoder.getFromLocation(Geocoder.java:124) 

यह गूगल पर एक सर्वर साइड मुद्दा, या ग्राहक (इंटरनेट कनेक्शन) पर एक मुद्दा से कुछ भी हो सकता है।

यदि जियोकोडर एक खाली सूची देता है, तो आपको यह जांचना होगा कि आपके पास डिवाइस (एमुलेटर या असली फोन) पर उचित जियोकोडर कार्यान्वयन उपलब्ध है या नहीं।

यह जियोकोडर ऑब्जेक्ट पर isPresent() विधि का उपयोग करके किया जा सकता है।

http://developer.android.com/reference/android/location/Geocoder.html

इसके अलावा, जब एक एमुलेटर पर चल रहा है, सुनिश्चित करें कि आपके AVD छवि को Google API के साथ सेटअप है या नहीं।

+0

मैंने इसे एमुलेटर 2.1 और एपीआई 7 के साथ करने में कामयाब रहा है, लेकिन रिवर्स कोडिंग कोड हमेशा खाली परिणाम लौटाता है, कोई विचार क्यों? – rayman

+0

रेयान: मैंने answser को अपडेट किया है ... क्या आपको जियोकोडर लुकअप करने पर अपवाद मिल रहा है? – ddewaele

+0

नहीं, सूची पतों में केवल खाली परिणाम (सूची

पते) – rayman

10

आप रास्ता

निम्नलिखित

एक विधि है कि

public static JSONObject getLocationInfo(String address) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    try { 

    address = address.replaceAll(" ","%20");  

    HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false"); 
    HttpClient client = new DefaultHttpClient(); 
    HttpResponse response; 
    stringBuilder = new StringBuilder(); 


     response = client.execute(httppost); 
     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) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return jsonObject; 
} 

निम्नलिखित की तरह HTTP कॉल की प्रतिक्रिया के साथ एक JSONObject रिटर्न बनाने में गूगल प्लेस एपीआई के का उपयोग अब कि JSONObject getLatLong को पारित कर सकते हैं() विधि

public static GeoPoint getLatLong(JSONObject jsonObject) { 

     Double lon = new Double(0); 
     Double lat = new Double(0); 

     try { 

      lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0) 
       .getJSONObject("geometry").getJSONObject("location") 
       .getDouble("lng"); 

      lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0) 
       .getJSONObject("geometry").getJSONObject("location") 
       .getDouble("lat"); 

     } catch (Exception e) { 
      e.printStackTrace(); 

     } 

     return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6)); 
    } 

यह काम करता है और परीक्षण किया जाता है ... एपीआई स्तर 8 पर ... इस सहायता को हॉप करें ..

+0

यह एंड्रॉइड 2.3.3 में मेरे मामले में काम नहीं कर रहा है, यह सिर्फ एक ही त्रुटि दिखा रहा है i.e. कनेक्शन फैक्ट्री क्लाइंट नहीं मिल सका। – Harpreet

+0

यह सभी Google एपीआई 7,8,10 के लिए ठीक काम करता है, मैं सभी पर परीक्षण करूंगा ... कुछ समय पर गलत हो जाता है ... बस अपना कोड पोस्ट करें ... – cyclopes49

+0

यह मेरे लिए भी काम करता है। इससे पहले मैं केएमएल पार्सिंग और उसके सिरदर्द के साथ गड़बड़ कर रहा था। लेकिन यह वास्तव में अच्छा और सरल समाधान है। जीएमपीएस के लिए चीयर्स .. – YuDroid

0

आप श्रीमान द्वारा दिए गए कोड का उपयोग कर सकते हैं।दो कार्यों के रूप में cyclopes49 और जोड़ने समारोह getLatLong() और onCreate() विधि में getLocationInfo() करने के लिए कॉल यह काम करता है नमूना बयान

JSONObject jo = this.getLocationInfo("vizianagaram"); 
GeoPoint p=this.getLatLong(jo); 
Toast.makeText(getBaseContext(), 
         p.getLatitudeE6()/1E6 + "," + 
         p.getLongitudeE6() /1E6 , 
         Toast.LENGTH_SHORT).show(); 

यह ठीक काम करता है है!

2

अक्षांश और देशांतर अपने-अपने मूल्य हैं

Geocoder geocoder = new Geocoder(getBaseContext(), Locale.ENGLISH); 
     try { 
      List<Address> addresses = geocoder.getFromLocation(latitude, 
        longitude, 1); 

      if (addresses.size() > 0) { 
       Address returnedAddress = addresses.get(0); 
       StringBuilder strReturnedAddress = new StringBuilder(
         "Address:\n"); 
       for (int i = 0; i < returnedAddress 
         .getMaxAddressLineIndex(); i++) { 
        strReturnedAddress.append(
          returnedAddress.getAddressLine(i)).append("\n"); 
       } 
       adrs.setText(strReturnedAddress.toString()); 
      } else { 
       adrs.setText("No Address returned!"); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 
1

कोड में एक छोटी सी परिवर्तन से ऊपर, getFromLocationName कॉल जो कुछ टर्मिनलों में समर्थित नहीं लगता को बदलने के लिए अनुमति देते हैं:

private static List<Address> getAddrByWeb(JSONObject jsonObject){ 
    List<Address> res = new ArrayList<Address>(); 
    try 
    { 
     JSONArray array = (JSONArray) jsonObject.get("results"); 
     for (int i = 0; i < array.length(); i++) 
     { 
      Double lon = new Double(0); 
      Double lat = new Double(0); 
      String name = ""; 
      try 
      { 
       lon = array.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getDouble("lng"); 

       lat = array.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getDouble("lat"); 
       name = array.getJSONObject(i).getString("formatted_address"); 
       Address addr = new Address(Locale.getDefault()); 
       addr.setLatitude(lat); 
       addr.setLongitude(lon); 
       addr.setAddressLine(0, name != null ? name : ""); 
       res.add(addr); 
      } 
      catch (JSONException e) 
      { 
       e.printStackTrace(); 

      } 
     } 
    } 
    catch (JSONException e) 
    { 
     e.printStackTrace(); 

    } 

    return res; 
} 

}

4

मैंने @ddewaele द्वारा उल्लिखित चर्चा धागे को पढ़ा, किसी ने कहा कि रीबूट समस्या को हल कर सकता है। यह किया। बीटीडब्ल्यू, मेरे डिवाइस का एंड्रॉइड संस्करण 4.1 है।

+0

धन्यवाद एक टन और हाँ यह .... गंभीरता से एक रिबूट हल हो गया !!!! .. मैं अपने कोड, इंटरनेट अनुमति इत्यादि के साथ पूरे दिन खोज रहा था .... आखिरकार यह मेरा दिन बना लेकिन फिर भी मैंने नहीं किया ' कारण नहीं मिला.अब? –

संबंधित मुद्दे