我有以下代码获取设备的当前位置:
public class MapPlace extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener
{
private LocationRequest mLocationRequest;
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
// location coordinates
double dLatitude = 0.0;
double dLongitude = 0.0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_place);
if (mGoogleApiClient == null || !mGoogleApiClient.isConnected())
{
buildGoogleApiClient();
mGoogleApiClient.connect();
}
MapFragment mapF = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
if (mapF != null)
mapF.getMapAsync(this);
}
protected synchronized void buildGoogleApiClient()
{
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {}
@Override
public void onLocationChanged(Location location)
{
mLastLocation = location;
dLatitude = mLastLocation.getLatitude();
dLongitude = mLastLocation.getLongitude();
}
}
}
此代码工作正常,但在某些设备不工作,要使用此代码获得成功,我必须重新启动设备或关闭并重新打开活动,所以我想避免此问题。
作为推荐这个堆栈溢出答案,我试图迁移到LocationFusedLocation来解决这个问题,但我面临一些问题,在java类中添加GooglePlayServicesClient实现,因为这个库暂时被弃用,如此链接所述。所以…我能做什么?还有别的办法吗?
看起来你已经在使用GoogleApiClient了,所以你不需要任何帮助。你的代码已经被更新为不被弃用的方式。
只要做一些改变就可以解决你的问题,我看到还有一个问题没有提到。
首先,你提到你的位置监听器有问题,你需要重新启动活动,让它再次工作。
要解决这个问题,只需将连接GoogleApiClient的代码从onCreate()移动到onResume():@Override
public void onResume() {
super.onResume();
if (mGoogleApiClient == null || !mGoogleApiClient.isConnected())
{
buildGoogleApiClient();
mGoogleApiClient.connect();
}
MapFragment mapF = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
//only call getMapAsync() again if mMap is null:
if (mapF != null && mMap == null)
mapF.getMapAsync(this);
}
另一个问题是,你应该取消注册onPause()中的位置更新,这样当用户离开你的应用程序时,你的应用程序就不会继续请求位置更新:
@Override
public void onPause() {
super.onPause();
//added to stop location updates when Activity is no longer active
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}
这里是完整的类代码,应该为您工作,请注意,我还添加了一个GoogleMap引用,并设置它在onMapReady()回调(你可能已经在你的完整代码):
public class MapPlace extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener
{
private LocationRequest mLocationRequest;
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
// location coordinates
double dLatitude = 0.0;
double dLongitude = 0.0;
GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_place);
}
@Override
public void onResume() {
super.onResume();
if (mGoogleApiClient == null || !mGoogleApiClient.isConnected())
{
buildGoogleApiClient();
mGoogleApiClient.connect();
}
MapFragment mapF = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
//only call getMapAsync() again if mMap is null:
if (mapF != null && mMap == null)
mapF.getMapAsync(this);
}
@Override
public void onPause() {
super.onPause();
//added to stop location updates when Activity is no longer active
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
}
protected synchronized void buildGoogleApiClient()
{
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {}
@Override
public void onLocationChanged(Location location)
{
mLastLocation = location;
dLatitude = mLastLocation.getLatitude();
dLongitude = mLastLocation.getLongitude();
}
}