Place Picker在Moto X2设备无法启动问题排查及代码优化请求
排查Moto X2上Place Picker无法启动的问题 & 代码优化建议
咱们先从几个针对性的排查点入手,一步步定位Moto X2上的问题:
1. 优先检查Google Play服务版本
Moto X2是2014年的老设备,预装的Google Play Services版本大概率偏低,而Place Picker对服务版本有明确要求(通常需要11.0.0以上)。你可以让用户这么操作:
- 打开设备「设置」→「应用管理」→找到「Google Play服务」,查看版本号
- 如果版本低于要求,引导用户到Google Play商店更新服务
2. 确认位置权限与定位状态
老设备经常会出现权限或定位未开启的情况:
- 检查你的App是否获得了精确位置权限(ACCESS_FINE_LOCATION),Place Picker必须依赖这个权限加载附近地点
- 确认设备的定位服务(GPS/网络定位)已经开启,有些用户会默认关闭定位功能
3. 二次验证API密钥配置
虽然其他设备正常,但还是要排除Moto X2特殊场景的配置遗漏:
- 检查Google Cloud Console里的API密钥,是否同时配置了debug和release包的SHA-1指纹(如果用户用的是debug包测试)
- 确认Place Picker API确实在控制台中处于启用状态
代码优化建议
你当前的代码只捕获了两类Google Play服务异常,而且没有权限检查和用户提示,很容易遗漏问题。这里给你优化后的代码:
// 先定义权限请求常量(在Activity中) private static final int LOCATION_PERMISSION_REQUEST = 1001; private static final int PLACE_PICKER_REQUEST = 1002; // 启动Place Picker的方法 private void launchPlacePicker() { PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); try { // 先检查位置权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST); return; } Intent placePickerIntent = builder.build(this); startActivityForResult(placePickerIntent, PLACE_PICKER_REQUEST); } catch (GooglePlayServicesRepairableException e) { Log.e("PlacePicker", "需要更新Google Play Services", e); Toast.makeText(this, "请先更新Google Play Services再重试", Toast.LENGTH_LONG).show(); // 跳转至Google Play商店更新 try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); } catch (ActivityNotFoundException ignored) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=com.google.android.gms"))); } } catch (GooglePlayServicesNotAvailableException e) { Log.e("PlacePicker", "Google Play Services不可用", e); Toast.makeText(this, "当前设备不支持Google Play Services,无法使用地点选择器", Toast.LENGTH_LONG).show(); } catch (Exception e) { // 捕获所有其他未知异常,方便排查 Log.e("PlacePicker", "地点选择器启动失败", e); Toast.makeText(this, "地点选择器启动失败,请稍后重试", Toast.LENGTH_LONG).show(); } } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予后,重新启动Place Picker launchPlacePicker(); } else { Toast.makeText(this, "需要位置权限才能使用地点选择器", Toast.LENGTH_LONG).show(); } } }
另外还要提醒你:Place Picker API已经被Google废弃,建议尽快迁移到Places SDK for Android的Autocomplete组件,老API不仅会有兼容性问题,后续还可能被停止服务,这也是长期解决这类设备兼容问题的方案。
内容的提问来源于stack exchange,提问作者shaktisinghmoyal
相关产品推荐
相关产品推荐

