如何修复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; }
问题排查与解决方案
- API密钥引用错误:代码中直接拼接
R.string.API_key,这是资源ID的整数数值,并非实际的API密钥字符串。需使用getResources().getString(R.string.API_key)获取真实密钥内容。 - 参数拼写错误:
types参数值写成了restraurant,正确拼写为restaurant,该错误会导致请求参数无效,可能触发额外的验证问题。 - 废弃参数移除:
sensor=true参数在Places API中已被废弃,建议移除该参数,避免不必要的请求异常。 - SHA256指纹验证:错误日志中显示的SHA256指纹末尾不完整,需确认开发者控制台中配置的SHA256指纹与应用签名的指纹完全一致,包括调试和发布版本的指纹。
- 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
相关产品推荐
相关产品推荐

