我有以下代码获取设备的当前位置:
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();
}
}
}
此代码工作正常,但在某些设备无效,要使用此代码获得成功,我必须重启设备或关闭并重新打开活动,所以我想避免这个问题。
建议这个stack overflow aswer我尝试迁移到LocationFusedLocation来解决这个问题,但是我在java类中添加GooglePlayServicesClient实现时遇到了一些问题,因为这个库暂时被弃用了link。 那么......我该怎么办?还有其他办法吗?
答案 0 :(得分:0)
看起来您已经在使用GoogleApiClient,因此您不需要任何帮助。您的代码已经更新为不推荐的方式。
只需要进行一些更改即可解决您的问题,我还会看到另外一个未提及的问题。
首先,您提到您在使用Location侦听器时遇到问题,并且您需要重新启动Activity以使其再次运行。
要解决此问题,只需将连接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();
}
}