Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android应用程序中使用Google公共API访问密钥?_Android_Google Translate - Fatal编程技术网

如何在android应用程序中使用Google公共API访问密钥?

如何在android应用程序中使用Google公共API访问密钥?,android,google-translate,Android,Google Translate,我想在我的android应用程序中使用谷歌翻译API(v2) 我所做的: 在Google开发者控制台中创建项目 设置此项目的帐单 为android应用程序生成2个公共api访问密钥: a。第一个接受任何应用程序请求的应用程序 b。第二个仅接受来自我的应用程序的请求 我试图通过 它适用于3a)中的钥匙,但不适用于3b)中的钥匙。对于3b)服务器发送 { "error": { "errors": [ { "domain": "usageLimits", "reason"

我想在我的android应用程序中使用谷歌翻译API(v2)

我所做的:

  • 在Google开发者控制台中创建项目
  • 设置此项目的帐单
  • 为android应用程序生成2个公共api访问密钥:

    a。第一个接受任何应用程序请求的应用程序

    b。第二个仅接受来自我的应用程序的请求

  • 我试图通过

    它适用于3a)中的钥匙,但不适用于3b)中的钥匙。对于3b)服务器发送

    {
     "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."
     }
    }
    
    我猜这是因为谷歌服务器没有收到关于我的应用程序的任何信息,所以它无法获取密钥3b)。如果是,如何正确发送此请求?或者,我在别的地方做错了什么

    如果是,如何正确发送此请求

    为android应用程序设置API密钥限制时,您指定了包名和SHA-1证书指纹。因此,当您向Google发送请求时,您必须在每个请求的标题中添加这些信息

    怎么做

    ,您需要从代码中获取包名和SHA证书,然后添加到请求头

    获取SHA证书:

    /**
     * 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;
        }
    }
    
    添加到请求标头:

    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();
    }
    
    你可以看到完整的答案

    享受编码:)