Android: получение HTTP 403 запрещено при вызове https://maps.googleapis.com/maps/api/geocode/json

Я пытался использовать API Google, в частности этот URL-адрес, чтобы получить штат и город США, и я продолжаю получать сообщение об ошибке 403 Forbidden HTTP. Мой код выглядит следующим образом:

private static boolean getAddressResult(String input, StringBuilder jsonResults) {
    HttpURLConnection conn = null;
    try {

        String mapUrl;
        StringBuilder sb = new StringBuilder(https://maps.googleapis.com/maps/api/geocode/json);
        sb.append("?sensor=false&address=" + URLEncoder.encode(input, "utf8"));

        mapUrl = sb.toString();

        URL url = new URL(mapUrl);

        Logger.d(TAG, ""+ url);
        Logger.d(TAG, "trying to read");

        conn = (HttpURLConnection) url.openConnection();


        int status = conn.getResponseCode();

        Logger.d(TAG, "status: "+ status);
        InputStreamReader in = new InputStreamReader(conn.getInputStream());

        // Load the results into a StringBuilder
        int read;
        char[] buff = new char[1024];
        long currentTime = System.currentTimeMillis();

        while ((read = in.read(buff)) != -1) {
            Logger.d("NetworkUtil", "trying to parse");

            long elapsedTime = System.currentTimeMillis();
            if(elapsedTime-currentTime>=5000)
                return false;
            jsonResults.append(buff, 0, read);
        }
    } catch (MalformedURLException e) {
        Logger.e(LOG_TAG, "Error processing Places API URL", e);
        return true;
    } catch (IOException e) {
        Logger.e(LOG_TAG, "Error connecting to Places API", e);
        return true;
    } finally {
        if (conn != null) {
            conn.disconnect();
        }
    }
    return false;
}

Я пробовал разные альтернативы, включая изменение URL-адреса с HTTP на HTTPS, я не уверен, что именно мне не хватает на данный момент, было несколько случаев, когда этот вызов веб-службы возвращался с успехом 200, но большую часть времени это просто терпит неудачу с кодом 403 HTTP ERROR, любой совет будет полезен на этом этапе, я также прикрепляю журнал от Logcat:

 Error connecting to Places API
java.io.FileNotFoundException: https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=08080
        at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:186)
        at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
        at .getAddressResult(NetworkUtil.java:217)
        at .access$000(NetworkUtil.java:30)
        at $ResolveCityTask.doInBackground(NetworkUtil.java:81)
        at $ResolveCityTask.doInBackground(NetworkUtil.java:42)

person MR Mido    schedule 12.03.2015    source источник
comment
может нет подключения к сети?   -  person Scary Wombat    schedule 13.03.2015


Ответы (1)


  1. Параметр sensor больше не требуется.
  2. Также вы не указали API_KEY в URL-адресе вашего запроса.
  3. строка StringBuilder должна быть заключена в двойные кавычки.
  4. Ваша адресная строка из logcat — 08080, которая должна быть строкой символов.
  5. Вы должны выполнить свой запрос API в фоновом потоке.

Примерный URL-адрес запроса API должен выглядеть следующим образом: https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=API_KEY

Пример измененного кода:

String API_KEY = "YOUR_API_KEY_STRING";
String input = "1600+Amphitheatre+Parkway,+Mountain+View,+CA";

private static boolean getAddressResult(String input, StringBuilder jsonResults) {
    try {

        URL requestUrl = new URL("https://maps.googleapis.com/maps/api/geocode/json?address=" + input " + &key=" + API_KEY;
            );
        HttpURLConnection connection = (HttpURLConnection)requestUrl.openConnection();
        connection.setRequestMethod("GET");
        connection.connect();


        responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {

            BufferedReader reader = null;

            InputStream inputStream = connection.getInputStream();
            StringBuffer buffer = new StringBuffer();
            if (inputStream == null) {
                // Nothing to do.
                return false;
            }
            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                long elapsedTime = System.currentTimeMillis();
                if(elapsedTime-currentTime>=5000) {
                   return false;
                }
                buffer.append(line + "\n");
            }

            if (buffer.length() == 0) {
                return false;
            }

            Log.d("Test", buffer.toString());
            return buffer.toString();
        }
        else {
            Log.i(TAG, "Unsuccessful HTTP Response Code: " + responseCode);
            return false
        }
    } catch (MalformedURLException e) {
        Log.e(LOG_TAG, "Error processing Places API URL", e);
        return false;
    } catch (IOException e) {
        Log.e(LOG_TAG, "Error connecting to Places API", e);
        return false;
    } catch (Expcetion e) {
        return false;
    }
    return false;
}

Этот пример кода должен быть запущен внутри вашего фонового метода.

также необходимо убедиться, что в файл манифеста добавлено разрешение на доступ в Интернет. <uses-permission android:name="android.permission.INTERNET" />

Вы также можете проверить подключение к Интернету, добавив <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> и вызвав этот метод, чтобы узнать, подключен ли ваш Интернет:

 private boolean isNetworkAvailable() {
        ConnectivityManager manager = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();

        boolean isAvailable = false;
        if (networkInfo != null && networkInfo.isConnected()) {
            isAvailable = true;
        }
        return isAvailable;
    }
person ztan    schedule 13.03.2015