2012-04-06 15 views
0

私の電話で3つのリモートサービスと通信するアプリケーションを開発しています。コミュニケーションのために私はどの方法が最も良いか(インテントまたはAIDL)を把握しようとしています。私は、それぞれ15バイトで4ストリーム/秒の速度でブルートゥース経由のストリームを受信し、今私はデータロギングを実行するために私のGPS位置を追加したい。 毎秒私のGPS位置が必要です。 requestLocationUpdatesの時間はちょうどヒントなので、毎秒最後の既知の場所を尋ねるタイマーを作成しました。gpsの場所を取得する際のエラー

残念ながら、私はAIDLを使用して通信しようとすると修正できないというエラーが発生しています。これの奇妙なのは、リモートサービスに受信したデータを渡すためにインテントを使用している場合、すべて正常に動作します。

誰でもお手伝いできますか?

ここに私のコード:

04-06:15:06:43.015:E/AndroidRuntime(844):致命的な例外:タイマ

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 

    } 

} 

、ここでは、私が得たエラーです-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.Parce l.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):at 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を使用してすべての通信が行われたときに電話機がそのような情報量を処理できないことはありますか?私はインテントを使用するとうまく動作する理由を理解できず、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

はい、私にはこの許可が含まれています –

関連する問題