Java 获取NullPointerException:在Google地图上。在null对象引用上设置MyLocationEnabled(布尔值)

Java 获取NullPointerException:在Google地图上。在null对象引用上设置MyLocationEnabled(布尔值),java,android,android-studio,google-maps,nullpointerexception,Java,Android,Android Studio,Google Maps,Nullpointerexception,我得到这个错误 NullPointerException:尝试在空对象引用上调用虚拟方法'void com.google.android.gms.maps.GoogleMap.setMyLocationEnabled(布尔值) 由于这个错误,应用程序崩溃了。我想说的是,我在互联网和这里搜索了答案,但没有找到任何东西 这是我的密码: public class MapsActivity extends FragmentActivity implements OnMapReadyCal

我得到这个错误

NullPointerException:尝试在空对象引用上调用虚拟方法'void com.google.android.gms.maps.GoogleMap.setMyLocationEnabled(布尔值)

由于这个错误,应用程序崩溃了。我想说的是,我在互联网和这里搜索了答案,但没有找到任何东西

这是我的密码:

public class MapsActivity extends FragmentActivity
        implements OnMapReadyCallback,
        GoogleMap.OnMapClickListener,
        GoogleMap.OnMapLongClickListener,
        GoogleMap.OnMarkerClickListener {

    private GoogleMap mMap;
    private GoogleMap googleMap;
    private ArrayList<LatLng> arrayPoints = null;
    PolylineOptions polylineOptions;
    private boolean checkClick = false;


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

        arrayPoints = new ArrayList<LatLng>();
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        // display zoom map

        googleMap.setOnMapClickListener(this);
        googleMap.setOnMapLongClickListener(this);
        googleMap.setOnMarkerClickListener(this);

    }

    public GoogleMap getmMap() {
        return mMap;

    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */


    @Override
    public void onMapReady(final GoogleMap googleMap) {

        mMap = googleMap;
        googleMap.setMyLocationEnabled(true);

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(final LatLng latLng) {

                if (checkClick == false) {

                    LatLng currentLocation = null;
                    Marker marker = googleMap.addMarker(new MarkerOptions().position(currentLocation)
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.point)));

                }
            }
        });
    }

    @Override
    public void onMapLongClick(LatLng latLng) {

        googleMap.clear();
        arrayPoints.clear();
        checkClick = false;

    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        // TODO Auto-generated method stub
        System.out.println("Marker lat long=" + marker.getPosition());
        System.out.println("First postion check" + arrayPoints.get(0));
        System.out
                .println("**********All arrayPoints***********" + arrayPoints);
        if (arrayPoints.get(0).equals(marker.getPosition())) {
            System.out.println("********First Point choose************");
            countPolygonPoints();
        }
        return false;
    }

    private void countPolygonPoints() {

        if (arrayPoints.size() >= 3) {
            checkClick = true;
            PolygonOptions polygonOptions = new PolygonOptions();
            polygonOptions.addAll(arrayPoints);
            polygonOptions.strokeColor(Color.BLUE);
            polygonOptions.strokeWidth(7);
            polygonOptions.fillColor(Color.CYAN);
            Polygon polygon = googleMap.addPolygon(polygonOptions);
        }
    }

    @Override
    public void onMapClick(LatLng latLng) {

    }
}
公共类映射活动扩展了FragmentActivity
在MapreadyCallback上执行,
GoogleMap.OnMapClickListener,
GoogleMap.OnMapLongClickListener,
GoogleMap.OnMarkerClickListener{
私有谷歌地图;
私人谷歌地图谷歌地图;
私有ArrayList arrayPoints=null;
多段线选项多段线选项;
私有布尔checkClick=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_映射);
arrayPoints=新的ArrayList();
//获取SupportMapFragment,并在地图准备好使用时收到通知。
SupportMapFragment mapFragment=(SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map);
getMapAsync(这个);
//显示缩放地图
setOnMapClickListener(this);
setOnMapLongClickListener(this);
setOnMarkerClickListener(这个);
}
公共谷歌地图getmMap(){
返回mMap;
}
/**
*一旦可用,就可以操纵贴图。
*当映射准备好使用时,将触发此回调。
*这是我们可以添加标记或线条、添加侦听器或移动摄影机的地方。在这种情况下,
*我们只是在澳大利亚悉尼附近加了一个标记。
*如果设备上未安装Google Play服务,系统将提示用户安装
*它位于SupportMapFragment内。此方法仅在用户
*已安装Google Play服务并返回应用程序。
*/
@凌驾
4月1日公开作废(最终谷歌地图谷歌地图){
mMap=谷歌地图;
googleMap.setMyLocationEnabled(true);
mMap.setOnMapClickListener(新的GoogleMap.OnMapClickListener(){
@凌驾
公共无效(最终板条){
if(checkClick==false){
LatLng currentLocation=null;
Marker Marker=googleMap.addMarker(新MarkerOptions().position(当前位置)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.point));
}
}
});
}
@凌驾
在MaplongClick(LatLng LatLng)上的公共无效{
googleMap.clear();
arrayPoints.clear();
checkClick=false;
}
@凌驾
公共布尔onMarkerClick(标记){
//TODO自动生成的方法存根
System.out.println(“Marker lat long=“+Marker.getPosition());
System.out.println(“第一个位置检查”+arrayPoints.get(0));
系统输出
.println(“**********所有阵列点**********”+阵列点);
if(arrayPoints.get(0).equals(marker.getPosition())){
System.out.println(“*********第一点选择**********”);
countPolygonPoints();
}
返回false;
}
私有void countPolygonPoints(){
如果(arrayPoints.size()>=3){
checkClick=true;
PolygonOptions PolygonOptions=新PolygonOptions();
polygonooptions.addAll(数组点);
多克隆选择。strokeColor(Color.BLUE);
脉冲宽度(7);
多边形选项。填充颜色(颜色。青色);
多边形=谷歌地图。添加多边形(多边形选项);
}
}
@凌驾
公共无效的点击(LatLng LatLng){
}
}

您的代码中存在多个问题

首先,您使用了两个
GoogleMap
变量,但都没有正确初始化。你只需要一个

private GoogleMap mMap;
其次,为了使用
setMyLocationEnabled
,您需要在运行时向用户请求位置权限:

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
        PackageManager.PERMISSION_GRANTED &&
        ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
                PackageManager.PERMISSION_GRANTED) {
    mMap.setMyLocationEnabled(true);
    mMap.getUiSettings().setMyLocationButtonEnabled(true);
}
然后将
currentLocation
设置为
null
,并将此null变量传递给新标记。相反,使用实际的
latLng

mMap.addMarker(new MarkerOptions().position(latLng));
最后,您实际上没有向
arrayPoints
ArrayList添加任何项目。我假设你想做这样的事情:

arrayPoints.add(marker.getPosition());
完整的工作代码如下

import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolygonOptions;

import java.util.ArrayList;

public class MapsActivity extends FragmentActivity
        implements OnMapReadyCallback,
        GoogleMap.OnMapClickListener,
        GoogleMap.OnMapLongClickListener,
        GoogleMap.OnMarkerClickListener {

    private GoogleMap mMap;
    private ArrayList<LatLng> arrayPoints = null;
    private boolean checkClick = false;


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

        arrayPoints = new ArrayList<>();
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap googleMap) {
        mMap = googleMap;

        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
                PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
                        PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
            mMap.getUiSettings().setMyLocationButtonEnabled(true);
        }

        mMap.setOnMapClickListener(this);
        mMap.setOnMapLongClickListener(this);
        mMap.setOnMarkerClickListener(this);

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(final LatLng latLng) {
                if (!checkClick) {
                    mMap.addMarker(new MarkerOptions().position(latLng));
                }
            }
        });
    }

    @Override
    public void onMapLongClick(LatLng latLng) {
        mMap.clear();
        arrayPoints.clear();
        checkClick = false;
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        arrayPoints.add(marker.getPosition());
        System.out.println("Marker lat long=" + marker.getPosition());
        System.out.println("First position check" + arrayPoints.get(0));
        System.out
                .println("**********All arrayPoints***********" + arrayPoints);
        if (arrayPoints.get(0).equals(marker.getPosition())) {
            System.out.println("********First Point choose************");
            countPolygonPoints();
        }
        return false;
    }

    private void countPolygonPoints() {
        if (arrayPoints.size() >= 3) {
            checkClick = true;
            PolygonOptions polygonOptions = new PolygonOptions();
            polygonOptions.addAll(arrayPoints);
            polygonOptions.strokeColor(Color.BLUE);
            polygonOptions.strokeWidth(7);
            polygonOptions.fillColor(Color.CYAN);
            mMap.addPolygon(polygonOptions);
        }
    }

    @Override
    public void onMapClick(LatLng latLng) {

    }
}
导入android.content.pm.PackageManager;
导入android.graphics.Color;
导入android.os.Bundle;
导入androidx.core.content.ContextCompat;
导入androidx.fragment.app.FragmentActivity;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.OnMapReadyCallback;
导入com.google.android.gms.maps.SupportMapFragment;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
导入com.google.android.gms.maps.model.polygonooptions;
导入java.util.ArrayList;
公共类映射活动扩展了FragmentActivity
在MapreadyCallback上执行,
GoogleMap.OnMapClickListener,
GoogleMap.OnMapLongClickListener,
GoogleMap.OnMarkerClickListener{
私有谷歌地图;
私有ArrayList arrayPoints=null;
私有布尔checkClick=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_映射);
arrayPoints=新的ArrayList();
SupportMapFragment mapFragment=(SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map);
getMapAsync(这个);
}
@凌驾
4月1日公开作废(最终谷歌地图谷歌地图){