You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用打开导航主页崩溃:GoogleMap空指针异常求助

问题解决:GoogleMap空指针异常(NullPointerException)

问题根源

报错java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.clear()' on a null object reference,核心原因是**mMap还未完成初始化,就被update_location()中的onLocationResult回调调用**:

  • onCreate中直接调用update_location(),此时地图还未加载(onMapReady未回调),mMap为null
  • 权限通过后,callpermissionlistener的onGranted方法同时触发地图初始化和update_location(),但地图初始化是异步操作,onMapReady可能晚于位置回调执行

修复步骤

1. 移除onCreate中多余的update_location()调用

修改onCreate方法,删除直接调用的update_location():

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    // ... 其他初始化代码 ...

    databaseReference = FirebaseDatabase.getInstance().getReference("users");
    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();
    current_uid = firebaseUser.getUid();

    callpermissionlistener();
    // 移除这行:update_location();
    dynamicheaderlistener();
}

2. 在onMapReady中启动位置更新

等地图完全初始化后再触发位置更新,确保mMap不为null:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    // 地图初始化完成后,启动位置更新
    update_location();
}

3. 在onLocationResult中增加空判断

作为防御性编程,提前判断mMap状态,避免空指针:

@Override
public void onLocationResult(LocationResult locationResult) {
    if (locationResult != null && mMap != null) { // 增加mMap非空判断
        mMap.clear();
        final double lat = locationResult.getLastLocation().getLatitude();
        final double log = locationResult.getLastLocation().getLongitude();
        latLng = new LatLng(lat, log);
        mMap.addMarker(new MarkerOptions().position(latLng).title("your current location"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15F));

        // ... 更新Firebase代码 ...
    } else {
        Toast.makeText(home.this,"location not found or map not ready", Toast.LENGTH_SHORT).show();
    }
}

4. 优化权限请求逻辑

避免用户拒绝权限后无限循环请求,修改onDenied方法:

@Override
public void onDenied(Context context, ArrayList<String> deniedPermissions) {
    Toast.makeText(context, "Location permission is required to use this feature", Toast.LENGTH_LONG).show();
    // 可选:跳转到应用设置页面引导用户开启权限
    // Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null));
    // startActivity(intent);
}

额外建议

  • 遵守Java命名规范:类名首字母大写,将home改为HomeActivity
  • 在onDestroy中移除位置更新监听,避免内存泄漏:
// 先将LocationCallback改为成员变量,替换匿名内部类
private LocationCallback locationCallback = new LocationCallback(){
    @Override
    public void onLocationResult(LocationResult locationResult) {
        // ... 原有逻辑 ...
    }
};

@Override
protected void onDestroy() {
    super.onDestroy();
    if (fusedLocationProviderClient != null) {
        fusedLocationProviderClient.removeLocationUpdates(locationCallback);
    }
}

内容的提问来源于stack exchange,提问作者Shane Enriquez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:05:22