位置侦听器在某些设备上存在问题,并且在迁移到 FusedLocationListener 时存在问题
Location listener have problems to works in some devices and problems to migrate to FusedLocationListener
我有以下获取设备当前位置的代码:
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();
}
}
}
这段代码工作正常,但在某些设备上不起作用,为了使用这段代码获得成功,我必须重新启动设备或关闭并重新打开 activity,所以我想避免这个问题。
推荐这个stack overflow aswer I tried to migrate to LocationFusedLocation to solve this issue but I face some problems adding GooglePlayServicesClient implements in java class because this library is temporally deprecated as said this 。
那么……我能做什么?还有其他方法吗?
您似乎已经在使用 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);
}
这是应该适合您的完整 class 代码,请注意我还添加了一个 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();
}
}
我有以下获取设备当前位置的代码:
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();
}
}
}
这段代码工作正常,但在某些设备上不起作用,为了使用这段代码获得成功,我必须重新启动设备或关闭并重新打开 activity,所以我想避免这个问题。
推荐这个stack overflow aswer I tried to migrate to LocationFusedLocation to solve this issue but I face some problems adding GooglePlayServicesClient implements in java class because this library is temporally deprecated as said this
您似乎已经在使用 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);
}
这是应该适合您的完整 class 代码,请注意我还添加了一个 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();
}
}