Android加速度计,在设备平坦时发出声音

时间:2013-04-06 23:13:37

标签: android audio accelerometer

我正在尝试构建一个简单的应用程序。我想要的是当设备完全平坦(加速度计的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();
    }
  }
}

2 个答案:

答案 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>