[안드로이드 FileNotFoundException 오류 처리 방법] This file can not be opened as a file descriptor. it is probably compressed
메일 제목에서부터 급박함이 느껴졌다.
“최근 한 시간 동안 장애가 급증하고 있습니다.”
오류가 급격히 많이 발생되어서 그런지 신속알림으로 왔고 파이어베이스 콘솔에 로그인하여 오류내용을 확인하였다.
오류가 무려 162번의 비정상 종료가 있었고, 총 5명의 사용자에게 발생되었다.
아마도 해당 기능이 잘 동작하지 않으니, 테스트를 해본 것일까?
오류내용은 다음과 같이 2개의 오류가 발생되었다.
Caused by java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
첫번째 오류내용
Fatal Exception: android.content.res.Resources$NotFoundException: File res/raw/frog_hongnanpa.mp3 from drawable resource ID #0x7f0e0000<br>at android.content.res.ResourcesImpl.openRawResourceFd(ResourcesImpl.java:356)<br>at android.content.res.Resources.openRawResourceFd(Resources.java:1330)<br>at android.media.MediaPlayer.create(MediaPlayer.java:939)<br>at android.media.MediaPlayer.create(MediaPlayer.java:922)<br>at test.TestManagement.TestOffActivity.CallMusic(TestOffActivity.java:283)<br>at test.TestManagement.TestOffActivity.access$000(TestOffActivity.java:36)<br>at test.TestManagement.TestOffActivity$2.run(TestOffActivity.java:98)<br>at android.os.Handler.handleCallback(Handler.java:761)<br>at android.os.Handler.dispatchMessage(Handler.java:98)<br>at android.os.Looper.loop(Looper.java:156)<br>at android.app.ActivityThread.main(ActivityThread.java:6617)<br>at java.lang.reflect.Method.invoke(Method.java)<br>at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)<br>at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
두번째 오류 내용
Caused by java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed<br>at android.content.res.AssetManager.openNonAssetFdNative(AssetManager.java)<br>at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:795)<br>at android.content.res.ResourcesImpl.openRawResourceFd(ResourcesImpl.java:354)<br>at android.content.res.Resources.openRawResourceFd(Resources.java:1330)<br>at android.media.MediaPlayer.create(MediaPlayer.java:939)<br>at android.media.MediaPlayer.create(MediaPlayer.java:922)<br>at test.TestManagement.TestOffActivity.CallMusic(TestOffActivity.java:283)<br>at test.TestManagement.TestOffActivity.access$000(TestOffActivity.java:36)<br>at test.TestManagement.TestOffActivity$2.run(TestOffActivity.java:98)<br>at android.os.Handler.handleCallback(Handler.java:761)<br>at android.os.Handler.dispatchMessage(Handler.java:98)<br>at android.os.Looper.loop(Looper.java:156)<br>at android.app.ActivityThread.main(ActivityThread.java:6617)<br>at java.lang.reflect.Method.invoke(Method.java)<br>at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)<br>at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
<!-- /wp:paragraph -->
앱 리소스파일 중에 mp3파일을 하나 넣어둔게 있는데 그 파일을 못찾거나 접근하지 못하는 오류이다.
C:\Android\AndroidProject\TestManagement\app\src\main\res\raw\frog_hongnanpa.mp3
파일이 없어서 발생한 문제는 아닌걸로 확인되었다. 프로젝트 내 해당 디렉토리 위치에 여전히 파일이 존재하고 있기 때문이다.
그 동안 오류없이 잘 동작했던 건데,…..갑자기 Android 7 운영체제가 설치된 휴대폰들에서 오류가 발생되었다.
오류 해결을 위해 구글해본 결과 다음과 같은 파일들은 apk로 생성할 때 압축되어 패키징되어 처리 됨으로 접근할 수 없는 경우가 있다.
/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
".jpg", ".jpeg", ".png", ".gif",
".wav", ".mp2", ".mp3", ".ogg", ".aac",
".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
".amr", ".awb", ".wma", ".wmv"
};
안드로이드 FileNotFoundException 오류 해결 방법
gradle build(:app) 옵션에서 특정 확장자에 대해 압축 제외 조건(aaptOptions)을 추가하면 해결된다.
나의 경우 mp3파일 접근에 문제가 되었기에, mp3파일을 추가해주었다.
해당 파일이 pdf라면 pdf를 noCompress 뒤에 문자열로 추가해주면 해결할 수 있다.
aaptOptions { noCompress "mp3" }
build.gradle (:app)파일 내용 전체
apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
android {
compileSdkVersion 30
defaultConfig {
applicationId "test.TestManagement"
minSdkVersion 19
targetSdkVersion 30
versionCode 89
versionName "7.8.8"
vectorDrawables.useSupportLibrary = true //벡터이미지 사용 유무를 설정
// Enabling multidex support.
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//앱에서 64비트 기기를 지원
ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
jumboMode true
javaMaxHeapSize "4g"
}
aaptOptions {
noCompress "mp3"
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.media:media:1.2.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//implementation 'androidx.browser:browser:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.google.firebase:firebase-messaging:21.1.0'
implementation 'com.google.firebase:firebase-core:18.0.3'
implementation 'com.google.firebase:firebase-ads:20.1.0'
implementation 'com.google.firebase:firebase-crashlytics:17.4.1'
implementation 'com.google.firebase:firebase-analytics:18.0.3'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.multidex:multidex-instrumentation:2.0.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
// // Executes lint checks from the ':lint' project at build time.
// lintChecks project(':lint')
// // Packages lint checks from the ':lintpublish' in the published AAR.
// lintPublish project(':lintpublish')
}
apply plugin: 'com.google.gms.google-services'
Asset Studio no file was loaded#,#Cannot Open File in Assets Error#
오류가 해결되었는지는 바로 확인할 수 없다.
오류가 발생한 android 7 폰이 없기 때문이다. 구글플레이에 출시 후 파이어베이스 오류 알림이 오지 않으면 해결된 것이다.
해결될 것이 확실해보인다.