2015-07-23 18 views
6

Internet'te Google Translate API kullanımı için her yerde arama yaptım, ancak iniş eğitimini veya açıklamasını bulamadım. Yani, işte yaptığım şey:

Google API Konsolu'nda, this cevabını kullanarak SHA1 Fingerprint ile Public API erişimi altında bir anahtar oluşturdum. Ben oluşturmak ve bu kodla OkHttp kitaplığı kullanarak benim isteği göndermek Android stüdyoda Google consoleGoogle Translate API'nin Android'de Kullanımı

: Burada gibi benim API konsolu böyle görünüyor

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

     } 
    }); 

Bu iyi çalışır ama tepkisi üzerinde alıyorum:

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


Burada sorun nedir? API'm doğru ayarlandı mı? Aramayı doğru bir şekilde yapıyorum (bazı kütüphaneler gördüm ama rehberlik yaptım)? Bu kütüphaneyi kullanmanın makul bir yolu var mı? Bu ne demek oluyor?

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

Bazı demo çağrılarının ücretsiz olduğunu düşünüyorum ve buradaki sorun bu değil.

+0

Ben API yapılandırma iyi finished.U API tuş üzerinde yapılandırılan yanıt 'kısıtlama görebileceğiniz değil sanırım ve ben parmak izini çıkarmak ve o inşaat paketlediğinizde isteği –

+1

match' etmez. Yani gerçekten kimlik doğrulama hatası. Google parmak izimi ve paketimi nasıl doğrular? – BabbevDan

+0

Aynı sorunla karşılaşıyorum. @DannyBabbev, bunun için bir çözüm buldunuz mu? – Flo

cevap

1

Android uygulaması için API anahtar kısıtlamanızı ayarlarken sorun, paket adı ve SHA-1 sertifikası parmak izini belirlemiş olmanızdır. Bu nedenle API anahtarınız, yalnızca paket adı ve belirtilen SHA-1 sertifikası parmak izi ile uygulamanızdan gelen isteği kabul edecektir.

Peki, isteğinizin ANDROID APP'DEN FROM'DAN nasıl gönderildiğini biliyor musunuz?

Anahtar: "X-Android-Package", değeri:

Key uygulama paket adı: "X-Android-Cert", değeri: SHA-1 belgesi aşağıdaki anahtarlarla her istek başlığında uygulamanızın paket adını ve SHA-1 ekleyin GEREKİR senin Apk

İLK, uygulama SHA imza almak (eğer Guava kütüphane gerekiyor): Sonra

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

paket adı ve SHA sertifika imza başlığını istemek için ekleyin:

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

Bu yardımı umarım! :)

İlgili konular