私は自分の携帯電話の3つのリモートサービスと通信するアプリを開発しています。コミュニケーションのために、私はどちらの方法が最適か(インテントまたはAIDL)を見つけようとしています。Bluetooth経由でそれぞれ15バイトの4ストリーム/秒の速度でストリームを受信し、データロギングを実行するためにgpsの場所を追加したいと思います。私は毎秒GPSの場所が必要です。requestLocationUpdatesの時間は単なるヒントなので、毎秒最後の既知の場所を要求するタイマーを作成しました。
残念ながら、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):致命的な例外:Timer-0 04-06 15:06:43.015:E / AndroidRuntime(844):java.lang.SecurityException:不正なインターフェイスへのバインダーの呼び出し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):android os.Parcel.readException(Parcel.java:1276)04-06 15:06:43.015:E / AndroidRuntime(844):android.location.ILocationManager $ Stub $ Proxy.getLastKnownLocation(ILocationManager.java:896)04-06 15:06:43.015:E / AndroidRuntime(844):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):at java.util.Timer $ TimerImpl.run(Timer.java:284)
ロケーションマネージャーが一種の補助を使用してアプリにロケーションを提供し、すべての通信がAIDLを使用して行われる場合、電話はそのような量の情報を処理できない可能性がありますか?インテントを使用するとなぜ正常に動作するのか理解できず、AIDLを使用すると常にこのエラーが発生します。
PS:誰かがタイマーがサービスまたはアクティビティクラスにないことが原因である可能性があると示唆したので、コードを実行するサービスを作成しましたが、同じ状況になりました。すべての通信がインテントを使用して行われ、AIDLを使用するとエラーが発生した場合は正常に機能します。