안드로이드 어플리케이션 개발 중, external 저장 공간에 있는 파일을 read 또는 write 하려고 할 때 아래와 같이 에러가 발생하는 경우가 있습니다.

02-10 14:20:45.310 30711-30711/com.example.codetravel.musicplayer W/System.err: java.io.FileNotFoundException: /storage/emulated/0/john.mp3: open failed: EACCES (Permission denied)
02-10 14:20:45.343 30711-30711/com.example.codetravel.musicplayer W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:452)
02-10 14:20:45.343 30711-30711/com.example.codetravel.musicplayer W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:76)
02-10 14:20:45.343 30711-30711/com.example.codetravel.musicplayer W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1095)
02-10 14:20:45.343 30711-30711/com.example.codetravel.musicplayer W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1046)
02-10 14:20:45.344 30711-30711/com.example.codetravel.musicplayer W/System.err:     at com.example.codetravel.musicplayer.MusicPlayerActivity.onPlayPause(MusicPlayerActivity.java:45)
...
02-10 14:20:45.344 30711-30711/com.example.codetravel.musicplayer W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-10 14:20:45.344 30711-30711/com.example.codetravel.musicplayer W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
02-10 14:20:45.344 30711-30711/com.example.codetravel.musicplayer W/System.err:     at libcore.io.Posix.open(Native Method)
02-10 14:20:45.344 30711-30711/com.example.codetravel.musicplayer W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
02-10 14:20:45.344 30711-30711/com.example.codetravel.musicplayer W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:438)

02-10 14:20:45.345 30711-30711/com.example.codetravel.musicplayer W/System.err:     ... 15 more 


open failed: EACCES (Permission denied) 에러가 발생하는 이유는 external 저장 공간의 파일에 대해서 read 또는 write 하기 위해서는 별도의 권한이 필요하기 때문입니다.

권한을 부여하는 방법은 AndroidManifest.xml 파일에 아래와 같이 read, write 권한을 기입하면 됩니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

위치는 <manifest> 안에 그리고 <application> 밖에 선언하면 됩니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.codetravel.musicplayer">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 여기에 추가해 줍니다 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!-- 여기에 추가해 줍니다 -->

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MusicPlayerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest> 


그리고 어플리케이션을 install 한 후, setting 메뉴의 해당 app으로 가서 storage 권한을 enable 해주면 에러는 사라지게 됩니다.

Internal 저장 공간과 External 저장 공간의 특징에 대해서는 Android 데이터 저장 방법 - Internal/External Storage 포스팅에 자세히 설명되어 있습니다.

+ Recent posts