LatLng中的当前位置输入导致崩溃

时间:2017-03-28 15:10:04

标签: android google-api

我正在尝试将标记放在我当前的位置(使用google maps api)。虽然LatLng中的直接输入值正在工作,但间接调用currentLocation.getLatitude()和currentLocation.getLongitude()会因为某些原因而崩溃我的应用程序,我知道这就是这一行,因为应用程序在我添加此行之前不会崩溃。

这是我的MapsActivity类 -

    package com.example.shreyass.tourist;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
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.internal.IGoogleMapDelegate;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.common.api.GoogleApiClient;


public class MapsActivity extends FragmentActivity implements       OnMapReadyCallback,GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener{

private GoogleMap mMap;
private Location currentLocation;
GoogleApiClient googleApiClient;

@Override
protected void onStop() {
    super.onStop();
    googleApiClient.disconnect();
}

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

    if (googleApiClient == null) {
        googleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    googleApiClient.connect();

    // 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);
 }


/**
 * 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(GoogleMap googleMap) {

    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker at current location"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

@Override
public void onConnected(@Nullable Bundle bundle) {

    if(ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
            !=PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(MapsActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},1);
    }
    else {
        currentLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    }

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}
}

1 个答案:

答案 0 :(得分:1)

尝试此更改..

  public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener{

    private GoogleMap mMap;
    private Location currentLocation;
    GoogleApiClient googleApiClient;

    @Override
    protected void onStop() {
        super.onStop();
        googleApiClient.disconnect();
    }

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



        // 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);
    }


    /**
     * 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(GoogleMap googleMap) {

        mMap = googleMap;

        if (googleApiClient == null) {
            googleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }

        googleApiClient.connect();


    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        if(ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
                !=PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(MapsActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},1);
        }
        else {
            currentLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

            // Add a marker in Sydney and move the camera 
            LatLng sydney = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
            mMap.addMarker(new MarkerOptions().position(sydney).title("Marker at current location"));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        }

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}