Ich fing an, an einer alten Anwendung zu arbeiten, die ich verwende, die ein Kartenfragment auf einer Navigationsschublade verwendet. Früher hat es funktioniert, aber jetzt, mit dem neuen Permisson, bekomme ich ein paar Fehler. Ich habe im Allgemeinen auf SO und im Internet gesucht, aber ich weiß nicht, was ich vermisse. Meine Karte Fragment unterAndroid: Fehler mit Kartenfragment auf Navigationsschublade und Berechtigungsprüfung
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();
}
I googleMap = mMapView.getMap();
verwendet, um die Karte zu bekommen, aber ich es ändern müssen mit mMapView.getMapAsync(this);
von OnMapReadyCallback
implementieren, und es hat mich gezwungen, die onMapReady
Methode zu erstellen, die ich weiß nicht, wie es anders ist von der onCreateView
Methode, also lasse ich es leer.
Jetzt bekomme ich einen Fehler auf googleMap.setMyLocationEnabled(true);
für die Erlaubnis und wenn ich meine App debuggen ist das GoogleMap-Objekt null. Wenn ich es starte, stürzt die App beim Auswählen des Kartenfragments ab und beendet die Aktivität, die die Fragmente enthält.
Auf dem Manifest ich habe
android:minSdkVersion="17"
android:targetSdkVersion="23"
und meine gradle Abhängigkeiten sind
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:+'
Was hier bin ich fehlt? Wie kann ich die Berechtigung in dem Fragment verwenden und warum googleMap ist leer?
tat ich das, aber die App stürzt wieder, wenn die Karte Fragment auswählen. Ich bekomme immer noch eine Unterstreichung auf 'googleMap.setMyLocationEnabled (true);' für permissoin check – Kzaf
Durch das Auskommentieren der 'googleMap.setMyLocationEnabled (true);' Ich bekomme das Map-Fragment zu laufen, aber ich bekomme jetzt eine leere Karte. Wenn ich wieder die 'googleMap.setMyLocationEnabled (true);} verwende, stürzt meine App ab. Wie kann ich den Permission-Check und die leere Karte beheben? – Kzaf