[英]How can I wait for mGoogleApiClient.isConnected()==true in my OnMapReady method?
我有一个Java类,它扩展了FragmentActivity
并实现了OnMapReadyCallback
GoogleApiClient.ConnectionCallbacks
和GoogleApiClient.OnConnectionFailedListener
接口
我的onMapReady(GoogleMap map)
方法中有此代码
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}
if (mLastLocation!=null) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
}else {
Toast.makeText(getApplicationContext(), "onMapReady running mLastLocation == null", Toast.LENGTH_SHORT).show();
}
这是我的onConnected
方法的实现
@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);
}
当我在我的应用程序中运行此活动时,在“ mGoogleApiClient已连接”之前,会出现“ toMap“ onMapReady runningmLastLocation == null” 。
如何使if (mLastLocation!=null) {..}
等到mGoogleApiClient.isConnected()==true
?
我尝试了这个:
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}
do{Toast.makeText(getApplicationContext(), "mGoogleApiClient getting last location", Toast.LENGTH_SHORT).show();} while (mLastLocation==null);
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
and wait(2000); //wait 2 seconds
wait(2000); //wait 2 seconds
如下所示:
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}
try {
wait(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
尽管我认为仅在地图上查看我的当前位置并不是最终的理想选择。
在第一种情况下,我得到的是黑屏而不是地图,而在第二种情况下,我看到的是一小段时间加载的地图,然后又降落到应用程序的其他活动中。
我也尝试过此操作,并获得了黑屏,而不是我的地图:
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}
do{
int waiting =0;
if (waiting <1000){waiting++;} else{waiting =0;}} while (mLastLocation==null);
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
如果有任何提示或帮助,我将不胜感激。
@itsBGO:
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;
LocationListener mlocationListener;
GoogleMap map;
LatLng myPosition;
@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();
}
locations.add(mLastLocation);
if(map!=null) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
map.setMyLocationEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.getUiSettings().setMapToolbarEnabled(false);
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
draw();
}
}
@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;
mlocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mlocationListener);
}
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NO Sleep");
wakeLock.acquire();
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}
if (mLastLocation != null && mGoogleApiClient.isConnected()) {
map.setMyLocationEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.getUiSettings().setMapToolbarEnabled(false);
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
draw();
} else {
Toast.makeText(getApplicationContext(), "onMapReady running BUT mLastLocation == null", Toast.LENGTH_SHORT).show();
}
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));
}
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);
}
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();
LatLng newPosition = new LatLng(locRecorded.getLatitude(), locRecorded.getLongitude());
map.addMarker(new MarkerOptions().position(newPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(newPosition));
}
map.addPolyline(options);
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient failed.", Toast.LENGTH_SHORT).show();
}
}
@Louis Grignon:这是我的应用程序中的实时路线跟踪活动。 我添加了检查map!= null的代码,以下版本的代码没有错误,但在地图上未显示任何标记。
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();
}
locations.add(mLastLocation);
int waiting =0;
if(map!=null && mapIsReady==true) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
map.setMyLocationEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.getUiSettings().setMapToolbarEnabled(false);
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
draw();
}
}
@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);
}
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();
LatLng newPosition = new LatLng(locRecorded.getLatitude(), locRecorded.getLongitude());
map.addMarker(new MarkerOptions().position(newPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(newPosition));
}
map.addPolyline(options);
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient failed.", Toast.LENGTH_SHORT).show();
}
}
这是我的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" />
运行时我收到以下红色日志(清理并重新运行)
找不到类“ com.google.android.gms.dynamite.descriptors.com.google.android.gms.googlecertificates.moduledescriptor”
问题还在于,我的if(map!=null && mapIsReady==true) {...}
内容从未被调用过。
这是我收到的完整的红色日志消息
/ DynamiteModule:无法加载模块描述符类:在以下路径上找不到类“ com.google.android.gms.dynamite.descriptors.com.google.android.gms.googlecertificates.ModuleDescriptor”:DexPathList [[zip文件“ / data / app / com.noureddine_ouertani.www.wocelli50-1 / base.apk“],nativeLibraryDirectories = [/ vendor / lib64,/ system / lib64]]
当mGoogleApiClient仍在连接时,您正在onMapReady方法中检查mLastLocation。
让您的类实现LocationListener并重写onLocationChanged,而不是在onMapReady内部创建匿名LocationListener。
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
将以下代码放在onConnected方法而不是onMapReady内。 如果您的mLastLocation == null,也请在运行的else块内调用requestLocationUpdates方法。
if (mLastLocation!=null) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
}else {
Toast.makeText(getApplicationContext(), "onMapReady running mLastLocation == null", Toast.LENGTH_SHORT).show();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mlocationListener);
}
将以下代码放入onLocationChanged或updateLocation方法中。
if (mLastLocation != null && mGoogleApiClient.isConnected()) {
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
draw();
} else {
Toast.makeText(getApplicationContext(), "onMapReady running BUT mLastLocation == null", Toast.LENGTH_SHORT).show();
}
为什么不使用单独的方法提取代码,在onConnected之后调用它,如以下示例所示:
您的onMapReady代码
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
} else {
initMapLocation();
}
您的onConnected代码
@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);
initMapLocation();
}
您的initMapLocation代码
private void initMapLocation() {
if (mLastLocation!=null) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
}else {
Toast.makeText(getApplicationContext(), "onMapReady running mLastLocation == null", Toast.LENGTH_SHORT).show();
}
无论如何,不要使用固定的等待时间(因为它们保持不可预测的状态),更不要使用活动的等待时间(因为它们大量使用处理器)。
希望能帮助到你 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.