Android获取当前位置返回Null致应用崩溃,求问题排查
排查Location返回Null导致崩溃的常见原因及修复方案
嘿,我来帮你定位这个问题!之前运行正常现在突然出现Location null崩溃,大概率是某些场景下位置获取失败但代码没做判空处理,或者环境/权限发生了变化。结合你提供的代码片段,我整理了几个核心排查方向:
首先,给
gotLocation方法加判空防护(最直接解决崩溃)
无论什么原因导致获取不到位置,都不能直接调用Location的方法(比如getLatitude()),否则必然触发空指针异常。修改你的方法:public void gotLocation(Location location) { // 先判断位置是否为空 if (location == null) { // 这里处理获取失败的情况:比如提示用户检查定位设置、网络,或者触发重试逻辑 Toast.makeText(context, "无法获取当前位置,请检查定位权限和设置", Toast.LENGTH_SHORT).show(); return; } // 下面才是正常的位置处理逻辑 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // ... 你的其他业务代码 }检查定位权限是否正常生效
Android 6.0+需要动态申请ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限,用户可能在后续使用中手动关掉了权限,导致定位失败:- 先确认Manifest里的权限声明:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 12+ 后台定位额外需要这个权限(如果你的场景是后台获取) --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:maxSdkVersion="31" /> - 在代码中主动检查权限状态,未授予时发起权限请求:
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); return; }
- 先确认Manifest里的权限声明:
确认定位提供者是否可用
你的代码里有gps_enabled和network_enabled标记,一定要确保至少有一个提供者处于启用状态,否则根本无法获取位置:gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!gps_enabled && !network_enabled) { // 引导用户打开定位设置 Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); context.startActivity(intent); return; }检查Timer超时逻辑的漏洞
很多高赞方案会用Timer超时后获取最后已知位置,但getLastKnownLocation()也可能返回null(比如设备从未获取过位置),所以超时回调里也要判空:timer1.schedule(new TimerTask() { @Override public void run() { Location lastKnown = null; // 优先尝试GPS的最后已知位置 if (gps_enabled) lastKnown = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); // GPS没有的话再试网络定位 if (lastKnown == null && network_enabled) lastKnown = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); // 必须判空后再传给gotLocation gotLocation(lastKnown); } }, 10000); // 10秒超时示例适配Android版本的定位限制
从Android 10开始,后台获取位置有严格限制,如果你的应用在后台尝试获取位置,系统会直接返回null。如果是前台场景,确保应用处于可见状态(比如有活跃的Activity),或者申请前台服务权限来维持定位能力。
内容的提问来源于stack exchange,提问作者sandy
相关产品推荐
相关产品推荐

