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();
        }

    }
4

1 に答える 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);
于 2013-01-08T02:12:33.633 に答える