美文网首页
如何拦截系统音量按键响应事件

如何拦截系统音量按键响应事件

作者: Vampire_f6b6 | 来源:发表于2020-08-25 11:39 被阅读0次

    在我们开发过程中一些特殊情况(如使用手机来模拟外设)有时候会需要用到系统音量键做一些指定功能,但是系统音量键是属于系统功能,上层app如何来拦截这些事件做一些我们想做的功能呢,其实在Android 早期版本中是有这个功能的,通过MediaSessionCompat来实现。

    实现方式也很简单:

    MediaSessionCompat mediaSession =new MediaSessionCompat(this,"PlayerService");
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    mediaSession.setPlaybackState(new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_PLAYING,0,0)//you simulate a player which plays something.
            .build());
    VolumeProviderCompat myVolumeProvider =
    new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE,/*max volume*/100,/*initial volume level*/50) {
    @Override
    public void onAdjustVolume(int direction) {
    switch (direction) {
              case 1://上
                       if (downTime >0) {
                            isLockLongPressKey =true;
                            //do something
                        }
                      downTime++;
                       break;
            case -1://下
                    //do something
                       break;
            case 0://松开
                      if (tempDirection ==1) {
                              if (!isLockLongPressKey) {//是否是长按
                                    //do something
                                  downTime =0;
                                  break;
                                 }
                    }else if (tempDirection == -1) {
    
                    }else {
    
                    }
                    downTime =0;
                    break;
    }
    tempDirection = direction;
    isLockLongPressKey =false;
    /*
    -1 -- volume down
    1 -- volume up
    0 -- volume button released
    */
                }
    };
    mediaSession.setPlaybackToRemote(myVolumeProvider);
    mediaSession.setActive(true);
    

    其实原理很简单,但是有人就问了 现在的环境基本上都迁移至AndroidX环境了 这个MediaSessionCompat其实是support-v4中的 AndroidX环境这么使用呢,其实也很简单。在build.gradle中添加一行支持。

    
    implementation'androidx.legacy:legacy-support-v4:1.0.0'
    
    

    允许项目支持旧版V4就搞定了

    详情可以参考 https://mvnrepository.com/artifact/androidx.legacy

    就这样!

    相关文章

      网友评论

          本文标题:如何拦截系统音量按键响应事件

          本文链接:https://www.haomeiwen.com/subject/unwajktx.html