You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Android应用Places API的‘Invalid key’错误并获取地点JSON数据

Android Places API 请求被拒绝问题排查

问题概述

开发Android应用时使用Places API,通过URL查询地点JSON结果时,Logcat返回错误:

data: {   "error_message": "The provided API key is invalid.",   "html_attributions" : [],   "results" : [],   "status": "REQUEST_DENIED"}

此前使用Maps API显示坐标正常,但Places API标记餐厅位置时出错。已在开发者控制台启用Places API和Android Maps SDK,应用限制设置了正确包名与SHA256指纹,API限制设为“不限制密钥”,代码中API密钥也确认正确。尝试过使用无限制的第二个API密钥、再次确认所需API均已启用,问题仍未解决。

运行时错误日志

java.util.concurrent.ExecutionException: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.project.prayerpal, sha256=[29a99a0744d90545fc8c9b9a2572fc89423676bbd3ff074ea76faa7ff], atk=false, ver=230617044.true (go/gsrlt)
    at ajp.s(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):3)
    at ajp.get(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):2)
    at akz.g(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):2)
    at yr.c(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):1)
    at yt.run(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):0)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:463)
    at java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
    at java.lang.Thread.run(Thread.java:1012)
 Caused by: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.project.prayerpal, sha256=[29a99a0744d90545fc8c9b9a2572fc89423676bbd3ff074ea76faa7ff], atk=false, ver=230617044.true (go/gsrlt)
    at android.os.Parcel.createExceptionOrNull(Parcel.java:2441)
    at android.os.Parcel.createException(Parcel.java:2425)
    at android.os.Parcel.readException(Parcel.java:2408)
    at android.os.Parcel.readException(Parcel.java:2350)
    at ff.c(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):2)
    at ru.a(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):4)
    at jl.e(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):2)
    at kk.t(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):2)
    at kk.u(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):3)
    at kk.e(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):2)
    at ko.handleMessage(:com.google.android.gms.dynamite_mapsdynamite@230617044@23.06.17 (190400-0):69)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loopOnce(Looper.java:233)
    at android.os.Looper.loop(Looper.java:344)
    at android.os.HandlerThread.run(HandlerThread.java:67)

构造请求URL的代码

public StringBuilder queryString(){

    double Latitude = 48.8566;
    double Longitude = 2.3522;

    StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
    sb.append("location=" + Latitude + "," + Longitude);
    sb.append("&radius=5000");
    sb.append("&types=" + "restraurant");
    sb.append("&sensor=true");
    sb.append("&key=" + R.string.API_key);

    return sb;
}

从URL获取数据的代码

private String downloadUrl(String strUrl) throws IOException{

    String data = "";
    InputStream iStream = null;
    HttpURLConnection urlConnection = null;

    try {
        URL url = new URL(strUrl);

        urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.connect();

        iStream = urlConnection.getInputStream();

        BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

        StringBuffer sb = new StringBuffer();

        String line = "";

        while((line = br.readLine()) != null){

            sb.append(line);
        }

        data = sb.toString();

        br.close();
    }catch (Exception e){

        Log.d("error", "downloading url failed");
    }finally {

        assert iStream != null;
        iStream.close();
        urlConnection.disconnect();
    }

    return data;
}

问题排查与解决方案

  1. API密钥引用错误:代码中直接拼接R.string.API_key,这是资源ID的整数数值,并非实际的API密钥字符串。需使用getResources().getString(R.string.API_key)获取真实密钥内容。
  2. 参数拼写错误:types参数值写成了restraurant,正确拼写为restaurant,该错误会导致请求参数无效,可能触发额外的验证问题。
  3. 废弃参数移除:sensor=true参数在Places API中已被废弃,建议移除该参数,避免不必要的请求异常。
  4. SHA256指纹验证:错误日志中显示的SHA256指纹末尾不完整,需确认开发者控制台中配置的SHA256指纹与应用签名的指纹完全一致,包括调试和发布版本的指纹。
  5. API版本确认:确保启用的是对应版本的Places API(新版/旧版),不同版本的密钥权限要求不同,若使用旧版需确认是否已正确启用。

修改后的queryString代码示例:

public StringBuilder queryString(){

    double Latitude = 48.8566;
    double Longitude = 2.3522;
    String apiKey = getResources().getString(R.string.API_key);

    StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
    sb.append("location=" + Latitude + "," + Longitude);
    sb.append("&radius=5000");
    sb.append("&types=restaurant");
    sb.append("&key=" + apiKey);

    return sb;
}

内容的提问来源于stack exchange,提问作者Zahid Habib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:02:13