2013-04-06 70 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