获取gps位置时出错

时间:2012-04-06 15:46:10

标签: android timer gps aidl

我正在开发一款与手机上的三种远程服务进行通信的应用。对于通信,我试图找出哪种方法最好(意图或AIDL)。我通过蓝牙以4流/秒的速率接收流,每个15字节,现在我想添加我的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: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):在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):at 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进行所有通信时,手机无法处理这么多信息?我无法理解为什么它在我使用意图时工作正常并且在我使用AIDL时总会出现此错误。

PS:由于有人建议原因可能是计时器不在服务或活动类中,我创建了一个服务,我执行代码并得到相同的情况。使用意图进行所有通信时工作正常,使用AIDL时出错。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

确保您已为AndroidManifest.xml文件添加了正确的权限。

是否包含此标记?

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />