android - 检测流音量变化

标签 android android-audiomanager

在我的应用程序中,我有一个 VerticalSeekBar(SeekBar 的一些自定义实现),当用户使用硬件按钮更改媒体音量时,它的进度应该会改变。下面是使用 ContentObserver 的半工作解决方案:

      public class SettingsContentObserver extends ContentObserver {

     private VerticalSeekBar sb;
     private AudioManager am;

public SettingsContentObserver(Handler handler, VerticalSeekBar sb, AudioManager am) {
    super(handler);
    this.sb = sb;
    this.am = am;

}

@Override
public boolean deliverSelfNotifications() {
    return super.deliverSelfNotifications();
}

@Override
public void onChange(boolean selfChange) {
    super.onChange(selfChange);
    sb.setProgress(am.getStreamVolume(AudioManager.STREAM_MUSIC));

}
    }

Activity :

        @Override
protected void onResume() {
    super.onResume();
    mSettingsContentObserver = new SettingsContentObserver( new Handler(), vBar, audioMan ); 
    this.getApplicationContext().getContentResolver().registerContentObserver( 
        android.provider.Settings.System.CONTENT_URI, true, 
        mSettingsContentObserver );

}

问题:检测到音量变化但是有几秒钟的延迟,直到它们被检测到并且 SeekBar 的进度发生变化。

问题:是否有更可靠的方法来监听特定音量流上的音量变化?如果您有一些解决方案,请分享您的解决方案

最佳答案

我已经做了一个在通话时监控音量的解决方案,所以这应该是相似的。

您可以在 Activity (onKey) 中监听按键并检查相应的键码(VOLUME_UP 或 VOLUME_DOWN)。

或者,如果由于某种原因(某些远程 View )您无法监听按键事件,只需以足够快的频率轮询音量级别即可:

  1. 使用 am.getStreamVolume(AudioManager.STREAM_MUSIC) 轮询音量。

  2. 以您想要的频率运行此程序。例如:

        private Runnable mVolumeUpdateRunnable = new Runnable() {
        public void run() {
            if (shouldUpdate)
            {
                    updateCurrentVolume();
                    new Handler().postDelayed(mVolumeUpdateRunnable, VOLUME_SAMPLING_DELAY);
            }
        }
    };
    

通话费不贵,更新频率高应该问题不大。

关于android - 检测流音量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16169747/

相关文章:

安卓系统应用信息

Android - 如何检查麦克风当前正在被其他应用程序使用

Android放弃音频焦点

android - TTS 的默认音频流是什么?

android - 如何从 php 页面查看 android 内置图库中的所有图像

java - 从 android 操作系统中检索国家/地区列表

Android Cursor 最大尺寸

android - Android 应用程序中的线程