Glacier's Daily Log

Android) 파일 입출력 과정에서의 java.io.FileNotFoundException open failed: EACCES (Permission denied) 문제 해결하기 본문

Coding/Android

Android) 파일 입출력 과정에서의 java.io.FileNotFoundException open failed: EACCES (Permission denied) 문제 해결하기

h__glacier_ 2020. 8. 26. 16:25
반응형

현재 개발중인 안드로이드 앱에 캡쳐 기능을 넣으려고 코딩 중에

처음보는, 골치아픈 에러가 자꾸 발생했다.

 

개발중인 어플 '사랑한지'

 

현재 디데이 어플을 개발중이다.

커플들을 위한 디데이 어플인데, 필요한 기능만 넣어 가볍고 깔끔한 UI를 강점으로 내세우려 한다.

 

그리고, 버튼 하나만 누르면 네모 그려놓은 부분만 캡쳐가 되어, 갤러리에 저장이 되게 설계 중이였다.

 

우선, buildDrawingCache(); 관련 소스를 이용해서

내가 필요한 View 만을 캡쳐 할 수 있게 하였다.

 

위의 네모 형광펜 쳐놓은 View는, elevation을 준 LinearLayout 으로 이루어져 있다.

LineaLayout에 main_view 라는 id값을 준 뒤, 이 부분만 따로 buildDrawingCache(); 를 수행하여

캡쳐해주는 방식을 채택했다.

 

내가 한 방법대로라면 바로 저장되어야 하지만 자꾸만 오류가 발생했다.

 

혹여나 permission 관련 이슈를 놓쳤을까봐 Manifest에 들어가 확인을 하였다.

 

필요한 외부저장공간 읽기/쓰기 권한은 모두 주어져 있었다.

 

심지어, 안드로이드 6.0 (마시멜로우) 이상 버젼 부터는

사용자가 직접 권한을 허용하는 다이얼로그 창을 띄워주어야 하기떄문에

이와 관련한 코드도 모두 추가시켜 주었다.

 

 

이 모든 과정을 거치고도 자꾸 오류가 떠서

Logcat 을 열어 실시간 디버깅 해보니

 

캡쳐소스를 실행할때 마다

java.io.FileNotFoundException: /storage/000/000.jpeg:

 open failed: EACCES (Permission denied)

 

라는 오류가 뿜어져 나오는 것을 확인 할 수 있었다.

 

 

난 분명히 사용자에게 읽기/쓰기 권한을 허용받았는데

왜자꾸 퍼미션 관련 오류가 나는지

너무 답답하여 몇분을 헤매다가

구글링 을 하여 해답을 찾았다.

 

이 오류는 Android 10 버젼의 스마트폰에서만 일어나는 것으로 확인되었다.

 

내 코드상의 오류인지, Android 10 상의 이슈인지는 모르겠으나,

 

Manifest 에

android:requestLegacyExternalStorage="true"

구문을 추가시키니 매우 정상적으로 작동하는 모습을 볼 수 있었다.

 

이런 간단한 구문 하나만으로

몇분을 헤매던 버그가 해결되는 것 보니

 

코딩의 끝은 "구글링" 이라는 생각이

더욱 확고해졌다.

 

반응형
Comments