Android天气应用模拟器定位正常但真机闪退问题求助
定位崩溃问题排查&修复方案
1. 运行时权限校验(最高概率原因)
Android 6.0(API 23)及以上版本仅在Manifest中声明权限无效,必须在用户点击「获取我的位置」时主动申请运行时权限:
- 点击按钮时先调用
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION),判断返回值是否为PackageManager.PERMISSION_GRANTED - 未授权的情况下直接调用定位接口会抛出
SecurityException直接崩溃,必须先调用ActivityCompat.requestPermissions()申请权限,拿到授权回调确认用户同意后再执行定位逻辑 - 若你的应用targetSdkVersion ≥ 31,申请定位时需要同时申请
ACCESS_FINE_LOCATION+ACCESS_COARSE_LOCATION,避免用户仅授权粗略定位时权限校验失败
2. 空指针异常排查(次高频原因)
- 定位回调返回的
Location对象可能为空(例如首次定位无缓存、GPS信号弱无法获取位置),必须在onLocationChanged方法中先判断location != null再调用getLatitude()、getLongitude()等方法,否则会触发NullPointerException崩溃 - 检查定位相关的实例对象(LocationManager、自定义LocationListener实例)是否在调用前完成初始化,避免对象未初始化就调用方法
3. 线程异常排查
原生LocationListener的回调默认运行在Binder线程,不能直接操作UI:
- 所有定位回调中需要更新界面、弹出Toast的操作,必须通过
Activity.runOnUiThread()或者View的post()方法切换到主线程执行,否则会抛出线程相关运行时异常
4. 定位API兼容性检查
- 如果你使用的是Google Play服务的FusedLocationProvider API,需判断设备是否安装了Google Play服务,无服务的设备调用该接口会崩溃;如果需要兼容全机型建议切换为原生LocationManager定位逻辑
- 若你调用了已废弃的定位相关API,建议替换为对应版本兼容的接口实现,避免在高版本系统上触发异常
快速验证步骤
可以通过Android Studio Logcat过滤Error级别的日志,直接定位崩溃对应的异常类型和代码行数,针对性修复效率更高。
内容的提问来源于stack exchange,提问作者partizal
相关产品推荐
相关产品推荐

