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();
    }
  }
}
4

2 に答える 2

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>
于 2013-04-07T00:15:56.543 に答える