Я разрабатываю приложение, которое общается с тремя удаленными службами на моем телефоне. Для связи я пытаюсь выяснить, какой метод является лучшим (намерения или 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.
Да, я включил это разрешение –