2013-08-05 3 views
0

Я изучаю проблему в программном обеспечении для Android, которое в фоновом режиме регистрирует местоположение устройства в файле журнала. Код выглядит следующим образом:requestLocationUpdates in onStartCommand вызывает остановку GPS-ответа?

package com.otpc.auto; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.IBinder; 
import android.os.Looper; 
import android.util.Log; 
import android.widget.Toast; 

public class LocationUpdate extends Service { 
    private String TAG = "LocationUpdate"; 
    private LocationManager loc; 
    private class CustomLocationListener implements LocationListener { 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 
     public void onProviderEnabled(String provider) { 
     } 
     public void onProviderDisabled(String provider) { 
     } 
     public void onLocationChanged(Location location) { 
      writeLocationData(location); 
     } 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "Location Update service has been started", Toast.LENGTH_SHORT).show(); 
     loc = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 60 * 1000, 100, 
       new CustomLocationListener(), 
       Looper.myLooper()); 
     loc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60 * 60 * 1000, 100, 
       new CustomLocationListener(), 
       Looper.myLooper()); 
     return Service.START_STICKY; 
    } 
    private void writeLocationData(Location location){ 
     final double latitude = location.getLatitude(); 
     final double lon = location.getLongitude(); 
     new Thread(){ 
      public void run() { 
       try { 
        FileOutputStream latitudeFile = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/latitude.txt"); 
        latitudeFile.write(String.valueOf(latitude).getBytes()); 
        latitudeFile.close(); 
        FileOutputStream longitudeFile = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/longitude.txt"); 
        longitudeFile.write(String.valueOf(lon).getBytes()); 
        longitudeFile.close(); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      }; 
     }.start(); 
    } 
} 

После регистрации в качестве службы запуска другое приложение больше не может использовать GPS-сервис. Тестирование GPS с помощью приложений GPS-тестеров дает результат, точно так же, как устройство не имеет GPS. Только после того, как мы удалим это приложение с устройства, GPS вернется к нормальной работе.

Что не так с вышеуказанным кодом. Я не эксперт в Android, но из того, что вижу, я не вижу какой-либо аномалии в коде.

Спасибо.

ответ

0

Я не помню точно, в чем причина, но я испытал эту проблему раньше. Я думаю, проблема заключалась в том, что запрошенная частота обновления была выше (или, может быть, ниже), чем может обрабатывать устройство. Попробуйте сыграть с цифрами в своем запросе и посмотреть, улучшится ли ситуация.

0

Попробуйте устранение Looper.myLooper() при регистрации обратных вызовов местоположения:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast.makeText(this, "Location Update service has been started", Toast.LENGTH_SHORT).show(); 
    loc = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 60 * 1000, 100, 
      new CustomLocationListener()); 
    loc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60 * 60 * 1000, 100, 
      new CustomLocationListener()); 
    return Service.START_STICKY; 
} 

Если вы зарегистрируетесь Looper.myLooper() вы регистрируя систему поток, вызвавший onStartCommand() использовать свою очередь сообщений для реализации механизма обратного вызова, который, вероятно, вызывает проблемы в фоновом режиме.

Смежные вопросы