Wal*_*mar 3 java android google-play-services
我正在尝试收听位置更改,但有时onLocationChanged回调永远不会被调用并getLastLocation返回null,而Google地图始终完美运行.
注意
如果我重新启动设备,位置服务将仅工作约2天; 之后,Google地图仍在运行时,我的应用和SDK示例都无效.
这是我的服务代码:
public class VisitService extends Service implements
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener,
LocationListener {
private final IBinder mBinder = new VisitBinder();
// A request to connect to Location Services
private LocationRequest mLocationRequest;
// Stores the current instantiation of the location client in this object
private LocationClient mLocationClient;
private boolean mLocationServiceConnected = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initLocation();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
initLocation();
return mBinder;
}
public void startVisit() {
if (!servicesConnected()) {
listener.onVisitStartError();
return;
}
if (mLocationServiceConnected) {
if (isAcceptableLocation(mLocationClient.getLastLocation())) {
Toast.makeText(this, "You have arrived!", Toast.LENGTH_LONG);
} else {
mVisitListener.onVisitStartError();
}
}
}
private boolean isAcceptableLocation(Location location) {
if (location == null) {
Toast.makeText(this, "Location is null", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
private void initLocation() {
if (mLocationRequest == null) {
// Create a new global location parameters object
mLocationRequest = LocationRequest.create();
/*
* Set the update interval
*/
mLocationRequest
.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
// Use high accuracy
mLocationRequest
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the interval ceiling to one minute
mLocationRequest
.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
}
if (mLocationClient == null) {
mLocationClient = new LocationClient(this, this, this);
mLocationClient.connect();
}
}
/**
* Verify that Google Play services is available before making a request.
*
* @return true if Google Play services is available, otherwise false
*/
private boolean servicesConnected() {
// Check that Google Play services is available
int resultCode = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(this);
// If Google Play services is available
if (ConnectionResult.SUCCESS == resultCode) {
// In debug mode, log the status
Log.d(LocationUtils.APPTAG,
getString(R.string.play_services_available));
return true;
} else {
return false;
}
}
public class VisitBinder extends Binder {
public VisitService getService() {
return VisitService.this;
}
}
/**
* In response to a request to start updates, send a request to Location
* Services
*/
private void startPeriodicUpdates() {
mLocationClient.requestLocationUpdates(mLocationRequest, this);
Toast.makeText(this, "Location Update Requested", Toast.LENGTH_LONG).show();
}
/**
* In response to a request to stop updates, send a request to Location
* Services
*/
private void stopPeriodicUpdates() {
mLocationClient.removeLocationUpdates(this);
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(LocationUtils.APPTAG, "Location Services Connection faild");
}
@Override
public void onConnected(Bundle bundle) {
Log.d(LocationUtils.APPTAG, "Location Services Connected");
mLocationServiceConnected = true;
startPeriodicUpdates();
}
@Override
public void onDisconnected() {
mLocationServiceConnected = false;
}
@Override
public void onLocationChanged(Location location) {
Toast.makeText(this, "Location has been changed", Toast.LENGTH_LONG).show();
}
}
Run Code Online (Sandbox Code Playgroud)
Android Manifest
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)
首先是一个bug.我也遇到过这个问题.
您可以尝试一种简单的解决方法.
在尝试获取最后一个位置之前请求位置更新,即在尝试使用getLastLocation()找到最后位置之前请求位置更新;
就像:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria crta = new Criteria();
crta.setAccuracy(Criteria.ACCURACY_FINE);
crta.setAltitudeRequired(true);
crta.setBearingRequired(true);
crta.setCostAllowed(true);
crta.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(crta, true);
Log.d("","provider : "+provider);
// String provider = LocationManager.GPS_PROVIDER;
locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
Location location = locationManager.getLastKnownLocation(provider);
Run Code Online (Sandbox Code Playgroud)
此实现基于LocationManager.请选择位置客户端.
希望能帮助到你!
UPDATE
在这里你也可以使用onLocationChanged()方法,因为它会在每次更改位置时更新你,而getLastLocation()方法返回可能为NULL的最佳已知位置.
根据doc,GetLastLocation()方法将在极少数情况下返回NULL.但这种情况经常发生在我身上.
最新的更新
伙计们只有一个关于GPS的更新:
首先,我们需要使用GoogleApiClient代替LocationClient类.
其次,我们需要实施 GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener
第三,我们需要重写它onConnected(),onConnectionSuspended()和onConnectionFailed()方法.
休息你很高兴去.
干杯!
| 归档时间: |
|
| 查看次数: |
7905 次 |
| 最近记录: |