0

私は自分の携帯電話の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を使用するとエラーが発生した場合は正常に機能します。

4

2 に答える 2

2

timer.scheduleAtFixedRate()アクティビティまたはサービスではないクラスに繰り返しタスク ( ) を実装していると思います。それが原因かもしれません

1)生き続けるアクティビティにリスナーを実装して、で設定されたパラメーターに従って場所が更新されるようにしますrequestLocationUpdates()が、これによりGPSがオンのままになり、バッテリーが消費されます

2) アクティビティにタイマーを設定し、コールバックのある実装を使用してアクティビティから位置をポーリングします (この例を参照してください: Android でユーザーの現在の位置を取得する最も簡単で最も堅牢な方法は何ですか? ) 。

3) サービスを実装することができます。Commonsware によって作成されたこのコンポメントがあります

于 2012-04-06T16:04:42.173 に答える
0

AndroidManifest.xmlファイルに正しいアクセス許可を追加したことを確認してください。

このタグは含まれていますか?

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
于 2012-04-06T16:04:43.803 に答える