Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- SPI
- FirebaseAuth
- AfxMessageBox
- Dialog
- math
- 보늬밤
- 제곱근
- 동적프로그래밍
- Dokka
- 리틀포레스트
- QoS
- memory
- Collection
- 쌓기게임
- 형변환
- devicedriver
- Kotlin
- synergy
- stack
- 코인거스름돈
- WebView
- DataStructure
- 피보나치
- LRU
- 피요모리2
- android
- MFC
- DynamicProgramming
- Java
- darkmode
Archives
- Today
- Total
퉁탕퉁탕 만들어보자
내 Activity에서 볼륨 변경을 어떻게 알 수 있을까?(System content observer) 본문
반응형
앱에서 시스템 설정 변경 이벤트를 바로 알고 싶을때가 있다.
이를테면 사운드변경이나, 화면밝기변경 같은게 있을 수 있다.
앱에서는 보통 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
반응형
'Computer > Android' 카테고리의 다른 글
TextureView를 써야할까 SurfaceView를 써야할까? (0) | 2022.04.16 |
---|---|
Android 시스템 Setting의 값 읽기/쓰기 (0) | 2022.04.16 |
onSaveInstanceState 는 어떻게 사용하지? (0) | 2022.04.15 |
Activity 화면 전환 시 onConfigurationChanged에서 처리하기 (0) | 2022.04.10 |
Activity Lifecycle (0) | 2022.04.10 |