2015-07-23 16 views
6

Ho cercato ovunque in Internet per l'utilizzo dell'API di Google Translate ma non sono riuscito a trovare tutorial o spiegazioni sulla discesa. Quindi, ecco cosa ho fatto:

Nella mia console API di Google ho generato una chiave sotto accesso API pubblica con il mio impronta digitale SHA1 utilizzando la risposta this. Ecco come la mia console API assomiglia: Google consoleUtilizzo dell'API di Google Traduttore in Android

In studio Android ho costruire e inviare la mia richiesta utilizzando biblioteca OkHttp con questo codice:

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()); 

     } 
    }); 

Funziona benissimo, ma sulla risposta ottengo:

{ 
"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." 
} 
} 


Qual è il problema qui? La mia API è impostata correttamente? Sto facendo la chiamata correttamente (ho visto alcune librerie ma con la guida)? Questo modo ragionevole di usare questa libreria? Che cosa significa questo?

"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." 

Penso che ci siano alcune chiamate demo disponibili gratuitamente e questo non è il problema qui.

+0

Immagino che la tua configurazione dell'API non sia ben rifinita.Posso vedere risposta 'restrizione configurata sulla tua chiave API e la richiesta non corrisponde' –

+1

Quando rimuovo l'impronta digitale e il pacchetto funziona. Quindi è davvero un errore di autenticazione. In che modo Google verifica la mia impronta digitale e il pacchetto? – BabbevDan

+0

Sto incontrando lo stesso problema. @DannyBabbev, hai trovato una soluzione per questo? – Flo

risposta

1

Il problema si verifica quando si imposta la restrizione della chiave API per l'app Android, si specifica il nome del pacchetto e l'impronta digitale del certificato SHA-1. Pertanto, la tua chiave API accetterà solo la richiesta dalla tua app con il nome del pacchetto e l'impronta del certificato SHA-1 specificata.

Quindi, come Google conosce la richiesta inviata dall'APP ANDROID? È necessario aggiungere il nome del pacchetto della tua app e SHA-1 nell'intestazione di ogni richiesta con i seguenti tasti:

chiave: "X-Android-Package", il valore: la vostra applicazione nome del pacchetto

chiave: "X-Android-Cert", valore: SHA-1 certificato di il tuo apk

primo luogo, ottenere la vostra applicazione firma SHA (è necessario Guava biblioteca):

/** 
* 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; 
    } 
} 

Quindi, aggiungere il nome del pacchetto e SHA firma del certificato di richiedere intestazione:

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(); 
} 

Spero che questo aiuto! :)

Problemi correlati