【问题标题】:Android accelerometer, make sound when device is flatAndroid加速度计,设备平放时发出声音
【发布时间】:2013-04-06 23:13:37
【问题描述】:

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

【问题讨论】:

    标签: android audio accelerometer


    【解决方案1】:

    使用处理程序。当设备变平时(该代码播放声音)从现在开始向处理程序发布一条延迟消息 5 秒。让处理程序在收到消息时播放声音。

    这是“在 Y 秒内做 X”的标准方式。

    【讨论】:

      【解决方案2】:

      我认为 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>
      

      【讨论】:

      • 我试过你的方法,但是我的应用程序甚至无法打开..你知道为什么吗?
      • 至少有一个小错字。我已经编辑了我的回复,并从我写的小样本中包含了我的活动。我不确定为什么您的应用没有加载,但我知道这个会加载。
      猜你喜欢
      • 1970-01-01
      • 2014-01-11
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多