调用placesClient.findAutocompletePredictions始终失败,已启用Places API仍报错
问题:Places Autocomplete预测任务始终失败,提示“prediction fetching task unsuccessful”
我使用placesClient.findAutocompletePredictions获取位置建议并设置到搜索栏,但调用代码时任务始终失败,我已经启用了Places API,请问原因是什么?
代码如下:
@Override public void onTextChanged(CharSequence s, int start, int before, int count) { AutocompleteSessionToken token = AutocompleteSessionToken.newInstance(); FindAutocompletePredictionsRequest predictionsRequest = FindAutocompletePredictionsRequest.builder() .setCountry("sa") .setTypeFilter(TypeFilter.ADDRESS) .setSessionToken(token) .setQuery(s.toString()) .build(); placesClient.findAutocompletePredictions(predictionsRequest).addOnCompleteListener(new OnCompleteListener<FindAutocompletePredictionsResponse>() { @Override public void onComplete(@NonNull Task<FindAutocompletePredictionsResponse> task) { if (task.isSuccessful()) { FindAutocompletePredictionsResponse predictionsResponse = task.getResult(); if (predictionsResponse != null) { predictionList = predictionsResponse.getAutocompletePredictions(); List<String> suggestionsList = new ArrayList<>(); for (int i = 0; i < predictionList.size(); i++) { AutocompletePrediction prediction = predictionList.get(i); suggestionsList.add(prediction.getFullText(null).toString()); } materialSearchBar.updateLastSuggestions(suggestionsList); if (!materialSearchBar.isSuggestionsVisible()) { materialSearchBar.showSuggestionsList(); } } } else { Log.i("mytag", "prediction fetching task unsuccessful"); } } }); }
回答
我来帮你一步步排查这个问题,任务失败不一定只是API密钥的锅,我们从几个关键方向分析:
1. 先排查API密钥的核心细节
你说已经启用了Places API,但还有几个容易忽略的点:
- 密钥的权限与限制:检查Google Cloud控制台中你的API密钥是否绑定了正确的Android包名和SHA-1指纹。如果密钥设置了应用限制,而你的测试设备/包名不匹配,请求会直接失败。
- 确认启用的是正确的API:确保你启用的是Google Places API(而非旧版的Places SDK for Android),新的
placesClient依赖这个API提供服务。 - 额度与计费:检查是否超出了Places API的免费调用额度,或者是否未设置计费账户(部分API需要绑定计费才能正常使用,即使在免费额度内)。
2. 检查placesClient的初始化是否正确
如果placesClient没有正确初始化,后续所有请求都会失败。确认你在Activity/Fragment的onCreate中完成了初始化:
// 在onCreate中执行 Places.initialize(getApplicationContext(), "你的API密钥"); PlacesClient placesClient = Places.createClient(this);
如果初始化时API密钥错误,或者没有调用Places.initialize,placesClient会处于无效状态,导致请求失败。
3. 补充错误日志,获取具体失败原因
你当前只打印了任务失败的提示,但没有获取具体的异常信息。修改onComplete的失败分支,打印异常详情:
} else { Log.e("mytag", "prediction fetching failed", task.getException()); }
这会帮你直接定位问题:比如是API_KEY_INVALID、PERMISSION_DENIED、NETWORK_ERROR等,这是最有效的排查步骤。
4. 检查基础配置
- 网络权限:确保你的
AndroidManifest.xml中添加了互联网权限:
没有这个权限,应用无法发起网络请求,任务必然失败。<uses-permission android:name="android.permission.INTERNET" /> - 国家代码与类型过滤:
setCountry("sa")是沙特阿拉伯的正确代码,TypeFilter.ADDRESS也没问题,但如果你的测试输入确实没有匹配的地址结果,任务会成功但返回空列表——但你现在是任务失败,所以这不是原因。
先按上述步骤排查,尤其是打印异常信息,几乎能直接找到问题所在。
内容的提问来源于stack exchange,提问作者Aymen Ncr
相关产品推荐
相关产品推荐

