[안드로이드 FileNotFoundException 오류 처리 방법] This file can not be opened as a file descriptor. it is probably compressed

[안드로이드 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 폰이 없기 때문이다. 구글플레이에 출시 후 파이어베이스 오류 알림이 오지 않으면 해결된 것이다.

해결될 것이 확실해보인다.


카테고리의 다른 글
error: Content is protected !!