2013-04-06 66 views
0

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

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

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

0

我认为一个计时器会很好地为你工作。也许这样的事情,在这里取消计时器并开始一个新的计时器每次检测运动时间:

在您的活动定义定时器(并确保你取消它,当你离开活动)

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> 
+0

我想你的方法,但后来我的应用程序甚至无法知道open..Do为什么? – athpapa 2013-04-07 20:15:17

+0

至少有一个小错字。我编辑了我的回复,并从我写的小样本中收录了我的活动。我不知道为什么你的应用程序没有加载,但我知道这是一个。 – HalR 2013-04-07 21:25:55