问题描述
在下面的代码中,我的 if(map!= null& mapIsReady == true){...}
在我的 updateLocation
方法永远不会被调用。任何想法为什么?
package com.noureddine_ouertani.www.wocelli50;
导入android.Manifest;
导入android.content.Context;
导入android.content.pm.PackageManager;
导入android.graphics.Color;
导入android.location.Criteria;
导入android.location.Location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.net.Uri;
导入android.os.Bundle;
导入android.os.PowerManager;
导入android.support.annotation.NonNull;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.app.FragmentActivity;
导入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;
导入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;
导入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实现了OnMapReadyCallback,GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener {
私人LocationManager locationManager;
私人位置mLastLocation;
私人位置previousLocation;
私人长途旅行;
private boolean tracking = false;
私人长时间startTime;
private PowerManager.WakeLock wakeLock;
私人布尔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;
私人列表<位置>位置;
私有GoogleApiClient mGoogleApiClient;
GoogleMap地图;
LatLng myPosition;
布尔值mapIsReady = false;
com.google.android.gms.location.LocationListener mlocationListener = new com.google.android.gms.location.LocationListener(){
@Override
public void onLocationChanged(位置位置){
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< Location>();
保护无效onStart(){
mGoogleApiClient.connect();
super.onStart();
//注意:这是自动生成的,用于实现App Indexing API。
//有关更多信息,请参阅https://g.co/AppIndexing/AndroidStudio。
Action viewAction = Action.newAction(
Action.TYPE_VIEW,// TODO:选择一个动作类型
NeueRouteAufzeichnen Page,// TODO:为显示的内容定义一个标题。 b $ b // TODO:如果您的网页内容与此应用活动的内容匹配,则
//确保此自动生成的网页网址是正确的。
//否则,请将网址设置为null。
Uri.parse(http:// host / path),
// TODO:确保这个自动生成的应用程序URL是正确的
Uri.parse(android -app://com.noureddine_ouertani.www.wocelli50/http/host/path)
);
AppIndex.AppIndexApi.start(mGoogleApiClient,viewAction);
}
保护无效onStop(){
mGoogleApiClient.disconnect();
super.onStop();
//注意:这是自动生成的,用于实现App Indexing API。
//有关更多信息,请参阅https://g.co/AppIndexing/AndroidStudio。
Action viewAction = Action.newAction(
Action.TYPE_VIEW,// TODO:选择一个动作类型
NeueRouteAufzeichnen Page,// TODO:为显示的内容定义一个标题。 b $ b // TODO:如果您的网页内容与此应用活动的内容匹配,则
//确保此自动生成的网页网址是正确的。
//否则,请将网址设置为null。
Uri.parse(http:// host / path),
// TODO:确保这个自动生成的应用程序URL是正确的
Uri.parse(android -app://com.noureddine_ouertani.www.wocelli50/http/host/path)
);
AppIndex.AppIndexApi.end(mGoogleApiClient,viewAction);
$ b @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(),mGoogleApiClient缺少的权限,Toast.LENGTH_SHORT).show );
}
Toast.makeText(getApplicationContext(),mGoogleApiClient已连接。,Toast.LENGTH_SHORT).show();
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if(mLastLocation!= null){
Toast.makeText(getApplicationContext(),YES!mLastLocation!= null,Toast.LENGTH_SHORT).show();
$ b}
@Override
public void onConnectionSuspended(int i){
Toast.makeText(getApplicationContext(),Connection mGoogleApiClient挂起。,Toast.LENGTH_SHORT).show();
}
public void addPoint(Location location){
locations.add(location);
Toast.makeText(getApplicationContext(),addPoint已被调用。,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被调用。,Toast.LENGTH_SHORT).show();
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
float LOCATION_REFRESH_DISTANCE = 5000;
长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(),onMapReady!中的mGoogleApiClient.connect()调用,Toast.LENGTH_SHORT).show();
// LatLng sydney = new LatLng(-34,151);
//map.addMarker(new MarkerOptions()。position(sydney).title(悉尼标记));
//map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
mapIsReady = true;
$ b保护无效updateLocation(位置位置){
Toast.makeText(getApplicationContext(),updateLocation方法调用。,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 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;
}
$ b $ public void draw(){
Toast.makeText(getApplicationContext(),Draw method called。,Toast.LENGTH_SHORT).show();
if(map == null){
return;
}
PolylineOptions选项=新的PolylineOptions();
options.color(Color.parseColor(#CC0000FF));
options.width(5);
options.visible(true); (位置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(),mGoogleApiClient连接失败,Toast.LENGTH_SHORT).show();
}
}
下面的地图(没有标记)
PS :我仍然不会调用我的 draw()
方法。
。
阅读了一些帖子和答案后(例如或)关于这个日志错误我想我发现这是一个已知的Google Play服务版本9.0.83问题,导致一些应用程序中的错误使用像我的一个GoogleApiClient。
我试图解决这个问题:
1.
2.
您还需要添加 this.map = map;
在你的 onMapReady
中。
在你的例子中:
public class NeueRouteAufzeichnen extends FragmentActivity实现了OnMapReadyCallback,GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener {
private Location mLastLocation;
私人位置previousLocation;
私人长途旅行;
private boolean tracking = false;
私人长时间startTime;
private PowerManager.WakeLock wakeLock;
私人布尔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;
私人列表<位置>位置;
私有GoogleApiClient mGoogleApiClient;
GoogleMap地图;
LatLng myPosition;
布尔值mapIsReady = false;
LocationRequest mLocationRequest;
com.google.android.gms.location.LocationListener mlocationListener = new com.google.android.gms.location.LocationListener(){
@Override
public void onLocationChanged(位置位置){
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< Location>();
}
保护无效onStart(){
mGoogleApiClient.connect();
super.onStart();
//注意:这是自动生成的,用于实现App Indexing API。
//有关更多信息,请参阅https://g.co/AppIndexing/AndroidStudio。
Action viewAction = Action.newAction(
Action.TYPE_VIEW,// TODO:选择一个动作类型
NeueRouteAufzeichnen Page,// TODO:为显示的内容定义一个标题。 b $ b // TODO:如果您的网页内容与此应用活动的内容匹配,则
//确保此自动生成的网页网址是正确的。
//否则,请将网址设置为null。
Uri.parse(http:// host / path),
// TODO:确保这个自动生成的应用程序URL是正确的
Uri.parse(android -app://com.noureddine_ouertani.www.wocelli50/http/host/path)
);
AppIndex.AppIndexApi.start(mGoogleApiClient,viewAction);
}
保护无效onStop(){
mGoogleApiClient.disconnect();
super.onStop();
//注意:这是自动生成的,用于实现App Indexing API。
//有关更多信息,请参阅https://g.co/AppIndexing/AndroidStudio。
Action viewAction = Action.newAction(
Action.TYPE_VIEW,// TODO:选择一个动作类型
NeueRouteAufzeichnen Page,// TODO:为显示的内容定义一个标题。 b $ b // TODO:如果您的网页内容与此应用活动的内容匹配,则
//确保此自动生成的网页网址是正确的。
//否则,请将网址设置为null。
Uri.parse(http:// host / path),
// TODO:确保这个自动生成的应用程序URL是正确的
Uri.parse(android -app://com.noureddine_ouertani.www.wocelli50/http/host/path)
);
AppIndex.AppIndexApi.end(mGoogleApiClient,viewAction);
$ b @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(),mGoogleApiClient缺少的权限,Toast.LENGTH_SHORT).show );
}
Toast.makeText(getApplicationContext(),mGoogleApiClient已连接。,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);
$ b @Override
public void onConnectionSuspended(int i){
Toast.makeText(getApplicationContext(),暂停mGoogleApiClient的连接。,Toast。 LENGTH_SHORT).show();
}
public void addPoint(Location location){
locations.add(location);
Toast.makeText(getApplicationContext(),addPoint已被调用。,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被调用。,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(),onMapReady!中的mGoogleApiClient.connect()调用,Toast.LENGTH_SHORT).show();
// LatLng sydney = new LatLng(-34,151);
//map.addMarker(new MarkerOptions()。position(sydney).title(悉尼标记));
//map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
mapIsReady = true;
$ b 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 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;
}
$ b $ public void draw(){
Toast.makeText(getApplicationContext(),Draw method called。,Toast.LENGTH_SHORT).show();
if(map == null){
return;
}
PolylineOptions选项=新的PolylineOptions();
options.color(Color.parseColor(#CC0000FF));
options.width(5);
options.visible(true); (位置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(),mGoogleApiClient连接失败,Toast.LENGTH_SHORT).show();
}
}
In the following code the content of my if(map!=null && mapIsReady==true) {...}
in my updateLocation
method is never called. Any idea why?
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<Location> 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<Location>();
}
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();
}
}
I get the following map (with no marker)
PS: I still don't call my draw()
method.
and I get this log error that you see.
After reading some posts and answers (e.g. this or this) about this log error I thought that I figured out that it's a known Google Play Services version 9.0.83 issue that causes bugs in some apps that use a GoogleApiClient like mine.
I tried to fix this by:1. Downgrading Google Play Services Manually 2. Adapting dependencies after downgrading Google Play Sevices
But this didn't solve the problem.
PS: Here is my XML
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
tools:context=".NeueRouteAufzeichnen"
android:name="com.google.android.gms.maps.SupportMapFragment" />
As you are using FusedLocationApi, you can request location updates as explained here: https://developer.android.com/training/location/receive-location-updates.html
You also need to add this.map = map;
in your onMapReady
.
In your example:
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<Location> 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<Location>();
}
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();
}
}
这篇关于使用Google Play服务版本9.0.83进行路线跟踪活动时,地图上没有显示标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!