0

我正在开发一个与手机上的三个远程服务通信的应用程序。对于沟通,我试图找出哪种方法是最好的(意图或 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): 在 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 时出现错误时工作正常。

4

2 回答 2

2

我认为你timer.scheduleAtFixedRate()在一个不是活动或服务的类中实现了一个循环任务()。这可能是原因

1)要么你在一个保持活动状态的活动中实现监听器,所以位置会根据设置的参数更新requestLocationUpdates(),但这会使 gps 保持开启并消耗电池

2)您在您的活动中设置了一个计时器,并使用带有回调的实现从您的活动中轮询位置(请参阅此示例:在Android上获取用户当前位置的最简单和最可靠的方法是什么?

3)您可以实现一项服务,Commonsware 提供的这个组件可以为您完成这项工作:https ://github.com/commonsguy/cwac-locpoll

于 2012-04-06T16:04:42.173 回答
0

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

它包括这个标签吗?

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