Использование Google Translate API в Android

Я искал повсюду в Интернете использование Google Translate API, но не смог найти учебник по спуску или объяснение. Итак, вот что я сделал:

В моей консоли API Google я сгенерировал ключ в разделе Доступ к публичному API с помощью своего отпечатка пальца SHA1, используя этот ответ. Вот как выглядит моя консоль API: Консоль гугл

В Android Studio я создаю и отправляю свой запрос, используя библиотеку OkHttp с этим кодом:

OkHttpClient client = new OkHttpClient();
    String apiKey = "My API key";
    String apiLangSource = "en";
    String apiLangTarget = "de";
    String apiWord = "Hello";
    String googleApiUrl = "https://www.googleapis.com/language/translate/v2?key=" + apiKey + "&source=" + apiLangSource + "&target=" + apiLangTarget + "&q=" + apiWord;
    Request request = new Request.Builder().url(googleApiUrl).build();

    Log.d(TAG, "API STRING" + googleApiUrl);

    Call call = client.newCall(request);

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {
            Log.d(TAG , "HTTP CALL FAIL");
        }

        @Override
        public void onResponse(Response response) throws IOException {
            Log.d(TAG , response.body().string());

        }
    });

Он работает нормально, но в ответ я получаю:

{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "ipRefererBlocked",
"message": "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.",
"extendedHelp": "https://console.developers.google.com"
}
],
"code": 403,
"message": "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed."
}
}


В чем здесь проблема? Правильно ли настроен мой API? Правильно ли я звоню (я видел некоторые библиотеки, но с гидом)? Это разумный способ использования этой библиотеки? Что именно это означает?

"There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed."

Я думаю, что некоторые демонстрационные звонки доступны бесплатно, и это не проблема здесь.

1 ответ

Проблема заключается в том, что при настройке ограничения ключа API для приложения Android вы указали имя пакета и отпечаток сертификата SHA-1. Поэтому ваш ключ API будет принимать запрос только от вашего приложения с указанным именем пакета и отпечатком сертификата SHA-1.

Итак, как Google узнает, что запрос отправлен с вашего Android-приложения? Вы ДОЛЖНЫ добавить имя пакета вашего приложения и SHA-1 в заголовок каждого запроса со следующими ключами:

Ключ: "X-Android-Package", значение: имя вашего приложения

Ключ: "X-Android-Cert", значение: SHA-1 сертификат вашего apk

Сначала получите подпись SHA вашего приложения (вам понадобится библиотека Guava):

/**
 * Gets the SHA1 signature, hex encoded for inclusion with Google Cloud Platform API requests
 *
 * @param packageName Identifies the APK whose signature should be extracted.
 * @return a lowercase, hex-encoded
 */
public static String getSignature(@NonNull PackageManager pm, @NonNull String packageName) {
    try {
        PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
        if (packageInfo == null
                || packageInfo.signatures == null
                || packageInfo.signatures.length == 0
                || packageInfo.signatures[0] == null) {
            return null;
        }
        return signatureDigest(packageInfo.signatures[0]);
    } catch (PackageManager.NameNotFoundException e) {
        return null;
    }
}

private static String signatureDigest(Signature sig) {
    byte[] signature = sig.toByteArray();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] digest = md.digest(signature);
        return BaseEncoding.base16().lowerCase().encode(digest);
    } catch (NoSuchAlgorithmException e) {
        return null;
    }
}

Затем добавьте имя пакета и подпись сертификата SHA в заголовок запроса:

java.net.URL url = new URL(REQUEST_URL);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
try {
    connection.setDoInput(true);
    connection.setDoOutput(true);

    connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
    connection.setRequestProperty("Accept", "application/json");

    // add package name to request header
    String packageName = mActivity.getPackageName();
    connection.setRequestProperty("X-Android-Package", packageName);
    // add SHA certificate to request header
    String sig = getSignature(mActivity.getPackageManager(), packageName);
    connection.setRequestProperty("X-Android-Cert", sig);
    connection.setRequestMethod("POST");

    // ADD YOUR REQUEST BODY HERE
    // ....................
} catch (Exception e) {
    e.printStackTrace();
} finally {
    connection.disconnect();
}

Надеюсь, это поможет!:)

Другие вопросы по тегам