所以我正在尝试将 Places API 用于 Android 应用程序。我使用了正确的 URL 来查询地点的 JSON 结果,但是当我运行该应用程序时,我在我的 logcat 中收到此错误:
data: { "error_message": "The provided API key is invalid.", "html_attributions" : [], "results" : [], "status": "REQUEST_DENIED"}
.
当我使用 Maps API 在地图上显示当前坐标时它起作用了,但现在我希望它使用 Places API 在地图上标记 restrarunts 的特定位置时出现错误。
我的开发者控制台启用了 Places API 和 Maps SKD for android。应用程序限制设置为 android 应用程序,并提供正确的包名称和指纹。 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@[email protected] (190400-0):3)
at ajp.get(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):2)
at akz.g(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):2)
at yr.c(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):1)
at yt.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (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@[email protected] (190400-0):2)
at ru.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):4)
at jl.e(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):2)
at kk.t(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):2)
at kk.u(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):3)
at kk.e(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):2)
at ko.handleMessage(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (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;
}