Android Place SDK使用绑定包名与SHA1的受限API密钥未授权报错问题
问题核心原因
当前项目引入的com.google.maps:google-maps-services是面向服务端场景的Java客户端工具库,并非Android平台专用的Places SDK。这类服务端库发起网络请求时,不会携带Android密钥校验所要求的应用包名、签名SHA1等鉴权参数,仅会以设备当前的公网IP对外发起请求,因此会直接触发鉴权校验失败,弹出“IP、站点或移动应用未被授权”的报错,且请求无referer信息。
另外原有代码中使用.await()的同步阻塞调用方式,在Android 4.0以上系统会直接触发主线程网络请求异常,无法正常运行。
具体修正步骤
- 替换错误依赖
首先移除不适用于Android场景的服务端库依赖:
引入Google官方Android专用Places SDK依赖:implementation 'com.google.maps:google-maps-services:0.18.0'
原有单独引入的implementation 'com.google.android.libraries.places:places:3.5.0'implementation 'com.squareup.okhttp3:okhttp:4.9.0'可保留,Android专用Places SDK已内置兼容版本的okhttp组件,无需额外调整。 - 重构业务调用逻辑
原代码中基于GeoApiContext、同步等待的调用逻辑全部来自服务端库,需替换为Android SDK提供的标准异步接口逻辑:- 在应用初始化阶段(如
Application.onCreate())完成SDK初始化:// 初始化Places SDK,绑定当前应用上下文与API密钥 Places.initialize(getApplicationContext(), BuildConfig.MAPS_API_KEY); // 创建全局可复用的Places客户端实例 PlacesClient placesClient = Places.createClient(this); - 替换原有附近搜索逻辑,使用异步接口发起请求,避免阻塞主线程:
public void fetchNearbyBakery(LatLng location) { // 构造附近位置搜索请求 NearbySearchRequest searchRequest = placesClient.newNearbySearchRequest(); searchRequest.setLocation(Location.newInstance(location.latitude, location.longitude)); searchRequest.setRadius(5000); searchRequest.setKeyword("Shivam"); searchRequest.setType(Place.Type.BAKERY); // 异步执行请求,通过回调获取执行结果 searchRequest.execute() .addOnSuccessListener(response -> { List<Place> resultList = response.getResults(); // 在此处处理业务返回的搜索结果 }) .addOnFailureListener(error -> { // 在此处处理异常逻辑 error.printStackTrace(); }); }
- 在应用初始化阶段(如
- 校验云控制台配置
- 在Google Cloud控制台开启Places API for Android接口,不要仅开启适配服务端场景的通用Places API
- 核对Android API密钥的访问限制配置:确保填入的SHA1签名包含当前调试、正式编译场景使用的所有证书指纹,且配置的包名与应用实际的
applicationId完全匹配
内容的提问来源于stack exchange,提问作者Smeet
相关产品推荐
相关产品推荐

