2017-03-12 7 views
0

Ich habe die Dokumentation durchgelesen und kann keinen Grund finden, warum MapFragment nur einen grauen Bildschirm mit dem Google-Logo auf der unteren linken Seite zeigt. In meinem Manifest habe ich die entsprechenden Metadaten auf der Anwendungsebene (GMS-Versionsnummer und der API-Schlüssel). Die Modulgraderdatei enthält alle erforderlichen Abhängigkeiten. Der Fehler kann in der Java-Code sein, der wie folgt lautet:MapFragment zeigt keine Karte an

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

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
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.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.Polyline; 
import com.google.android.gms.maps.model.PolylineOptions; 

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

    private GoogleMap mMap; 
    private Polyline polyline; 
    private PolylineOptions mPLO; 
    private GoogleApiClient mGoogleApiClient; 
    private boolean mLocationPermissionGranted; 
    private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1; 
    private Location mLastKnownLocation; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, 
         this /* OnConnectionFailedListener */) 
       .addConnectionCallbacks(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 


    /** 
    * 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; 
     LatLng sydney = new LatLng(-33.852, 151.211); 
     mMap.addMarker(new MarkerOptions().position(sydney) 
       .title("Marker in Sydney")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
     //mPLO = new PolylineOptions().geodesic(true);; 
     //polyline = mMap.addPolyline(mPLO); 

     // Turn on the My Location layer and the related control on the map. 
     // updateLocationUI(); 

     // Get the current location of the device and set the position of the map. 
     //getDeviceLocation(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

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

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // mPLO.add(new LatLng(location.getLatitude(), location.getLongitude())); 
    } 

    @Override 
    public void onProviderDisabled(String s) { 

    } 

    @Override 
    public void onProviderEnabled(String s) { 

    } 

    @Override 
    public void onStatusChanged(String s, int i, Bundle bundle) { 

    } 

    private void getDeviceLocation() { 
     if (ContextCompat.checkSelfPermission(this.getApplicationContext(), 
       android.Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      mLocationPermissionGranted = true; 
     } else { 
      ActivityCompat.requestPermissions(this, 
        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
        PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 
     } 
     // A step later in the tutorial adds the code to get the device location. 
    } 

    /** 
    * Handles the result of the request for location permissions. 
    */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              @NonNull String permissions[], 
              @NonNull int[] grantResults) { 
     mLocationPermissionGranted = false; 
     switch (requestCode) { 
      case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        mLocationPermissionGranted = true; 
       } 
      } 
     } 
     updateLocationUI(); 
    } 

    /** 
    * Updates the map's UI settings based on whether the user has granted location permission. 
    */ 
    private void updateLocationUI() { 
     if (mMap == null) { 
      return; 
     } 

     /* 
     * Request location permission, so that we can get the location of the 
     * device. The result of the permission request is handled by a callback, 
     * onRequestPermissionsResult. 
     */ 
     if (ContextCompat.checkSelfPermission(this.getApplicationContext(), 
       android.Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      mLocationPermissionGranted = true; 
     } else { 
      ActivityCompat.requestPermissions(this, 
        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
        PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 
     } 

     if (mLocationPermissionGranted) { 
      mMap.setMyLocationEnabled(true); 
      mMap.getUiSettings().setMyLocationButtonEnabled(true); 
     } else { 
      mMap.setMyLocationEnabled(false); 
      mMap.getUiSettings().setMyLocationButtonEnabled(false); 
      mLastKnownLocation = null; 
     } 
    } 

} 

Die logcat zeigt folgende Fehler

234-31464/com.gjd.capstone E/Google Maps Android API: Authorization failure. Please see https://developers.google.com/maps/documentation/android-api/start for how to correctly set up the map. 
03-12 15:30:12.967 30234-31464/com.gjd.capstone E/Google Maps Android API: In the Google Developer Console (https://console.developers.google.com) 
                      Ensure that the "Google Maps Android API v2" is enabled. 
                      Ensure that the following Android Key exists: 
                      API Key: <Redacted> 
                      Android Application (<cert_fingerprint>;<package_name>): 47:B9:AC:D7:30:4D:AB:2D:6E:29:06:99:24:B1:7C:07:95:0A:8B:96;com.gjd.capstone 

Ich habe sogar in die Entwickler-Konsole sah nach, ob die api deaktiviert war, das war es nicht. Ich bin mir immer noch nicht sicher, was ich tun soll. Ich bin mir nicht sicher, ob "Google Maps Android API v2" aktiviert ist, ich konnte die Option dafür nicht finden.

+0

Haben Sie API-Schlüssel eingerichtet? – azizbekian

+0

Ja, habe ich. Ich kann es im Manifest und in der Datei google_maps_api.xml sehen. Als ich das Mapfragment erstellt habe, dass die Datei automatisch erstellt wurde, befolgte ich die Anweisungen, um den API-Schlüssel zu erhalten und dort einzufügen, wo er gebraucht wurde. –

+0

Bitte logcat Ausgabe –

Antwort

0

Ich habe die Lösung für mein Problem gefunden. Nachdem ich die MapsActivity erstellt habe, habe ich das Paket der Java-Datei geändert, aber den Paketnamen in der Dev-Konsole nicht geändert.

0

Durch Öffnen des Projekts auf einem anderen PC wurde MapFragmant nicht mehr angezeigt. Um das Problem zu lösen, habe ich meine Anwendung mit dem Keystore auf meinem PC signiert.

Unter Xamarin 1. Erstellen Sie ein Archiv meiner Anwendung (ein apk) 2. einen Schlüsselspeicher erstellen, wenn es nicht bereits 3. Klicken Sie Verteilen erfolgt auf 4. Wählen Sie Ad-hoc- 5. Schlüsselspeicher Wählen Sie 6. Klicken Sie auf Speichern unter und speichern in App 7. Projekt neu erstellen