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).
- Android okHttp addFormDataPart dinámicamente para múltiples imágenes
- Cambiar valores en matriz no se propaga en la aplicación
- Obtener un contexto para su uso en AndroidTestCase cuando la clase bajo prueba no es una actividad
- ¿Cómo puedo hacer que mi código sea seguro? - Privado vs. Pública
- Solicitudes HTTP de Android que funcionan en el simulador, pero no en dispositivo de uso
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)
- Cómo guardar información de ubicación en Firebase
- Obtener "EVP_DecryptFinal_ex: longitud de bloque final errónea" durante el desencriptado
- Cookies persistentes de Android HttpClient
- Apache HttpClient HttpRequestRetryHandler nunca invocado
- EditText en un adaptador de lista, cómo guardar el valor?
- Android.database.CursorIndexOutOfBoundsException
- Cómo ejecutar script matlab desde java (para android) usando matlabcontol.jar
- Android cursor cómo obtener valores nulos de columnas
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!
- Generar firmado APK: Errores mientras se construye APK Android Studio
- ¿Cómo crear este tipo de Listview en Android?