android - Android按下按钮可长时间播放声音

标签 android button audio

我刚按下按钮就播放完声音

但我的声音很短,例如“哔哔”,短于1秒

如何按下按钮才能播放声音,直到按下按钮?

    bt = (Button)findViewById(R.id.clickme);
    final MediaPlayer mp = MediaPlayer.create(this, R.raw.beep);
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mp.start();
        }
    });

最佳答案

您可以使用以下代码:

bt.setOnTouchListener(this);

@Override
public boolean onTouch(View arg0, MotionEvent event) {

    switch (event.getAction() ) { 
    case MotionEvent.ACTION_DOWN: 
        System.out.println("touch");
        mp.setLooping(true);
        mp.start();
        break;
    case MotionEvent.ACTION_UP:
        System.out.println("up");
        mp.pause();
        break; 
    }

    return true;
}

我进行了一些研究,发现Android Mediaplayer在循环播放无间隙声音时存在问题。

看到这个:Gapless Playback with android MediaPlayer

我也找到一些解决方案:
  • 使用ogg格式的声音文件(https://en.wikipedia.org/wiki/.ogg)
  • 可以使用声音池,它具有用于媒体播放的循环和缓存功能(https://developer.android.com/reference/android/media/SoundPool.html)

  • 您也可以使用以下类:查看其是否有效。
        public class LoopMediaPlayer {
    
        public static final String TAG = LoopMediaPlayer.class.getSimpleName();
    
        private Context mContext = null;
        private int mResId = 0;
        private int mCounter = 1;
    
        private MediaPlayer mCurrentPlayer = null;
        private MediaPlayer mNextPlayer = null;
    
        public static LoopMediaPlayer create(Context context, int resId) {
            return new LoopMediaPlayer(context, resId);
        }
    
        private LoopMediaPlayer(Context context, int resId) {
            mContext = context;
            mResId = resId;
    
            mCurrentPlayer = MediaPlayer.create(mContext, mResId);
            mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mCurrentPlayer.start();
                }
            });
    
            createNextMediaPlayer();
        }
    
        private void createNextMediaPlayer() {
            mNextPlayer = MediaPlayer.create(mContext, mResId);
            mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
            mCurrentPlayer.setOnCompletionListener(onCompletionListener);
        }
    
        private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.release();
                mCurrentPlayer = mNextPlayer;
    
                createNextMediaPlayer();
    
                Log.d(TAG, String.format("Loop #%d", ++mCounter));
            }
        };
    }
    

    使用它只是调用
    LoopMediaPlayer.create(context, R.raw.sound_file_name);
    
    mp.setLooping(true);的含义

    关于android - Android按下按钮可长时间播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41311860/

    相关文章:

    iphone - 使用AVAudioPlayer播放的音频在iPhone模拟器中有效,但在设备中不起作用

    android - 在 android.mk 的目录和子目录中创建所有 .cpp 文件的 FILE_LIST

    html - 使用 CSS 在 HTML 页面上 float 图片

    java - 具有通用方法的 Mockito

    java - 通过循环添加 JButton 导致最后一个 Button 过大

    wpf - 使用 DataGridTextColumn 验证禁用/启用按钮

    image - JHipster : Blob/ImageBlob/VideoBlob/AudioBlob datatype

    actionscript-3 - AS3正在获得音频电平,音调和其他数据?

    java - 如何初始化我的通用数组?

    安卓 2.2 : Adjusting screen brightness