Android

[안드로이드] Media open failed: EACCES (Permission denied)

기존 앱의 targetSdkVersion 와  compileSdkVersion 버전을 28에서 29로 올렸다. 

2020년 11월부터는 마켓에 등록시 targetSdkVersion 를 29로 지정해야하기 때문이다.

사전에 대비하고 미리 준비하는 작업과정에 오류가 발생하였다.

[build.gradle] 
android {
    compileSdkVersion 29
    buildToolsVersion 
“29.0.2”
    defaultConfig {
        applicationId “ddolcat.app.battery.charge.notification”
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName “5.0.1”
        testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”
}
기존에 동작하던 기능이 동작하지 않는 문제가 발생하였다.
그 문제점은 바로 “저장소 권한”을 부여하였으나 동작하지 않는 문제가 발생되었다.

뭔가 또 바뀐 것이다.

java.io.FileNotFoundException: /storage/emulated/0/Music/커피 한잔과 이 음악이면 괜찮아./03.Mahalia-I Remember.mp3: open failed: EACCES (Permission denied) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:496) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at java.io.FileInputStream.(FileInputStream.java:159) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1182) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1160) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1125) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at com.app.noti.MusicActivity.a(:379) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at com.app.noti.MusicActivity.onListItemClick(:360) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.app.ListActivity$2.onItemClick(ListActivity.java:319) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.widget.AdapterView.performItemClick(AdapterView.java:330) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.widget.AbsListView.performItemClick(AbsListView.java:1190) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3198) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.widget.AbsListView$3.run(AbsListView.java:4116) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.os.Handler.handleCallback(Handler.java:883) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:100) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.os.Looper.loop(Looper.java:214) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7356) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at java.lang.reflect.Method.invoke(Native Method) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
2020-02-27 13:51:56.185 7226-7226/com.app.noti W/System.err:     at libcore.io.Linux.open(Native Method) 
2020-02-27 13:51:56.186 7226-7226/com.app.noti W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:167) 
2020-02-27 13:51:56.186 7226-7226/com.app.noti W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252) 
2020-02-27 13:51:56.186 7226-7226/com.app.noti W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:167) 
2020-02-27 13:51:56.186 7226-7226/com.app.noti W/System.err:     at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7255) 
2020-02-27 13:51:56.186 7226-7226/com.app.noti W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:482) 
2020-02-27 13:51:56.186 7226-7226/com.app.noti W/System.err:  … 18 more

[해결방안 1]
build.gradle 파일 설정을 기존값으로 변경하였다.

android {
    compileSdkVersion 28
    buildToolsVersion 
“28.0.3”
    defaultConfig {
        applicationId “ddolcat.app.battery.charge.notification”
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName “5.0.1”
        testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”
}


[해결 방안 2]
Android 10 (API 레벨 29) 이상을 대상으로하는 앱에는 기본적으로 외부 저장 장치 또는 범위 스토리지에 대한 범위 액세스가 제공됨을 알게되었다. 즉 앱별로 생성되는 디렉토리만 접근이 가능한 것이다. 

범위가 지정된 스토리지에서 옵트 아웃
앱이 Android 10에서 제공되는 변경 사항에 대한 준비가되지 않은 경우 매니페스트에서 requestLegacyExternalStorage 플래그를 true로 설정하여 “선택 해제”할 수 있다.
<manifest … >

  <application android:requestLegacyExternalStorage=”true” … >
      …
  </application></manifest>

[해결 방안 3]
openFileDescriptor을 사용한다. 

아래 링크를 참고
[Android 10] Read File Issue. open failed: EACCES (Permission denied)

 

Leave a Reply

error: Content is protected !!