我有一个Android应用程序,其中一个活动我正在使用Google Maps API V2,我有第二个活动,其上有一个Accelerometer。我通过使用相应的按钮在这两个活动之间切换。我正在尝试使用Accelerometer来检测用户驾驶时的制动情况,并在发生这种情况时在地图上放置标记。
如果我启动Accelerometer活动,然后切换到我的Map活动,我可以看到使用Log.d,Accelerometer不断从onSensorChanged获取其值,因此活动没有被关闭,这对我有好处。出于某种原因,虽然我似乎无法抓取Map活动上的值,因为它们的上升为0.0 0.0 0.0或null null null,具体取决于我使用的内容。有人可以告诉我如何做到这一点吗?
更新
Accelerometer代码的主要部分:
@Override
public void onSensorChanged(SensorEvent e) {
// TODO Auto-generated method stub
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// - + +
gravity[0] = alpha * gravity[0] + (1 - alpha) * e.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * e.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * e.values[2];
acceleration[0] = e.values[0] - gravity[0];
acceleration[1] = e.values[1] - gravity[1];
acceleration[2] = e.values[2] - gravity[2];{
txtX.setText(""+Math.round((acceleration[0] * 100.0) / 100.0));
txtY.setText(""+Math.round((acceleration[1] * 100.0) / 100.0));
txtZ.setText(""+Math.round((acceleration[2] * 100.0) / 100.0));
}
我想在Map活动的onLocationChanged侦听器中获取Accelerometer值,以便我可以在检测到减速时立即放置标记。
答案 0 :(得分:0)
如果您看到日志消息告诉您仍在接收来自传感器的数据,则您可能仍在后台注册了该活动。这不是一个好主意,因为你可以快速耗尽电池(当你不再需要它时停止从传感器接收数据)。
要取消注册,请添加以下内容:
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
回到您的问题,您还需要注册Map活动,以便从传感器接收数据。 另一种解决方案可能是在服务中接收数据。
您可以在此处找到有关传感器的更多信息: http://developer.android.com/guide/topics/sensors/sensors_overview.html
答案 1 :(得分:0)
最后,我不得不创建另一类Accelerometer并将其转换为后台服务。后台服务工作得很好,我正在使用来自Accelerometer服务的广播和Map活动中的广播接收器来获取我的数据。
我将Intent和putExtras以及广播管理器放在Accelerometer服务的onSensorChanged中,如下所示:
@Override
public void onSensorChanged(SensorEvent e) {
// TODO Auto-generated method stub
if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// - + +
gravity[0] = alpha * gravity[0] + (1 - alpha) * e.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * e.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * e.values[2];
acceleration[0] = e.values[0] - gravity[0];
acceleration[1] = e.values[1] - gravity[1];
acceleration[2] = e.values[2] - gravity[2];
//Log.d(TAG, ""+acceleration[0] + " "+acceleration[1] + " "+acceleration[2]);
a = new Intent(ACCEL_UPDATE);
a.putExtra(ACCEL_RESULT, acceleration[0]);
a.putExtra(ACCEL_RESULT, acceleration[1]);
a.putExtra(ACCEL_RESULT, acceleration[2]);
manager = LocalBroadcastManager.getInstance(this);
manager.sendBroadcast(a);
}
注意:ACCEL_RESULT和ACCEL_UPDATE只是广播接收者可以识别其来源的值和意图的字符串。 然后我在onCreate的地图活动中收到广播:
//Receiver of Accelerometer Service broadcasts
broadcastReceiver2 = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent){
x = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0);
y = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0);
z = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0);
x = round(x,3,BigDecimal.ROUND_HALF_UP);
y = round(y,3,BigDecimal.ROUND_HALF_UP);
z = round(z,3,BigDecimal.ROUND_HALF_UP);
//Log.d(TAG, "" + x + " " + y + " " + z);
}
};
使用Log.d我能够验证我确实正在接收onLocationChanged监听器中的值,因为我想:)。
@petlack你说的第一个答案是正确的,因为你说我应该使用服务,所以给你打勾。