2012-04-06 102 views
0

我正在開發一個應用程序,可以與我的手機上的三個遠程服務進行通信。對於溝通,我試圖找出哪種方法是最好的(intents或AIDL)。我通過藍牙以4碼流/秒的速率接收每個15字節的流,現在我想添加我的gps位置以執行數據記錄。 我需要每秒我的gps位置。由於requestLocationUpdates中的時間只是一個提示,因此我創建了一個計時器,它每秒要求最後一次已知位置。獲取GPS位置時出錯

不幸的是,當我嘗試使用AIDL進行通信時,我遇到了無法修復的錯誤。奇怪的是,當我使用intents將接收到的數據傳遞給遠程服務時,所有工作都正常。

任何人都可以幫我嗎?

這裏我的代碼:

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):致命異常:計時器-0 04-06 15:06:43.015:E/AndroidRuntime(844):java.lang.SecurityException:綁定器對不正確接口的調用 04-06 15:06:43.015:E/AndroidRuntime(844):at 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):在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?我不明白爲什麼它在我使用intent時正常工作,並且始終在使用AIDL時出現此錯誤。 PS:由於有人提出原因可能是計時器不在服務或活動類中,因此我創建了一個服務,在該服務中執行代碼,並得到了相同的情況。當使用意圖進行所有通信並且在使用AIDL時出現錯誤時工作良好。

回答

2

我認爲你在一個不是活動或服務的類中執行了一個recing任務(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

是的,我包含此權限 – 2012-04-06 16:27:34