Error de HttpsURLConnectionImpl.getInputStream () en la plataforma Android

Aquí está mi tarea. Dado un par de latitud y longitud, quiero obtener un JSON de la API de Google Places. La función siguiente, reverseGeoCoding, devuelve el String JSON.

public String reverseGeoCoding(String lat, String lng) { latitude = lat; longitude = lng; String json = new String(); String url = new String(); URL googleAPI; try { url = URL + "location=" + latitude + "," + longitude + "&" + "radius=" + radius + "&" + "language=" + language + "&" + "sensor=false" + "&" + "key=" + APIKey; googleAPI = new URL(url); Log.d("TEST", googleAPI.toString()); URLConnection gc = (URLConnection) googleAPI.openConnection(); Log.d("TEST", gc.toString()); InputStream is = gc.getInputStream(); Log.d("TEST", "InputStream created"); BufferedReader in = new BufferedReader(new InputStreamReader(is)); Log.d("TEST", "reader created"); String inputLine; while ((inputLine = in.readLine()) != null) { json = json + inputLine + "\n"; Log.d("TEST", inputLine); } in.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return json; } 

Sin embargo, getInputStream () no funciona. He comprobado la petición de url en el web browser, y funcionó correctamente (returing un documento de JSON).

Los mensajes de error están debajo. (Por qué las líneas 17 y 18 producen los errores)

 1. 12-11 00:46:02.862: W/System.err(12953): android.os.NetworkOnMainThreadException 2. 12-11 00:46:02.872: W/System.err(12953): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 3. 12-11 00:46:02.872: W/System.err(12953): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 4. 12-11 00:46:02.872: W/System.err(12953): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 5. 12-11 00:46:02.872: W/System.err(12953): at java.net.InetAddress.getAllByName(InetAddress.java:220) 6. 12-11 00:46:02.872: W/System.err(12953): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 7. 12-11 00:46:02.872: W/System.err(12953): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 8. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 9. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 10. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 11. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 12. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460) 13. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) 14. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 15. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 16. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 17. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 18. 12-11 00:46:02.894: W/System.err(12953): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270) 19. 12-11 00:46:02.894: W/System.err(12953): at locationpredict.POIList.reverseGeoCoding(POIList.java:55) 20. 12-11 00:46:02.894: W/System.err(12953): at locationpredict.TestMain$1.onClick(TestMain.java:62) 

Debido a que las personas que utilizan la operación de red pesada en el hilo principal que conduce a la falta de respuesta de la aplicación, esta nueva función se ha añadido para evitar que la gente lo haga.
Debe utilizar AsyncTask o servicio para hacer esto.

  private class GetJsonTask extends AsyncTask<String, Void, String>{ @Override protected String doInBackground(String... params) { try { latitude = params[0]; longitude = params[1]; String json = new String(); String url = new String(); URL googleAPI; url = URL + "location=" + latitude + "," + longitude + "&" + "radius=" + radius + "&" + "language=" + language + "&" + "sensor=false" + "&" + "key=" + APIKey; googleAPI = new URL(url); Log.d("TEST", googleAPI.toString()); URLConnection gc = (URLConnection) googleAPI.openConnection(); Log.d("TEST", gc.toString()); InputStream is = gc.getInputStream(); Log.d("TEST", "InputStream created"); BufferedReader in = new BufferedReader(new InputStreamReader(is)); Log.d("TEST", "reader created"); String inputLine; while ((inputLine = in.readLine()) != null) { json = json + inputLine + "\n"; Log.d("TEST", inputLine); } in.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return json; } @Override protected void onPostExecute(String result) { parseJson(result); // json should be stored in the result } } private void parseJson(String json){ JSONObject obj = new JSONObject(json); .... } 

Llámelo así:

 String[] data = new String[2]; data[0] = lat; data[1] = long; new GetJsonTask().execute(data); 

O puede evitarlo agregando el siguiente código en su método onCreate () antes de llamar al método, pero no recomiendo este método. Sólo úselo para las pruebas.

  if( Build.VERSION.SDK_INT >= 9){ StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } 

> Android.os.NetworkOnMainThreadException:

La excepción que se activa cuando una aplicación intenta realizar una operación de red en su subproceso principal.

Utilice AsyncTask para evitar este error. Y poner todas las tareas relacionadas con la red dentro del método doInBackground de AsyncTask

Como sugieren otras respuestas, utilice la tarea asíncrona. También recomendamos gson para convertir objetos de / a json strings!

  • Android - ¿Cómo almacenar certificado en keystore mediante programación?
  • ActionBar no funciona al extender ListActivity
  • Error en la configuración de Android Studio JDK
  • Obtener el índice de un elemento de matriz basado en el valor
  • Hay Backgroundworker para java (como en .Net)
  • Singletons vs. Contexto de la aplicación en Android?
  • Al extraer adt-bundle-windows-x86_64-20140702 este error de Windows 8
  • Problemas con la carga de anuncios de AdMob en la aplicación
  • org.w3c.dom.Node con la versión de Android menos de 2.2
  • Android: Carga de una foto en Cloudinary con devolución de llamada de progreso en HttpURLConnection
  • No se puede registrar la llamada usando MediaRecorder
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.