Android 无法使用Google云翻译API限制API密钥
为了使用google translate 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
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]
}
返回字符串(十六进制字符)
}
兄弟,你找到解决方案了吗?