【问题标题】:Listen to volume changes events on Android在 Android 上监听音量变化事件
【发布时间】:2015-05-25 23:27:17
【问题描述】:

有没有什么方法可以在 Android 上监听音量变化的事件,而不只是接管音量按钮?

我发现唯一有效的是here,但它只有在音量控制消失后才有效。

并非所有设备都有音量按钮,我需要在音量变化发生时立即捕捉它们,而不是在音量对话框消失后捕捉。

【问题讨论】:

  • 使用 ContentObserver 并从 audiomanager 获取音量。我最近用过,效果很好。Check this Solution in stackoverflow
  • 这是一篇较旧的帖子,但到目前为止还没有在 Android 中实现广播是微不足道的……5 年后,仍然没有广播……
  • @Opiatefuchs 也许可以为它创建一个请求,在这里:issuetracker.google.com/issues。我会给它加星标:)
  • 你是对的。完成...issuetracker.google.com/issues/62158875 但这是我的第一个建议,我没有类似广播的代码示例。我希望他们会接受它...

标签: android event-handling volume


【解决方案1】:

更好,你可以注册一个ContentObserver,如下:

  getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...} );

您的 ContentObserver 可能如下所示:

public class SettingsContentObserver extends ContentObserver {
    private AudioManager audioManager;

    public SettingsContentObserver(Context context, Handler handler) {
        super(handler);
        audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return false;
    }

    @Override
    public void onChange(boolean selfChange) {
        int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

        Log.d(TAG, "Volume now " + currentVolume);
    }
}

完成后:

getApplicationContext().getContentResolver().unregisterContentObserver(mContentObserver);

但请注意 - 如果快速按下大量按钮,有时通知似乎会延迟。

【讨论】:

  • 如何查找长按音量键?
  • onChanged 永远不会被我调用,你知道为什么吗? API 23. 是否需要以某种方式声明权限?没有错误,只是永远不会被调用。
【解决方案2】:

好的,现在,我要做的是使用 onKeyDown 听音量按钮(并检查 KEYCODE_VOLUME_DOWN、KEYCODE_VOLUME_MUTE、KEYCODE_VOLUME_UP),并使用一个处理程序,我发布了一个新的可运行文件来检查音量。

另外,由于某些设备有音量对话框,我在它消失时添加了一个监听器,根据this link

【讨论】:

  • 由于 android.media.VOLUME_CHANGED_ACTION 不是一个可行的选择,并且由于 registerMediaButtonEventReceiver 甚至不起作用,因此您的方法似乎是唯一的方法(到目前为止)。谢谢+1。
  • 如果显示变暗,您确定它可以工作吗?我已经在模拟器上对其进行了测试,如果显示器没有变暗,我只能拦截事件。我问了一个类似的问题stackoverflow.com/questions/53359340/…,但没有人回答。我不明白为什么显示变暗时无法拦截事件...
  • @ka3ak 你也在真机上测试过吗?如果没有,并且您没有,您可以向我展示一个示例项目(请通过 Github),我会为您测试。
  • @androiddeveloper 我只在真实设备上测试过 KeyEvent.KEYCODE_HEADSETHOOK 事件,它是耳机上的一个按钮,可用于接受呼叫,但我认为 onKeyDown() 不会如果显示屏变暗,则对任何按键都不起作用。我已经在这个论坛中遇到了一个讨论这个问题的问题,但我找不到它。如果我找到它,我会发布它。同时,您可以对其进行测试。我不认为这太难了。只需在手机显示屏变暗时尝试使用您在答案中提到的事件来重现它。
  • @ka3ak 如果设备变暗,据我所知,前面的应用程序不是您的应用程序,所以它不应该获取事件。
【解决方案3】:

使用广播接收器 VOLUME_CHANGED_ACTION 然后使用 AudioManager 获取当前音量。

<receiver android:name="VolumeChangeReceiver" >
    <intent-filter>
         <action android:name="android.media.VOLUME_CHANGED_ACTION" />
    </intent-filter>
</receiver>

【讨论】:

  • 你确定它有效吗?你读过这个吗:stackoverflow.com/a/8974510/878126
  • @androiddeveloper 它在很多情况下都有效,只是不能保证,因为它是系统私有的,因此如有更改/删除,恕不另行通知。
  • @CCJ 很简单:一个人在 SDK 上获得内部/隐藏的 API,当/如果该常量从类中消失(Android Studio 找不到引用并会抛出错误),是时候了考虑另一种解决方案。顺便说一句,对于任何人来说,常数是 AudioManager.VOLUME_CHANGED_ACTION。
【解决方案4】:

您可以使用: registerMediaButtonEventReceiver (组件名 eventReceiver) 它将组件注册为 MEDIA_BUTTON 意图的唯一接收者。

//  in your activity.
MediaButtonReceiver receiver = new MediaButtonReceiver();

// in onCreate put
registerMediaButtonEventReceiver(receiver); 

class MediaButtonReceiver implements BroadcastReceiver {
     void onReceive(Intent intent) {
          KeyEvent ke = (KeyEvent)intent.getExtra(Intent.EXTRA_KEY_EVENT); 
          if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
            //action when volume goes down
          }
           if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
              //action when volume goes up
          }
     } 
}

   //In both onStop and onPause put :
   unregisterMediaButtonEventReceiver(receiver);

我们在这里所做的是定义一个处理 ACTION_MEDIA_BUTTON 的 BroadcastReceiver。并使用 EXTRA_KEY_EVENT ,其中包含导致广播获取按下的内容并对其采取行动的关键事件。

【讨论】:

  • 但它不只是捕获音量按钮吗?没有它们的设备会发生什么?另外,那些有它们的设备,但用户在音量搜索栏显示后触摸了它怎么办?在这种情况下,我将无法捕捉到事件......
  • registerMediaButtonEventReceiver 适用于耳机按钮,但不适用于手机硬件按钮。我刚试过。
  • 这在 API 21+ 中已弃用
猜你喜欢
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2013-01-05
  • 2012-02-28
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多