当从onMapready方法移动到onlocationchanged方法时,应用程序崩溃

时间:2017-06-28 10:43:03

标签: android google-maps

我在android中学习地图以在地图中显示用户的位置。首先,我使用.getmap()函数来获取地图初始化但是它已被折旧,然后在从谷歌搜索后我来到了地图已经()我略微修改并使用onMapready()。

但我的map变量只能在默认位置工作,它不会运行onlocationchange方法。从onMapreadyfunction返回后,mMap变量的值为null,并且只显示map上的sydney(默认)位置。我使用了一个条件在OnCreate中检查mMap并且总是给出null并且不会进入其他条件。如果我的onlocation方法可以工作?

我有很多人使用GoogleApi客户端谷歌,但我对它没有任何想法。此外,我不确定我使用的方法是否有效获取用户的位置。我已经在那里了在onMapreadyFuction中做的工作?

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {

private GoogleMap mMap;
LocationManager locationManager;
String provider;


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

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

    if (mMap==null)  // check mMap null after onMapready
    {
        Toast.makeText(getApplicationContext(),"My Toast",Toast.LENGTH_LONG).show();
    }
    else
    {


    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    provider = locationManager.getBestProvider(new Criteria(), false);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling

        return;
    }

    Location location = locationManager.getLastKnownLocation(provider);

    if (location!=null)
    {
        //Toast.makeText(getApplicationContext(),"My Toast",Toast.LENGTH_LONG).show();
        onLocationChanged(location);
    }
 }

}

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

    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    //Toast.makeText(getApplicationContext(),"No sydney?",Toast.LENGTH_LONG).show();
   // mMap.addMarker(new MarkerOptions().position(new LatLng(0,0)).title("Your location"));

}

@Override
public void onLocationChanged(Location location) {

    Double lat = location.getLatitude();
    Double lng = location.getLongitude();
    LatLng pos = new LatLng(lat, lng);
    //Toast.makeText(getApplicationContext(),"My Toast",Toast.LENGTH_LONG).show();

    SupportMapFragment mapFragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);

    mMap.addMarker(new MarkerOptions().position(pos).title("Your location"));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 12)) ;

}

1 个答案:

答案 0 :(得分:1)

您正在处理两个不同的要求,显示Google地图片段&监控位置更新,因此您应该单独处理它们。

一旦您以异步方式(顾名思义)调用getMapAsync

Google Map 就会被初始化,因此它不会中断任何其他工作。只有一个googleMap实例(即只调用上述方法一次)非常重要,否则您将面临意外行为。

您应该在getMapAsync中调用onCreate并使用onMapReady中的地图实例执行任何操作,保证在GoogleMap实例可用后调用该实例。删除对getMapAsync的任何其他电话。

像您一样,LocationManager请求

位置更新。此提供程序也是异步工作的,因此可以在映射准备好之前调用其回调函数onLocatedUpdated。在此回调和任何其他使用地图实例但可在实例可用之前调用的方法中,在使用之前必须检查地图实例是否为空,否则您将面临NullPointerException