为何从Google Places API获取的Locale始终为null?
我来帮你梳理下这个问题的原因和解决办法:
首先要明确:Place对象本身并没有一个直接返回完整Locale的字段,你拿到null是因为默认请求的字段里不包含语言/地区相关的信息,而且Places SDK也不会自动填充这个值。你能正常获取名称、地址、经纬度,是因为这些属于默认请求的基础字段,但Locale相关数据需要你主动指定请求。
下面是具体的解决思路:
主动请求语言代码字段
在调用fetchPlace()获取地点详情时,你需要明确添加Place.Field.LANGUAGE_CODE到请求字段列表中,这样才能拿到地点对应的语言代码,再用这个代码构建Locale。示例代码如下:// 构建需要请求的字段列表,加入LANGUAGE_CODE val requiredFields = listOf( Place.Field.NAME, Place.Field.ADDRESS, Place.Field.LAT_LNG, Place.Field.LANGUAGE_CODE, Place.Field.COUNTRY // 可选,用来获取国家代码,构建更准确的Locale ) val fetchRequest = FetchPlaceRequest.newInstance(placeId, requiredFields) placesClient.fetchPlace(fetchRequest) .addOnSuccessListener { response -> val targetPlace = response.place targetPlace.languageCode?.let { langCode -> // 如果有国家代码,可以结合起来构建完整Locale val countryCode = targetPlace.country val locale = if (countryCode != null) { Locale(langCode, countryCode) } else { Locale(langCode) } // 这里就可以使用构建好的locale了 } ?: run { // 如果语言代码为空,可以考虑用设备Locale作为 fallback val fallbackLocale = Locale.getDefault() } }通过地点属性推断Locale
如果某些地点没有返回语言代码,你可以通过获取地点的国家/地区信息(请求Place.Field.COUNTRY或Place.Field.ADMINISTRATIVE_AREA),结合常见的地区语言来推断Locale。比如拿到国家代码"FR",就可以默认使用Locale.FRENCH。关于API密钥的疑问
你用之前Maps的API密钥是没问题的,只要在Google Cloud Console里已经启用了Places SDK for Android,并且密钥的限制(应用签名、包名)配置正确——毕竟你已经能拿到其他地点数据,说明API调用是正常的,所以密钥不是导致Locale为null的原因。
最后补充:部分小众地点可能确实没有关联的语言代码,这种情况下建议用设备默认Locale作为备选方案,保证功能正常运行。
内容的提问来源于stack exchange,提问作者Virat18

