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