【问题标题】:Android press down button to long play soundAndroid 按下按钮可长时间播放声音
【发布时间】:2016-12-24 09:04:29
【问题描述】:

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

但是我有一个短的声音,比如“哔”,比 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();
        }
    });

【问题讨论】:

    标签: android button audio


    【解决方案1】:

    您可以使用以下代码:

    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

    我也找到了几个解决方案:

    1. 使用ogg格式的声音文件(https://en.wikipedia.org/wiki/.ogg)
    2. 可以使用 soundpool,它具有用于媒体播放的循环和缓存设施 (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);

    【讨论】:

    • 感谢回复,循环可以工作,但我的声源是1s,我保持1s后,它有大约0.1s的间隔来循环声音。如何设置间隔时间为0s?
    • 所以循环之间有一个 GAP,你想将 GAP 时间设置为 0..??
    • 谢谢!我创建了 LoopMediaPlayer.java 并替换为“LoopMediaPlayer.create(context, R.raw.beep);” ,它说“无法解析符号'上下文'
    • 尝试 getApplicationContext() 而不是 context
    • 我按一下按钮,声音长响也有间隙
    【解决方案2】:

    使用 OnTouchListener

    bt.setOnTouchListener(new View.OnTouchListener() {        
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN: // Button Pressed    
                mp.reset();
                mp.setDataSource(mediapath);
                mp.prepare();
                mp.start();        
    
                return true; 
            case MotionEvent.ACTION_UP:// Button released
                mp.stop();
                return true; 
        }
        return false;
    }
    });
    

    【讨论】:

    • 感谢回复,不过只能播放一次。第二次按按钮就不能播放了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2014-11-02
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多