不断检查 Android 服务中的音量变化

8
我写了这段代码,很明显有缺陷。我该如何创建一个服务,以便不断检查音量的变化?服务中不能使用键盘监听器,请不要用音量键监听器回答此问题。
我的代码是错误的,因为while循环的条件是虚假的。我的服务需要什么条件才能检查音量变化而不崩溃?它不能是isScreenOn(),因为在听音乐时可以改变音量并关闭屏幕。 代码
AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int currentVolume = audio.getStreamVolume(AudioManager.STREAM_RING);
    int newVolume=0;
    while(1==1)
    {
        newVolume = audio.getStreamVolume(AudioManager.STREAM_RING);
        if(currentVolume!=newVolume)
        {
            Toast.makeText(this, "Volume change detected!", Toast.LENGTH_LONG).show();
        }

    }

你可以在这里找到解决问题的多种方案:https://dev59.com/_3A75IYBdhLWcg3wqKx0 - Andrii Chernenko
哦,还有一件事——永远不要在无限循环中执行此类操作。即使这样可以工作,那也可能是你能想象到的最糟糕的方式。 - Andrii Chernenko
它们是用于活动的,我猜测。它们不适用于服务。我已经尝试过了。 - Karthik Balakrishnan
@deville 同意,无限循环是一场噩梦。 - Karthik Balakrishnan
1个回答

9

如果想要查看设置的更改时间,可以通过向设置提供程序注册ContentObserver来监控它。例如,这是设置应用程序中的观察器:

    private ContentObserver mVolumeObserver = new ContentObserver(mHandler) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            if (mSeekBar != null && mAudioManager != null) {
                int volume = mAudioManager.getStreamVolume(mStreamType);
                mSeekBar.setProgress(volume);
            }
        }
    };

它被注册为这样观察设置:

        import android.provider.Settings;
        import android.provider.Settings.System;

        mContext.getContentResolver().registerContentObserver(
                System.getUriFor(System.VOLUME_SETTINGS[mStreamType]),
                false, mVolumeObserver);

1
Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_MUSIC]), true, mVolumeObserver - deadfish
我们需要导入什么来使用Content observer? - Ruchir Baronia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接