Android

[안드로이드] android.content.res.Resources$NotFoundException 및 Caused by java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed 오류 처리 방법

보통 오류가 발생하면 firebase에서 알림 메일이 오도록 설정해두었다.

이 번에 처음 받아본 메일은 긴급메일 같은 느낌을 받았다. 무엇이 문제일까 궁금하여 메일을 열어보았다.

 

메일 제목 : [Firebase] Crashlytics 신속 알림 – Android test.TestManagement 7.8.7


“최근 한 시간 동안 장애가 급증하고 있습니다.”

파이어베이스 콘솔에 접근하여 해당 오류를 확인하였다.

5명의 사용자로부터 150번이 넘는 비정상 종료 이벤트가 발생한 것이다. 

운영체제는 Android7이 설치된 화훼이, 샤오미, 삼성 폰 등에서 발생되었다.


해당 리소스 파일이 없어서 발생된 문제는 아니다. 그럼 왜 발생했을까???

Fatal Exception: 
android.content.res.Resources$NotFoundException: 
File res/raw/frog_hongnanpa.mp3 from drawable resource ID #0x7f0e0000
       at android.content.res.ResourcesImpl.openRawResourceFd(ResourcesImpl.java:356)
       at android.content.res.Resources.openRawResourceFd(Resources.java:1330)
       at android.media.MediaPlayer.create(MediaPlayer.java:939)
       at android.media.MediaPlayer.create(MediaPlayer.java:922)
       at test.TestManagement.TestOffActivity.CallMusic(TestOffActivity.java:283)
       at test.TestManagement.TestOffActivity.access$000(TestOffActivity.java:36)
       at test.TestManagement.TestOffActivity$2.run(TestOffActivity.java:98)
       at android.os.Handler.handleCallback(Handler.java:761)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:156)
       at android.app.ActivityThread.main(ActivityThread.java:6617)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
       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
       at android.content.res.AssetManager.openNonAssetFdNative(AssetManager.java)
       at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:795)
       at android.content.res.ResourcesImpl.openRawResourceFd(ResourcesImpl.java:354)
       at android.content.res.Resources.openRawResourceFd(Resources.java:1330)
       at android.media.MediaPlayer.create(MediaPlayer.java:939)
       at android.media.MediaPlayer.create(MediaPlayer.java:922)
       at test.TestManagement.TestOffActivity.CallMusic(TestOffActivity.java:283)
       at test.TestManagement.TestOffActivity.access$000(TestOffActivity.java:36)
       at test.TestManagement.TestOffActivity$2.run(TestOffActivity.java:98)
       at android.os.Handler.handleCallback(Handler.java:761)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:156)
       at android.app.ActivityThread.main(ActivityThread.java:6617)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

 다음과 같은 파일들은 apk로 생성할 때 압축되어 패키징되어 처리 됨으로 접근할 수 없는 경우가 있나보다..

그렇다면 지금까지 정상적으로 동작했던 이유는 무엇일까? 안드로이드7 사용자가 없었던 것일까? 

그러나 그렇지도 않다.

/* 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"
};

해결방법은 의외로 간단한다.

gradle build(:app) 옵션에서 특정 확장자에 대해 압축제외 조건을 추가하면 해결된다.

해당 파일이 pdf라면 pdf를 noCompress 뒤에 문자열로 추가해주면 해결할 수 있다.

    aaptOptions {
        noCompress "mp3"
    }

 

Tensorflow Lite 파일로 작업하는 경우 다음과 같이 처리해주면 해결가능하다.

블록 android/app/build.gradle안의 Gradle 파일( )에 다음 줄을 추가 한다.

aaptOptions {
    noCompress "tflite"
}

[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'

 

[오류가 발생한 코드 정보]

            mplayer = MediaPlayer.create(this, R.raw.frog_hongnanpa);
            mplayer.setLooping(false);
            mplayer.start();
            mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                ...
                }

[REFERENCE]

 

Leave a Reply

error: Content is protected !!