퉁탕퉁탕 만들어보자

내 Activity에서 볼륨 변경을 어떻게 알 수 있을까?(System content observer) 본문

Computer/Android

내 Activity에서 볼륨 변경을 어떻게 알 수 있을까?(System content observer)

호숀티 2022. 4. 15. 23:53
반응형

앱에서 시스템 설정 변경 이벤트를 바로 알고 싶을때가 있다.

이를테면 사운드변경이나, 화면밝기변경 같은게 있을 수 있다.

 

앱에서는 보통 database나 파일에 접근하기 위해서 ContentProvider를 사용한다.

Setting에서도 setting값을 주는 Content Provider를 제공한다.

Settings.System.CONTENT_URI이다.

 

볼륨변경을 Activity에서 알고자 하는 상황을 예로 든 코드이다.

 

1. Activity단에서 volume change를 간단하게 처리할 수있는 리스너를 하나 만든다.

public interface OnAudioVolumeChangedListener {
    void onAudioVolumeChanged(int currentVolume);
}

2. ContentObserver를 extend하는 AudioVolumeContentObserver 클래스를 만든다.

system 설정 변경 시 onChange가 불리게 되고, 변경된 볼륨값을 audio manager에서 가져와서 listener 로 전달한다.

public class AudioVolumeContentObserver extends ContentObserver {
...

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        if (mAudioManager != null && mListener != null) {
            int currentVolume = mAudioManager.getStreamVolume(mAudioStreamType);
            mListener.onAudioVolumeChanged(currentVolume);
        }
    }
}

3.  System.CONTENT_URI의 옵저버로, 아까 만들어둔 AudioVolumeContentObserver 를 등록/ 등록해제하는 함수를 만든다.

public class MyActivity extends Activity {
    ...

    public void register(int audioStreamType, 
                         @NonNull OnAudioVolumeChangedListener listener) {

        Handler handler = new Handler();
        mAudioVolumeContentObserver = new AudioVolumeContentObserver(
                handler,mAudioManager,audioStreamType,listener);

	// System.CONTENT_URI에 대해서 contentObserver를 등록한다
        mContext.getContentResolver().registerContentObserver(
                android.provider.Settings.System.CONTENT_URI,
                true,
                mAudioVolumeContentObserver);
    }

    // 기존에 등록했던 옵저버를 unregister한다.
    public void unregister() {
        if (mAudioVolumeContentObserver != null) {
            mContext.getContentResolver().unregisterContentObserver(mAudioVolumeContentObserver);
            mAudioVolumeContentObserver = null;
        }
    }
}

3. Activity가 Listener를 implement해서 처리할작업을 구현하고, Activity의 onResume과 onPause에서 register과 unregister를 호출해준다.

public class MyActivity extends Activity implements OnAudioVolumeChangedListener {
...
    @Override
    public void onResume() {
        super.onResume();
        register(AudioManager.STREAM_MUSIC, this);
    }

    @Override
    public void onPause() {
        unregister();
        super.onPause();
    }
    
    @Override
    public void onAudioVolumeChanged(int currentVolume) {
        // 볼륨 변경 시 할일 하기
        Log.d("AudioChange", "volume: " + currentVolume);
    }
...
}

 

이런방식으로 간단하게 Setting의 값 변경을 리슨할수있다. 단점은 볼륨만 따로 리슨은 어렵다.

 

728x90
반응형