Android:导航抽屉上的地图片段和权限检查错误

时间:2017-04-30 15:19:34

标签: android google-maps android-fragments

我开始研究一个在导航抽屉上使用地图片段的旧应用程序。它过去工作正常,但现在,随着新的permisson事情,我得到一些错误。我一直在SO和互联网上搜索,但我不知道我错过了什么。我的地图片段在下面

public class Fragment_maps extends android.support.v4.app.Fragment implements OnMapLongClickListener, OnMapClickListener, OnMapReadyCallback {

MapView mMapView;
GoogleMap googleMap;

@Override
public void onMapReady(GoogleMap googleMap) {

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // inflate and return the layout 
    View v = inflater.inflate(R.layout.fragment_maps, container, false);
    mMapView = (MapView) v.findViewById(R.id.map);
    mMapView.onCreate(savedInstanceState);
    //activate menu button
    setHasOptionsMenu(true);

    mMapView.onResume();// needed to get the map to display immediately 

    try {
        MapsInitializer.initialize(getActivity().getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    //get the map
    mMapView.getMapAsync(this);
    // Detect location
    googleMap.setMyLocationEnabled(true);
    googleMap.getUiSettings().setMyLocationButtonEnabled(false);
    //googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    // Turns traffic layer on
    googleMap.setTrafficEnabled(true);
    // Enables indoor maps
    googleMap.setIndoorEnabled(true);
    // Enables indoor maps
    googleMap.setIndoorEnabled(true);
    // Turns on 3D buildings
    googleMap.setBuildingsEnabled(true);
    // Show Zoom buttons
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    // latitude and longitude
    double latitude = 40.639350;
    double longitude = 22.944607;

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


    // create marker
    MarkerOptions thessaloniki = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Thessaloniki");

    // Changing marker icon
    thessaloniki.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

    // adding marker
    googleMap.addMarker(thessaloniki);
    CameraPosition cameraPositionThess = new CameraPosition.Builder() .target(new LatLng(40.639350, 22.944607)).zoom(12).build();
    googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPositionThess));

    // Perform any camera updates here
    return v;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_maps, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.d("onOptionsItemSelected","yes");
    switch (item.getItemId()) {
    case R.id.HYBRID:
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        return true;
    case R.id.SATELLITE:
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        return true;
    case R.id.TERRAIN:
        googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        return true;
    case R.id.NORMAL:
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onMapClick(LatLng point) {
    Toast.makeText(getActivity(),point.toString(),Toast.LENGTH_SHORT).show();
    googleMap.animateCamera(CameraUpdateFactory.newLatLng(point));
}

@Override 
public void onMapLongClick(LatLng point) {
     if (SelectUserActivity.flagOwner){
         googleMap.addMarker(new MarkerOptions()
         .position(point)
         .title(MainActivity.onomaxarth)           
         .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
        Toast.makeText(getActivity(),"Hotel pinned at: "+point.toString(),Toast.LENGTH_SHORT).show();
     }else{
        Toast.makeText(getActivity(),point.toString(),Toast.LENGTH_SHORT).show();
     }
}

@Override 
public void onResume() { 
    super.onResume(); 
    mMapView.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mMapView.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mMapView.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mMapView.onLowMemory(); 
}

我使用googleMap = mMapView.getMap();来获取地图,但我已通过实施mMapView.getMapAsync(this);更改了OnMapReadyCallback,并强迫我创建onMapReady方法,我不知道它与onCreateView方法有什么不同所以我把它留空了。

现在我在googleMap.setMyLocationEnabled(true);上收到错误的权限,当我调试我的应用时,googleMap对象为空。 当我运行它时,在选择地图片段时,应用程序崩溃并终止包含片段的活动。

关于清单我

android:minSdkVersion="17"
android:targetSdkVersion="23"

我的gradle依赖项是

compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.google.android.gms:play-services:+'

我在这里缺少什么?我如何使用片段中的权限以及googleMap为空的原因?

1 个答案:

答案 0 :(得分:0)

将此代码从onCreateView移至onMapReady

// Detect location
googleMap.setMyLocationEnabled(true);
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
//googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
// Turns traffic layer on
googleMap.setTrafficEnabled(true);
// Enables indoor maps
googleMap.setIndoorEnabled(true);
// Enables indoor maps
googleMap.setIndoorEnabled(true);
// Turns on 3D buildings
googleMap.setBuildingsEnabled(true);
// Show Zoom buttons
googleMap.getUiSettings().setZoomControlsEnabled(true);
// latitude and longitude
double latitude = 40.639350;
double longitude = 22.944607;

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


// create marker
MarkerOptions thessaloniki = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Thessaloniki");

// Changing marker icon
thessaloniki.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

// adding marker
googleMap.addMarker(thessaloniki);
CameraPosition cameraPositionThess = new CameraPosition.Builder() .target(new LatLng(40.639350, 22.944607)).zoom(12).build();
googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPositionThess));

线mMapView.getMapAsync(this);准备地图,并在准备好使用地图时调用onMapReady

此外,如果您已定义private GoogleMap googleMap;,则需要将其添加到onMapReady方法的开头:

this.googleMap = googleMap;