Я создаю приложение для Android для отслеживания местоположения пользователя GPS во время поездки (путем отправки событий с позиционированием информации на сервер), но до сих пор у меня есть две проблемы. Поскольку пользователь может приостановить приложение, чтобы использовать другие приложения во время поездки, приложение перестало бы отправлять события. Чтобы обойти эту проблему, я реализовал фоновый сервис, который продолжает работать, даже когда пользователь переключается на другое приложение и, следовательно, продолжает отправлять события на сервер. Однако кажется, что каким-то образом служба приостанавливается всякий раз, когда телефон выключает свой экран (переходите в спящий режим?). Вторая проблема - получение GPS-данных с телефона. Я установил необходимые разрешения для получения данных из приемника GPS, и на самом деле, иногда, позиция g извлекается правильно (в то же время, когда есть и другие приложения, использующие GPS). Когда нет других приложений, использующих GPS, полученное позиционирование является кортежем (0.0, 0.0) для долготы и широты. Мне непонятно, почему эти два вопроса имеют место. Почему фоновое обслуживание приостанавливается всякий раз, когда экраны отключены, и почему GPS возвращает правильное позиционирование только тогда, когда есть другие приложения, требующие использования GPS?Внедрение фоновых сервисов на Android
0
A
ответ
4
Я столкнулся с той же проблемой (первый выпуск). Я разрешаю это с помощью петлителя внутри службы. Для второго вопроса мы должны видеть, что некоторые ваши кодо-коды помогают вам. Также я покажу свой код для поиска, возможно, это поможет. Я использовал GoogleApiClient для этого https://developer.android.com/training/location/retrieve-current.html
public class LocationService extends Service implements com.google.android.gms.location.LocationListener {
private Thread mTriggerService;
private Handler mLooperHandler;
...
private void addLocationListener(){
// Start thread which listen location
mTriggerService = new Thread(new Runnable(){
public void run(){
try{
Looper.prepare();//Initialise the current thread as a looper.
mLooperHandler = new Handler();
initLocationManager();
Looper.loop();
}catch(Exception ex){
ex.printStackTrace();
}
}
}, "LocationThread");
mTriggerService.start();
}
/**
* Strart listening location
*/
public void initLocationManager(Context context) {
...
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(mInterval);
//This controls the fastest rate at which your application will receive location
//updates, which might be faster than setInterval(long) in some situations
//(for example, if other applications are triggering location updates).(from doc)
mLocationRequest.setFastestInterval(mFastestInterval);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "onConnected");
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "onConnectionSuspended");
}
})
.addOnConnectionFailedListener(mOnConnectionFailedListener)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
//stop listening location
private void stopLocationListener() {
if(mLocationHelper != null){
mLooperHandler.getLooper().quit();
if(mGoogleApiClient != null && mLocationListener != null
&& mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
}
}
}
}