2012-04-06 3 views
0

Я разрабатываю приложение, которое общается с тремя удаленными службами на моем телефоне. Для связи я пытаюсь выяснить, какой метод является лучшим (намерения или AIDL). Я получаю поток через bluetooth со скоростью 4 потока/секунду с 15 байтами каждый, и теперь я хочу добавить свое местоположение gps для выполнения регистрации данных. Мне нужно мое местоположение gps каждую секунду. Поскольку время в requestLocationUpdates является лишь подсказкой, я создал таймер, который запрашивает последнее известное местоположение каждую секунду.Ошибка при получении gps-адреса

К сожалению, я получаю сообщение об ошибке, которое не могу исправить, когда пытаюсь связаться с помощью AIDL. Странно, когда я использую намерения передавать полученные данные удаленным службам, все работает нормально.

Может ли кто-нибудь помочь мне?

Вот мой код:

private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 0; //meters 
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; //in Milliseconds 
    private final MyLocationListener listener; 
    private final LocationManager mLocationManager; 
    private final List<String> providers; 


    public Parser() { 
     mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
     listener = new MyLocationListener(); 
     listener.onProviderEnabled(LocationManager.GPS_PROVIDER); 
     mLocationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, 
       MINIMUM_TIME_BETWEEN_UPDATES, 
       MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
       listener); 
     providers = mLocationManager.getProviders(true); 
     timer = new Timer(); 
    } 

    public boolean parse(byte[] data) { 
     gpsUpdater(); 
     ... 
    } 

    private void gpsUpdater() { 
     timer.scheduleAtFixedRate(new TimerTask() { 
      Location l = null; 

      @Override 
      public void run() { 
       for(String s: providers) { 
        l = mLocationManager.getLastKnownLocation(s); 
        if(l != null) { 
         gps = true; 
         latitude = l.getLatitude(); 
         longitude = l.getLongitude(); 
        } 
       } 
      } 
     }, 0, MINIMUM_TIME_BETWEEN_UPDATES); 
    } 


    public class MyLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location arg0) { 
     //TODO Auto-generated method stub 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

} 

и вот ошибка, что я получил:

04-06 15: 06: 43,015: E/AndroidRuntime (844): FATAL ИСКЛЮЧЕНИЕ: Таймер -0 04-06 15: 06: 43.015: E/AndroidRuntime (844): java.lang.SecurityException: вызов Binder в неправильный интерфейс 04-06 15: 06: 43.015: E/AndroidRuntime (844): на android .os.Parcel.readException (Parcel.java:1322) 04-06 15: 06: 43.015: E/AndroidRuntime (844): at android.os.Parce l.readException (Parcel.java:1276) 04-06 15: 06: 43.015: E/AndroidRuntime (844): at android.location.ILocationManager $ Stub $ Proxy.getLastKnownLocation (ILocationManager.java:896) 04-06 15: 06: 43.015: E/AndroidRuntime (844): at android.location.LocationManager.getLastKnownLocation (LocationManager.java:1020) 04-06 15: 06: 43.015: E/AndroidRuntime (844): на pt.ua. droidshark.handler.Parser $ 1.run (Parser.java:446) 04-06 15: 06: 43.015: E/AndroidRuntime (844): на java.util.Timer $ TimerImpl.run (Timer.java:284)

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

PS: Поскольку кто-то предположил, что причиной может быть то, что таймер не находится в классе службы или активности, я создал службу, в которой я выполняю код, и у меня такая же ситуация. Прекрасно работает, когда вся связь выполняется с использованием намерений и получает ошибку при использовании AIDL.

ответ

2

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

1) Либо вы реализуете слушателей в деятельности, которая остается в живых, так что расположение обновляется в соответствии с параметрами, установленными в requestLocationUpdates(), но это оставляет GPS, и съедает батарею

2) Вы настраиваете таймер в своей деятельности, и вы проверяете местоположение из своей деятельности, используя реализацию с обратными вызовами (см. Этот пример: What is the simplest and most robust way to get the user's current location on Android?)

3) Вы можете реализовать услугу, и этот компонент будет создан Commonsware, который будет выполнять работа для вас: https://github.com/commonsguy/cwac-locpoll

0

Убедитесь, что вы добавили правильные разрешения в свой файл AndroidManifest.xml.

Включает ли этот тег?

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
+0

Да, я включил это разрешение –

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