Android 无法使用Google云翻译API限制API密钥

Android 无法使用Google云翻译API限制API密钥,android,google-translate,Android,Google Translate,为了使用google translate api,我已经创建了api密钥,当我使用下面的代码时,我没有问题: private String translateText(String toTrasnlate){ TranslateOptions options = TranslateOptions.newBuilder() .setApiKey("XXXXXXXXXXXXXXXXXXXXX_XXXXXXXX") .build(); Translate transla

为了使用google translate api,我已经创建了api密钥,当我使用下面的代码时,我没有问题:

private String translateText(String toTrasnlate){
TranslateOptions options = TranslateOptions.newBuilder()
        .setApiKey("XXXXXXXXXXXXXXXXXXXXX_XXXXXXXX")
        .build();
Translate translate = options.getService();
Translation translation = translate.translate(toTrasnlate, Translate.TranslateOption.targetLanguage("en"));
return translation.getTranslatedText();
}
但是,当我在google开发者控制台中使用SHA1键和包添加限制时,我跳过了以下错误,你知道为什么会这样,我可以在哪里继续?。 问候和感谢

07-12 14:23:39.491 805-805/com.example.translator E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.translator, PID: 805
com.google.cloud.translate.TranslateException: Requests from this Android client application <empty> are blocked.
at com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:61)
at com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:143)
at com.google.cloud.translate.TranslateImpl$4.call(TranslateImpl.java:113)
at com.google.cloud.translate.TranslateImpl$4.call(TranslateImpl.java:110)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:94)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:54)
at com.google.cloud.translate.TranslateImpl.translate(TranslateImpl.java:110)
at com.google.cloud.translate.TranslateImpl.translate(TranslateImpl.java:124)
at com.example.translator.MainActivity.translateText(MainActivity.java:347)
at com.example.translator.MainActivity.access$500(MainActivity.java:46)
at com.example.translator.MainActivity$5.onClick(MainActivity.java:121)
at android.view.View.performClick(View.java)
at android.view.View$PerformClick.run(View.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden

{                                                                                  
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Requests from this Android client application <empty> are blocked.",
"reason" : "forbidden"
} ],
"message" : "Requests from this Android client application <empty> are blocked.",
"status" : "PERMISSION_DENIED"
}

at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:129)
... 19 more
07-12 14:23:39.491 805-805/com.example.translator E/AndroidRuntime:FATAL EXCEPTION:main
进程:com.example.translator,PID:805
com.google.cloud.translate.TranslateException:来自此Android客户端应用程序的请求被阻止。
位于com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:61)
位于com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:143)
位于com.google.cloud.translate.TranslateImpl$4.call(TranslateImpl.java:113)
位于com.google.cloud.translate.TranslateImpl$4.call(TranslateImpl.java:110)
在com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:94)
位于com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:54)
位于com.google.cloud.translate.TranslateImpl.translate(TranslateImpl.java:110)
位于com.google.cloud.translate.TranslateImpl.translate(TranslateImpl.java:124)
位于com.example.translator.MainActivity.translateText(MainActivity.java:347)
com.example.translator.MainActivity.access$500(MainActivity.java:46)
位于com.example.translator.MainActivity$5.onClick(MainActivity.java:121)
在android.view.view.performClick(view.java)中
在android.view.view$PerformClick.run(view.java)中
位于android.os.Handler.handleCallback(Handler.java)
位于android.os.Handler.dispatchMessage(Handler.java)
位于android.os.Looper.loop(Looper.java)
位于android.app.ActivityThread.main(ActivityThread.java)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
原因:com.google.api.client.googleapis.json.GoogleJsonResponseException:403禁止
{                                                                                  
“代码”:403,
“错误”:[{
“域”:“全局”,
“消息”:“来自此Android客户端应用程序的请求被阻止。”,
“原因”:“禁止”
} ],
“消息”:“来自此Android客户端应用程序的请求被阻止。”,
“状态”:“权限被拒绝”
}
位于com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.NewExceptionError(AbstractGoogleJsonClientRequest.java:113)
位于com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.NewExceptionError(AbstractGoogleJsonClientRequest.java:40)
位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
位于com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
位于com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:129)
... 还有19个

现在可能太晚了,但这是如何做到的:

val headers: Map<String, String> = ImmutableMap.of(
            "X-Android-Package", context.packageName,
            "X-Android-Cert", (getApplicationSignature(context)[0])
    )

val options = TranslateOptions.newBuilder()
            .setApiKey(apiKey)
            .setHeaderProvider { headers }
            .build()
val headers:Map=ImmutableMap.of(
“X-Android-Package”,context.packageName,
“X-Android-Cert”,(getApplicationSignature(上下文)[0])
)
val options=TranslateOptions.newBuilder()
.setApiKey(apiKey)
.setHeaderProvider{headers}
.build()
为了得到SHA1:

fun getApplicationSignature(context: Context, packageName: String = context.packageName): List<String> {
val signatureList: List<String>
try {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        // New signature
        val sig = context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES).signingInfo
        signatureList = if (sig.hasMultipleSigners()) {
            // Send all with apkContentsSigners
            sig.apkContentsSigners.map {
                val digest = MessageDigest.getInstance("SHA1")
                digest.update(it.toByteArray())
                bytesToHex(digest.digest())
            }
        } else {
            // Send one with signingCertificateHistory
            sig.signingCertificateHistory.map {
                val digest = MessageDigest.getInstance("SHA1")
                digest.update(it.toByteArray())
                bytesToHex(digest.digest())
            }
        }
    } else {
        val sig = context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures
        signatureList = sig.map {
            val digest = MessageDigest.getInstance("SHA1")
            digest.update(it.toByteArray())
            bytesToHex(digest.digest())
        }
    }

    return signatureList
} catch (e: Exception) {
    // Handle error
}
return emptyList()
}



fun bytesToHex(bytes: ByteArray): String {
    val hexArray = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F')
    val hexChars = CharArray(bytes.size * 2)
    var v: Int
    for (j in bytes.indices) {
        v = bytes[j].toInt() and 0xFF
        hexChars[j * 2] = hexArray[v.ushr(4)]
        hexChars[j * 2 + 1] = hexArray[v and 0x0F]
    }
    return String(hexChars)
}
fun getApplicationSignature(context:context,packageName:String=context.packageName):列表{
val签名者:列表
试一试{
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.P){
//新签名
val sig=context.packageManager.getPackageInfo(packageName,packageManager.GET_SIGNING_CERTIFICATES)。signingInfo
signatureList=if(sig.hasMultipleSigners()){
//使用apkContentsSigners发送所有
sig.apkContentsSigners.map{
val digest=MessageDigest.getInstance(“SHA1”)
digest.update(it.toByteArray())
bytesToHex(digest.digest())
}
}否则{
//发送一份带有签名证书的历史记录
sig.signingCertificateHistory.map{
val digest=MessageDigest.getInstance(“SHA1”)
digest.update(it.toByteArray())
bytesToHex(digest.digest())
}
}
}否则{
val sig=context.packageManager.getPackageInfo(packageName,packageManager.GET_SIGNATURES).SIGNATURES
signatureList=sig.map{
val digest=MessageDigest.getInstance(“SHA1”)
digest.update(it.toByteArray())
bytesToHex(digest.digest())
}
}
返回签名者
}捕获(e:例外){
//处理错误
}
返回空列表()
}
趣味bytesToHex(字节:ByteArray):字符串{
val hexArray=charArrayOf('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'))
val hexChars=charray(bytes.size*2)
变量v:Int
for(以字节为单位的j.索引){
v=字节[j].toInt()和0xFF
hexChars[j*2]=hexArray[v.ushr(4)]
hexChars[j*2+1]=hexArray[v和0x0F]
}
返回字符串(十六进制字符)
}

兄弟,你找到解决方案了吗?