com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)和#x27;关于空对象引用

com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)和#x27;关于空对象引用,android,google-maps,Android,Google Maps,我正试图在Map活动启动时借助GoogleAppClient到达最后一个已知位置。我遵循了链接中的指南: 它可以工作,但应用程序有时会崩溃,我得到以下错误: 我怎样才能修好它 错误: 08-28 16:10:11.687: E/AndroidRuntime(5937): FATAL EXCEPTION: main 08-28 16:10:11.687: E/AndroidRuntime(5937): Process: com.bustracker, PID: 5937 08-28 16:10:

我正试图在
Map
活动启动时借助
GoogleAppClient
到达最后一个已知位置。我遵循了链接中的指南:

它可以工作,但应用程序有时会崩溃,我得到以下错误:

我怎样才能修好它

错误:

08-28 16:10:11.687: E/AndroidRuntime(5937): FATAL EXCEPTION: main
08-28 16:10:11.687: E/AndroidRuntime(5937): Process: com.bustracker, PID: 5937
08-28 16:10:11.687: E/AndroidRuntime(5937): java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.bustracker.Map.onConnected(Map.java:494)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzj.zzg(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.api.zze.zzmH(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.api.zze.onConnected(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.api.zzg$2.onConnected(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zzg.zznO(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zza.zzc(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zza.zzr(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zzc.zznQ(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zzb.handleMessage(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at android.os.Looper.loop(Looper.java:145)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at android.app.ActivityThread.main(ActivityThread.java:5944)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at java.lang.reflect.Method.invoke(Native Method)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at java.lang.reflect.Method.invoke(Method.java:372)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
public class Map extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks, OnConnectionFailedListener{
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        buildGoogleApiClient();
        mGoogleApiClient.connect();
}

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
         System.out.println("ABC buildGoogleApiClient map was invoked: ");
    }
    @Override
    public void onConnected(Bundle arg0) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
             double lng = mLastLocation.getLongitude();
             double lat = mLastLocation.getLatitude();

            if(myLocatMarker != null){
                myLocatMarker.remove();
            }
             LatLng ll = new LatLng(lat, lng);
             MarkerOptions markerOpt = new MarkerOptions().title("my location")
                     .position(ll)
                     .icon(BitmapDescriptorFactory.fromResource(R.drawable.myloc));
             System.out.println("ABC onConnected map: "+ lat + " ; " + lng);
             myLocatMarker = map.addMarker(markerOpt);                

        }

    }
}
地图活动:

08-28 16:10:11.687: E/AndroidRuntime(5937): FATAL EXCEPTION: main
08-28 16:10:11.687: E/AndroidRuntime(5937): Process: com.bustracker, PID: 5937
08-28 16:10:11.687: E/AndroidRuntime(5937): java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.bustracker.Map.onConnected(Map.java:494)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzj.zzg(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.api.zze.zzmH(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.api.zze.onConnected(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.api.zzg$2.onConnected(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zzg.zznO(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zza.zzc(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zza.zzr(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zzc.zznQ(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.google.android.gms.common.internal.zzi$zzb.handleMessage(Unknown Source)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at android.os.Looper.loop(Looper.java:145)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at android.app.ActivityThread.main(ActivityThread.java:5944)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at java.lang.reflect.Method.invoke(Native Method)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at java.lang.reflect.Method.invoke(Method.java:372)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
08-28 16:10:11.687: E/AndroidRuntime(5937):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
public class Map extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks, OnConnectionFailedListener{
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        buildGoogleApiClient();
        mGoogleApiClient.connect();
}

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
         System.out.println("ABC buildGoogleApiClient map was invoked: ");
    }
    @Override
    public void onConnected(Bundle arg0) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
             double lng = mLastLocation.getLongitude();
             double lat = mLastLocation.getLatitude();

            if(myLocatMarker != null){
                myLocatMarker.remove();
            }
             LatLng ll = new LatLng(lat, lng);
             MarkerOptions markerOpt = new MarkerOptions().title("my location")
                     .position(ll)
                     .icon(BitmapDescriptorFactory.fromResource(R.drawable.myloc));
             System.out.println("ABC onConnected map: "+ lat + " ; " + lng);
             myLocatMarker = map.addMarker(markerOpt);                

        }

    }
}

这是因为没有定义和初始化贴图对象。在全球范围内宣布:


GoogleMap
我想您在
onMapReady

尝试在
onMapReady
回调中调用
mGoogleApiClient.connect()
,以确保映射不为空

如果您不想正确使用异步,只需使用同步方式获取映射即可

删除这个
mapFragment.getMapAsync(这个)
并添加这个
map=mapFragment.getMap()

确保您有字段
GoogleMap
,因为您将其隐藏在代码中

或者这是另一个版本

public class Map extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    GoogleMap map;
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    Marker myLocatMarker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        buildGoogleApiClient();
        mapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                map = googleMap;
                mGoogleApiClient.connect();
            }
        });
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        System.out.println("ABC buildGoogleApiClient map was invoked: ");
    }

    @Override
    public void onConnected(Bundle arg0) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (mLastLocation != null) {
            double lng = mLastLocation.getLongitude();
            double lat = mLastLocation.getLatitude();

            if (myLocatMarker != null) {
                myLocatMarker.remove();
            }
            LatLng ll = new LatLng(lat, lng);
            MarkerOptions markerOpt = new MarkerOptions().title("my location")
                    .position(ll)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.myloc));
            System.out.println("ABC onConnected map: " + lat + " ; " + lng);
            myLocatMarker = map.addMarker(markerOpt);
        }
    }
}

我已经在initMap()中对其进行了初始化。我没有添加wohle活动代码,因为它将持续。我尝试了您的建议,但没有调用回调
onMapReady()
。我正在
onCreate()
中调用
getmapsync
!getMapAsync(new OnMapReadyCallback(){public void onMapReady(GoogleMap-GoogleMap){}});你应该在mapready上获取map,否则它将始终为null。我无法在注释中使用代码来跟踪你。我该把它放在哪里?