我正在尝试通过onConnected()
方法获取当前位置。但不幸的是onMapReady()
被提前调用。因此,我的变量currentLatitude
和currentLongitude
包含值0.0,如下面的日志中所示:
I/System.out: currentLatitude : 0.0
I/System.out: currentLongitude : 0.0
D/: HostConnection::get() New Host Connection established 0xeec39820, tid 23599
I/System.out: onConnected
我之前已尝试使用AsyncTask
,但这不起作用,因为onPreExecute()
在onConnected()
之前执行。在这里你可以看到它的截图:
链接:http://i.imgur.com/Ur1ZGbb.png
下面你可以看到我的代码:
public class BreakDownOnMaps extends FragmentActivity implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener,
OnMapReadyCallback {
protected GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest = new LocationRequest();
double currentLatitude;
double currentLongitude;
LatLng latLng;
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_break_down_on_maps);
buildApi();
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onResume() {
super.onResume();
mGoogleApiClient.connect();
}
private void buildApi() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
public void handleNewLocation(Location loc) {
currentLatitude = loc.getLatitude();
currentLongitude = loc.getLongitude();
latLng = new LatLng(currentLatitude, currentLongitude);
System.out.println("handleNewLocation ");
}
@Override
public void onConnected(Bundle bundle) {
System.out.println("onConnected");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
}
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (location == null) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
}
else {
handleNewLocation(location);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
System.out.println("currentLatitude : " + currentLatitude);
System.out.println("currentLongitude : " + currentLongitude);
latLng = new LatLng(currentLatitude, currentLongitude);
MarkerOptions options = new MarkerOptions()
.position(latLng)
.title("I am here!");
googleMap.addMarker(options);
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
}
答案 0 :(得分:0)
我已经使用一个名为GoogleMap
的全局gMap
变量的setter方法修复了它。在handleNewLocation()
内部,我使用变量gMap
来确定使用标记的位置。
以下是完整代码:
public class BreakDownOnMaps extends FragmentActivity implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener,
OnMapReadyCallback {
protected GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest = new LocationRequest();
double currentLatitude;
double currentLongitude;
LatLng latLng;
GoogleMap gMap;
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_break_down_on_maps);
buildApi();
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onResume() {
super.onResume();
mGoogleApiClient.connect();
}
private void buildApi() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
public void handleNewLocation(Location loc) {
currentLatitude = loc.getLatitude();
currentLongitude = loc.getLongitude();
latLng = new LatLng(currentLatitude, currentLongitude);
System.out.println("handleNewLocation ");
MarkerOptions options = new MarkerOptions()
.position(latLng)
.title("I am here!");
gMap.addMarker(options);
gMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
}
@Override
public void onConnected(Bundle bundle) {
System.out.println("onConnected");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
}
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (location == null) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
}
else {
handleNewLocation(location);
};
}
@Override
public void onConnectionSuspended(int i) {}
@Override
public void onLocationChanged(Location location) {
handleNewLocation(location);
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {}
@Override
public void onMapReady(GoogleMap googleMap) {
System.out.println("currentLatitude : " + currentLatitude);
System.out.println("currentLongitude : " + currentLongitude);
latLng = new LatLng(currentLatitude, currentLongitude);
setgMap(googleMap);
if(currentLatitude != 0 || currentLongitude != 0) {
MarkerOptions options = new MarkerOptions()
.position(latLng)
.title("I am here!");
googleMap.addMarker(options);
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
public GoogleMap getgMap() {
return gMap;
}
public void setgMap(GoogleMap gMap) {
this.gMap = gMap;
}
}