ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Storage] 외부저장소 볼륨 BroadcastReceiver
    Android/Storage 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

     

    댓글

Designed by Tistory.