Android/Storage
[Storage] 외부저장소 볼륨 BroadcastReceiver
잘할수있을거야
2021. 10. 26. 16:02
onReceive의 받은 인텐트에서
getData로 Uri를 뽑아 어떤 볼륨이 변경되었는지 체크가능
체크 getAction으로 볼륨이 어떻게 변경되었는지 체크가능
- <application>태그 내부에 implicit 브로드 캐스트 리시버 정의
<receiver
android:name="com.source.file.sharedstoragedownloadfile.SdReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
<action android:name="android.intent.action.MEDIA_CHECKING" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<data android:scheme="file" />
</intent-filter>
</receiver>
확인하고 싶은 Action만 정의하였다. 이외에도 여러 Action이 있다.
Intent의 data필드를 file로 꼭 지정해줘야 한다.
- BroadcastReceiver클래스를 상속한 클래스 생성 후 onReceive() 오버라이딩
class SdReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
log("SD카드 테스트- onReceive()")
if (intent != null) {
val action = intent.action
if (action != null) {
log(intent.data.toString()) //어떤 볼륨이 변경되었는지
log(action) //볼륨의 상태
}
}
}
private fun log(str: String) {
Log.d("EXTERNAL_STORAGE", str)
}
}
Intent의 data인 Uri로 어떤 위치가 변경되었는지 확인
Intent의 action으로 어떤 액션이 행해졌는지 확인
- 테스트
마운트 상태( SD카드가 연결된 상태)
언마운트 상태( SD카드는 꼽혀있지만 언마운트 시킨 상태)
분리된 상태( SD카드를 완전히 빼낸 경우 )
내 디바이스의 경우 usb 연결중 sd카드 분리가 안되는 디바이스여서 무선 디버깅
SD카드 설정에서 SD카드를 조작하고, 바늘로 SD카드 슬롯을 열어 SD카드를 분리시켜보자.
마운트 상태에서 언마운트 시킴
D: onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_EJECT
D: onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_UNMOUNTED
언마운트 상태에서 마운트 시키거나, 분리된 상태에서 꼽음
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_CHECKING
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_MOUNTED
언마운트하지 않고 강제 분리
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_EJECT
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_UNMOUNTED
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_BAD_REMOVAL
제대로 언마운트하고 SD카드 분리
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_UNMOUNTED
D: SD카드 테스트- onReceive()
D: file:///storage/4E60-1C3B
D: android.intent.action.MEDIA_REMOVED
D: SD카드 테스트- onReceive()
D: file:///dev/null
MEDIA_REMOVED , MEDIA_BAD_REMOVAL은
볼륨을 제거 할때만 날라오는데 (바늘로 SD슬롯을 빼낼 경우)
언마운트를 잘 시키고 뽑으면 MEDIA_REMOVED
언마운트 안하고 강제로 뽑으면 MEDIA_BAD_REMOVAL