2017-10-07 8 views
-4

Je souhaite afficher ma position actuelle à l'aide de Google Maps v2 à partir d'un fragment. Toutefois, les cartes Google ne sont pas initialisées au démarrage. Quand je lance l'application, elle ne plante pas, mais la carte ne montre pas mon emplacement actuel et elle n'affiche rien. J'ai utilisé ce code sur mon activité et il est entièrement fonctionnel.Google Maps v2 ne s'initialisant pas dans le fragment

Ci-dessous mon java code:

public class MapFragment extends Fragment implements LocationListener,GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener,OnMapReadyCallback { 
    SupportMapFragment mSupportMapFragment; 
    MapView mMapView; 
    Location mLastLocation; 
    Marker mCurrLocationMarker; 
    private MarkerOptions markerOptions; 
    protected GoogleApiClient mGoogleApiClient; 
    private LatLng latLng; 
    public GoogleMap mMap; 
    private Marker marker; 
    LocationRequest mLocationRequest; 
    private GoogleMap googleMap; 
    private TextView lastTrip, lastDeliveryText, lastDelivery, lastAmountText, lastAmount, kes, 
      todayTotal, totalDeliveryText, totalDelivery, totalAmount, totalAmountText; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     buildGoogleApiClient(); 
     // inflat and return the layout 
     View v = inflater.inflate(R.layout.map_fragment, container, 
       false); 

     mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere); 
     if (mSupportMapFragment == null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      mSupportMapFragment = SupportMapFragment.newInstance(); 
      fragmentTransaction.replace(R.id.mapwhere, mSupportMapFragment).commit(); 
     } 

     if (mSupportMapFragment != null) { 
      mSupportMapFragment.getMapAsync(this); 
     } 


     return v; 
    } 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     Log.d("one","one"); 

     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     //mMap.getUiSettings().setZoomControlsEnabled(true); 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(getActivity(), 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 
       Log.d("two","two"); 
       buildGoogleApiClient(); 
       mMap.setMyLocationEnabled(true); 

      } 
     } else { 
      Log.d("three","three"); 
      buildGoogleApiClient(); 
      mMap.setMyLocationEnabled(true); 

     } 
    } 
    protected synchronized void buildGoogleApiClient() { 
     Log.d("four","four"); 
     mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .addApi(Places.GEO_DATA_API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.d("five","five"); 
     mLastLocation = location; 

     if (mCurrLocationMarker != null) { 
      mCurrLocationMarker.remove(); 
     } 
     //mMap.getUiSettings().setZoomControlsEnabled(true); 

     final Double lat = location.getLatitude(); 
     final Double lng = location.getLongitude(); 
     Log.d("LATLANGz", lat + "|" + lng); 
     latLng = new LatLng(lat, lng); 
     markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("Current Positionn"); 
     if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     mMap.setMyLocationEnabled(false); 

     markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.user_location)); 

     marker = mMap.addMarker(markerOptions); 

     //move map camera_main 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     Log.d("hey2","hey2"); 
//  mMapView.onResume(); 
     mSupportMapFragment.onResume(); 
    } 

    @Override 
    public void onPause() { 

     super.onPause(); 
     Log.d("hey1","hey1"); 
     // mMapView.onPause(); 
     mSupportMapFragment.onPause(); 
    } 

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

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

    @Override 
    public void onDetach() { 
     Log.d("detach", "detach"); 
     super.onDetach(); 
     mSupportMapFragment.onDetach(); 

    } 


    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Log.d("six","six"); 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(1000); 
     mLocationRequest.setFastestInterval(1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

     if (mGoogleApiClient.isConnected()){ 
      Log.d("seven","six"); 
      if (ContextCompat.checkSelfPermission(getActivity(), 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

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

    } 
+2

@Anshul J'ai Internet et access_fine_location –

+0

avez-vous créé un projet sur google? –

+0

oui, quand je mets statique LatLng onMapReady fonction interne dans onCreate ça fonctionne bien –

Répondre

0

d'abord vérifier vos autorisations et votre clé google api dans votre manifeste

Votre mise en page xml doit être quelque chose comme ça, sans rien d'autre:

. <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:map="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.isg_biz.isg_tracking.MainActivity" /> 

Vous devez mettre en œuvre OnMapReadyCallback, puis votre code devrait être quelque chose comme ça dans onCreate():

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

Ne pas copier et coller le même code xml littéralement vous devez changer (outils: .....) de même qui existent dans votre xml

pour la documentation, code java & plus S'il vous plaît lire:

https://developers.google.com/maps/documentation/android-api/map-with-marker

0

d'abord la permission Chaeck dans le manifeste

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

puis vérifier la méthode pour l'emplacement actuel

private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() { 
    @Override 
    public void onMyLocationChange(Location location) { 
     LatLng loc = new LatLng(location.getLatitude(), location.getLongitude()); 
     marker = map.addMarker(new MarkerOptions().position(loc)); 
     if(map != null){ 
      map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f)); 
     } 
    } 
}; 

puis utilisez

mMap.setOnMyLocationChangeListener(myLocationChangeListener); 

et être carte de patience prendre le temps Laoding dépend de vous la vitesse du réseau

commentaire si une requête