[안드로이드] 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)