当前位置: 首页 > 知识库问答 >
问题:

Android:如何使用KeyEvents调用MediaController快进和快退

司徒阳曜
2023-03-14

嗨,我正在使用mediacontroller来控制我的媒体播放器,我想使用keyEvents而不是触摸事件来控制,我使用下面的代码来做到这一点,但只有播放/暂停是工作的,当mediacontroller视图出现时,KEYCODE_MEDIA_FAST_FORWARD和KEYCODE_MEDIA_REWIND不被处理。

有谁能建议如何使用关键事件处理快进和快退。

请帮忙。

    public boolean onKeyDown(int keyCode, KeyEvent event) {
    mediaController.show();
    switch (keyCode) {
    case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
        if (mediaPlayer.isPlaying()) {
            pause();
        } else
            start();

        return true;
    case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
        if (mediaPlayer.isPlaying()) {
        currentPosition = mediaPlayer.getCurrentPosition();
        seekTo(currentPosition + 2000);
        }
    }
        return true;

    case KeyEvent.KEYCODE_MEDIA_REWIND: {
        if (mediaPlayer.isPlaying()) {
        currentPosition = mediaPlayer.getCurrentPosition();
        seekTo(currentPosition - 3000);
        }
    }
        return true;

    }
    return false;
}

共有1个答案

习海
2023-03-14

我创建了两个函数doForwardVideo()和doRewindVideo(),并在onClick侦听器和onKeyDownEvent()上使用它

希望这有帮助!!

public void doForwardVideo()
    {
         if (mPlayer == null) {
             return;
         }
         int pos = mPlayer.getCurrentPosition();
         pos += 15000; // milliseconds
         mPlayer.seekTo(pos);
         setProgress();

         show(sDefaultTimeout);
    }

    public void doRewindVideo()
    {
        if (mPlayer == null) {
            return;
        }

        int pos = mPlayer.getCurrentPosition();
        pos -= 5000; // milliseconds
        mPlayer.seekTo(pos);
        setProgress();

        show(sDefaultTimeout);
    }


    //*** Create two listeners which then you will set it in 
    //private void initControllerView(View v) method

    private View.OnClickListener mRewListener = new View.OnClickListener() {
        public void onClick(View v) {
            doRewindVideo();
        }
    };

    private View.OnClickListener mFfwdListener = new View.OnClickListener() {
        public void onClick(View v) {
            doForwardVideo();
        }
    };

//****** Here is snippet for private void initControllerView(View v) method

mFfwdButton = (ImageButton) v.findViewById(R.id.ffwd);
    if (mFfwdButton != null) {
        mFfwdButton.setOnClickListener(mFfwdListener);
        if (!mFromXml) {
            mFfwdButton.setVisibility(mUseFastForward ? View.VISIBLE : View.GONE);
        }
    }

    mRewButton = (ImageButton) v.findViewById(R.id.rew);
    if (mRewButton != null) {
        mRewButton.setOnClickListener(mRewListener);
        if (!mFromXml) {
            mRewButton.setVisibility(mUseFastForward ? View.VISIBLE : View.GONE);
        }
    }

//***** onKeyDown() Event ****
 @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (mPlayer == null) {
            return true;
        }

        int keyCode = event.getKeyCode();
        final boolean uniqueDown = event.getRepeatCount() == 0
                && event.getAction() == KeyEvent.ACTION_DOWN;
        if (keyCode ==  KeyEvent.KEYCODE_HEADSETHOOK
                || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
                || keyCode == KeyEvent.KEYCODE_SPACE) {
            if (uniqueDown) {
                doPauseResume();
                show(sDefaultTimeout);
                if (mPauseButton != null) {
                    mPauseButton.requestFocus();
                }
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {
            if (uniqueDown && !mPlayer.isPlaying()) {
                mPlayer.start();
                updatePausePlay();
                show(sDefaultTimeout);
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP
                || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {
            if (uniqueDown && mPlayer.isPlaying()) {
                mPlayer.pause();
                updatePausePlay();
                show(sDefaultTimeout);
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) {
            if (uniqueDown) {
                doForwardVideo();
            }
            // don't show the controls for volume adjustment
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_REWIND) {
            if (uniqueDown) {
                doRewindVideo();
            }
            // don't show the controls for volume adjustment
            return true;
        }else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                || keyCode == KeyEvent.KEYCODE_VOLUME_UP
                || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) {
            // don't show the controls for volume adjustment
            return super.dispatchKeyEvent(event);
        } else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
            if (uniqueDown) {
                hide();
            }
            return true;
        }

        show(sDefaultTimeout);
        return super.dispatchKeyEvent(event);
    }
 类似资料:
  • 我必须使用MediaPlayer播放视频,而不是VideoView。我有一个Xml布局的SurfaceView,在活动端有一个MediaPlayer和一个MediaController。 提前道谢。

  • 问题内容: 这是我的代码,但显示了进度。这段代码有什么错误吗?请提供一些想法来解决此问题,或者提供一些与此相关的链接。 问题答案: 更新的答案: 要关闭ProgressHUD:

  • 问题内容: 我想创建一个Android应用程序,该应用程序是Internet广播电台的客户端。我想让它看起来像是Android原生的吗?但是我与Android API逻辑和文档相混淆。我得到的是我需要MediaPlayer和MediaController类。我是对的,有没有很好的Android AUDIO播放器示例? 特别是,我对如何一起使用和类非常感兴趣。 UPD: 最后,我得到了代码,该代码正

  • 我有几个关于备份/恢复Cassandra集群的最佳方法的问题。 背景:我有一个在EC2中运行的集群。它的节点配置如下: 实例类型:m3.medium存储:50 GB根卷/100 GB另一个卷 在阅读了大量的文件和搜索了一些网站后,我明白了带有Cassandra(nodetool)快照的EBS快照看起来很有前途。 问题:EBS 还拍摄增量快照,Nodetools 也拍摄快照,那么这两个工具有何不同或

  • 问题内容: 我有几个Express应用程序,我发现在某些模块中,该请求是在请求处理程序的末尾(或之后)调用的,而在其他模块中则没有调用。 例如: 要么: 两种情况都可以,但是当我运行许多请求时,我担心泄漏或用完文件描述符之类的事情。哪一个“更正确”? 问题答案: 您的问题的答案是否定的。如果您致电,则不必致电。呼唤你。 来自/lib/response.js,这是函数的结尾:

  • Vanilla 的 Service vanilla 的 Service 预设为项目对某些通用业务逻辑封装为独立的 Service,方便维护、管理、缓存等。 Vanilla 的 Service 在项目的 models/service 路径下,一般使用 LoadModel 方法进行加载 最简单的 Service 由自动生成的 demo 中默认生成了 UserService,可以看出 UserServi