Google Play服务版本9.0.83的路线跟踪活动中地图上未显示任何标记

在下面的代码中,我的updateLocation方法中的if(map!=null && mapIsReady==true) {...}内容永远不会被调用。 知道为什么吗?

 package com.noureddine_ouertani.www.wocelli50; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Color; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Bundle; import android.os.PowerManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.widget.Toast; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; 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.PolylineOptions; import java.util.ArrayList; import java.util.List; public class NeueRouteAufzeichnen extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private LocationManager locationManager; private Location mLastLocation; private Location previousLocation; private long distanceTraveled; private boolean tracking = false; private long startTime; private PowerManager.WakeLock wakeLock; private boolean gpsFix; private static final double MILLISECONDS_PER_HOUR = 100 * 60 * 60; private static final double MILES_PER_KILOMETER = 0.621371192; private static final int MAP_ZOOM = 18; private List locations; private GoogleApiClient mGoogleApiClient; GoogleMap map; LatLng myPosition; boolean mapIsReady = false; com.google.android.gms.location.LocationListener mlocationListener = new com.google.android.gms.location.LocationListener() { @Override public void onLocationChanged(Location location) { updateLocation(location); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .addApi(AppIndex.API).build(); } setContentView(R.layout.activity_neue_route_aufzeichnen); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); locations = new ArrayList(); } protected void onStart() { mGoogleApiClient.connect(); super.onStart(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path") ); AppIndex.AppIndexApi.start(mGoogleApiClient, viewAction); } protected void onStop() { mGoogleApiClient.disconnect(); super.onStop(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path") ); AppIndex.AppIndexApi.end(mGoogleApiClient, viewAction); } @Override public void onConnected(Bundle connectionHint) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(), "Permissions missing for mGoogleApiClient.", Toast.LENGTH_SHORT).show(); } Toast.makeText(getApplicationContext(), "mGoogleApiClient is connected.", Toast.LENGTH_SHORT).show(); mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if(mLastLocation!=null){ Toast.makeText(getApplicationContext(), "YES! mLastLocation!=null", Toast.LENGTH_SHORT).show(); } } @Override public void onConnectionSuspended(int i) { Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient is suspended.", Toast.LENGTH_SHORT).show(); } public void addPoint(Location location) { locations.add(location); Toast.makeText(getApplicationContext(), "addPoint has been called.", Toast.LENGTH_SHORT).show(); } @Override public void onMapReady(GoogleMap map) { distanceTraveled = 0; Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setBearingRequired(true); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); Toast.makeText(getApplicationContext(), "onMapReady is called.", Toast.LENGTH_SHORT).show(); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { float LOCATION_REFRESH_DISTANCE = 5000; long LOCATION_REFRESH_TIME = 0; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, (LocationListener) mlocationListener); } PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NO Sleep"); wakeLock.acquire(); if (!mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } tracking = true; startTime = System.currentTimeMillis(); //Toast.makeText(getApplicationContext(), " mGoogleApiClient.connect()call from onMapReady!", Toast.LENGTH_SHORT).show(); //LatLng sydney = new LatLng(-34, 151); //map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); //map.moveCamera(CameraUpdateFactory.newLatLng(sydney)); mapIsReady = true; } protected void updateLocation(Location location) { Toast.makeText(getApplicationContext(), "updateLocation method called.", Toast.LENGTH_SHORT).show(); if (location != null && gpsFix == true) { addPoint(location); if (previousLocation != null) distanceTraveled += location.distanceTo(previousLocation); } if(map!=null && mapIsReady==true) { Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show(); LatLng newPosition = new LatLng(location.getLatitude(), location.getLongitude()); map.addMarker(new MarkerOptions().position(newPosition).title("newPosition")); map.moveCamera(CameraUpdateFactory.newLatLng(newPosition)); locations.add(mLastLocation); } previousLocation = location; } public void draw() { Toast.makeText(getApplicationContext(), "Draw method called.", Toast.LENGTH_SHORT).show(); if (map == null) { return; } PolylineOptions options = new PolylineOptions(); options.color(Color.parseColor("#CC0000FF")); options.width(5); options.visible(true); for (Location locRecorded : locations) { options.add(new LatLng(locRecorded.getLatitude(), locRecorded.getLongitude())); Toast.makeText(getApplicationContext(), "draw method got new location!", Toast.LENGTH_SHORT).show(); } map.addPolyline(options); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient failed.", Toast.LENGTH_SHORT).show(); } } 

我得到以下地图(没有标记)

在此处输入图像描述

PS:我仍然没有调用我的draw()方法。

我看到你的日志错误。

06-24 18:50:24.488 7128-7759 / com.noureddine_ouertani.www.wocelli50 E / DynamiteModule:无法加载模块描述符类:未找到类“com.google.android.gms.dynamite.descriptors.com。 google.android.gms.googlecertificates.ModuleDescriptor“on path:DexPathList [[zip file”/data/app/com.noureddine_ouertani.www.wocelli50-2/base.apk”],nativeLibraryDirectories=[/vendor/lib64,/ system / lib64下]]

在阅读了关于此日志错误的一些post和答案(例如这个或这个 )后,我认为我发现这是一个已知的Google Play服务版本9.0.83问题,导致某些使用类似我的GoogleApiClient的应用程序出现错误。

我尝试通过以下方式解决此问题:1。 手动降级Google Play服务 2. 降级Google Play服务 后调整依赖关系

但这并没有解决问题。

PS:这是我的XML

  

当您使用FusedLocationApi时,您可以按照此处的说明请求位置更新: https : //developer.android.com/training/location/receive-location-updates.html

你还需要添加this.map = map; 在你的onMapReady

在你的例子中:

 public class NeueRouteAufzeichnen extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private Location mLastLocation; private Location previousLocation; private long distanceTraveled; private boolean tracking = false; private long startTime; private PowerManager.WakeLock wakeLock; private boolean gpsFix; private static final double MILLISECONDS_PER_HOUR = 100 * 60 * 60; private static final double MILES_PER_KILOMETER = 0.621371192; private static final int MAP_ZOOM = 18; private List locations; private GoogleApiClient mGoogleApiClient; GoogleMap map; LatLng myPosition; boolean mapIsReady = false; LocationRequest mLocationRequest; com.google.android.gms.location.LocationListener mlocationListener = new com.google.android.gms.location.LocationListener() { @Override public void onLocationChanged(Location location) { updateLocation(location); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .addApi(AppIndex.API).build(); } setContentView(R.layout.activity_neue_route_aufzeichnen); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); locations = new ArrayList(); } protected void onStart() { mGoogleApiClient.connect(); super.onStart(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path") ); AppIndex.AppIndexApi.start(mGoogleApiClient, viewAction); } protected void onStop() { mGoogleApiClient.disconnect(); super.onStop(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path") ); AppIndex.AppIndexApi.end(mGoogleApiClient, viewAction); } @Override public void onConnected(Bundle connectionHint) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(), "Permissions missing for mGoogleApiClient.", Toast.LENGTH_SHORT).show(); } Toast.makeText(getApplicationContext(), "mGoogleApiClient is connected.", Toast.LENGTH_SHORT).show(); mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null) { Toast.makeText(getApplicationContext(), "YES! mLastLocation!=null", Toast.LENGTH_SHORT).show(); } mLocationRequest = LocationRequest.create(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setInterval(1000); // 1 SECOND mLocationRequest.setFastestInterval(1000); // 1 SECOND LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, mlocationListener); } @Override public void onConnectionSuspended(int i) { Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient is suspended.", Toast.LENGTH_SHORT).show(); } public void addPoint(Location location) { locations.add(location); Toast.makeText(getApplicationContext(), "addPoint has been called.", Toast.LENGTH_SHORT).show(); } @Override public void onMapReady(GoogleMap map) { this.map = map; distanceTraveled = 0; Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setBearingRequired(true); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); Toast.makeText(getApplicationContext(), "onMapReady is called.", Toast.LENGTH_SHORT).show(); PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NO Sleep"); wakeLock.acquire(); if (!mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } tracking = true; startTime = System.currentTimeMillis(); //Toast.makeText(getApplicationContext(), " mGoogleApiClient.connect()call from onMapReady!", Toast.LENGTH_SHORT).show(); //LatLng sydney = new LatLng(-34, 151); //map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); //map.moveCamera(CameraUpdateFactory.newLatLng(sydney)); mapIsReady = true; } protected void updateLocation(Location location) { Toast.makeText(getApplicationContext(), "updateLocation method called.", Toast.LENGTH_SHORT).show(); if (location != null && gpsFix == true) { addPoint(location); if (previousLocation != null) distanceTraveled += location.distanceTo(previousLocation); } if (map != null && mapIsReady == true) { Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show(); LatLng newPosition = new LatLng(location.getLatitude(), location.getLongitude()); map.addMarker(new MarkerOptions().position(newPosition).title("newPosition")); map.moveCamera(CameraUpdateFactory.newLatLng(newPosition)); locations.add(mLastLocation); } previousLocation = location; } public void draw() { Toast.makeText(getApplicationContext(), "Draw method called.", Toast.LENGTH_SHORT).show(); if (map == null) { return; } PolylineOptions options = new PolylineOptions(); options.color(Color.parseColor("#CC0000FF")); options.width(5); options.visible(true); for (Location locRecorded : locations) { options.add(new LatLng(locRecorded.getLatitude(), locRecorded.getLongitude())); Toast.makeText(getApplicationContext(), "draw method got new location!", Toast.LENGTH_SHORT).show(); } map.addPolyline(options); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient failed.", Toast.LENGTH_SHORT).show(); } }