我正在尝试构建一个简单的应用程序。我想要的是当设备完全平坦(加速度计的x,y值几乎为0)时,设备在5秒后产生哔声,而不是立即产生。
我正在使用以下代码,我不知道我必须改变什么才能使声音在5秒后始终有效,而不是随机或立即。有人可以帮帮我吗?
public void onSensorChanged(SensorEvent event) {
x = event.values[0];
y = event.values[1];
long actualTime = System.currentTimeMillis();
if(x > -0.1 && x < 0.1 && y > -0.1 && y < 0.1) {
if(actualTime - lastUpdate >= 5000) {
return;
}
lastUpdate = actualTime;
try {
AssetFileDescriptor afd = getAssets().openFd("beep.wav");
mMediaplayer = new MediaPlayer();
mMediaplayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mMediaplayer.prepare();
mMediaplayer.start();
mMediaplayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
//mp.setLooping(false);
mp.stop();
mp.release();
}
});
} catch(Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
使用处理程序。当设备变平(该代码播放声音的地方)时,将延迟消息发送到处理程序5秒钟。让处理程序在收到消息时播放声音。
这是“在Y秒内做X”的标准方式。
答案 1 :(得分:0)
我认为Timer会很适合你。也许是这样的,你每次检测到动作时取消定时器并启动一个新的定时器:
在您的活动中定义您的计时器(并确保在您离开活动时取消它)
Timer lastTouchedTimer = null;
然后像这样更改你的onSensorChanged:
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
if(x > -0.1 && x < 0.1 && y > -0.1 && y < 0.1) {
if (lastTouchedTimer == null) {
lastTouchedTimer = new Timer();
} else
lastTouchedTimer.cancel();
}
lastTouchedTimer.schedule(new TimerTask() {
@Override
public void run() {
try {
AssetFileDescriptor afd = getAssets().openFd("beep.wav");
mMediaplayer = new MediaPlayer();
mMediaplayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mMediaplayer.prepare();
mMediaplayer.start();
mMediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
//mp.setLooping(false);
mp.stop();
mp.release();
}
});
} catch(Exception e) {
e.printStackTrace();
}
}
}, 5000);
}
}
这是一个活动,我在样本活动中使用。
package com.example.test;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.media.MediaPlayer;
import android.os.Bundle;
import java.util.Timer;
import java.util.TimerTask;
public class MyActivity extends Activity {
Timer lastTouchedTimer;
MediaPlayer mMediaplayer;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SensorEventListener newListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
if(x > -0.1 && x < 0.1 && y > -0.1 && y < 0.1) {
if (lastTouchedTimer == null) {
lastTouchedTimer = new Timer();
} else
lastTouchedTimer.cancel();
}
lastTouchedTimer.schedule(new TimerTask() {
@Override
public void run() {
try {
AssetFileDescriptor afd = getAssets().openFd("beep.wav");
mMediaplayer = new MediaPlayer();
mMediaplayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mMediaplayer.prepare();
mMediaplayer.start();
mMediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
//mp.setLooping(false);
mp.stop();
mp.release();
}
});
} catch(Exception e) {
e.printStackTrace();
}
}
}, 5000);
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
//To change body of implemented methods use File | Settings | File Templates.
}
};
}
}
它使用一个非常简单的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Heallo World, MyActivity"
/>
</LinearLayout>