53 votes

java.io.FileNotFoundException : Ce fichier ne peut pas être ouvert en tant que descripteur de fichier ; il est probablement compressé.

Je suis en train de programmer un soundboard à partir d'Android. Le problème est que certains sons fonctionnent, et d'autres pas. Voici le traceback que j'obtiens pour les sons qui ne fonctionnent pas

05-31 13:23:04.227 18440 18603 W System.err: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
05-31 13:23:04.227 18440 18603 W System.err:    at android.content.res.AssetManager.openAssetFd(Native Method)
05-31 13:23:04.227 18440 18603 W System.err:    at android.content.res.AssetManager.openFd(AssetManager.java:331)
05-31 13:23:04.227 18440 18603 W System.err:    at com.phonegap.AudioPlayer.startPlaying(AudioPlayer.java:201)
05-31 13:23:04.227 18440 18603 W System.err:    at com.phonegap.AudioHandler.startPlayingAudio(AudioHandler.java:181)
05-31 13:23:04.235 18440 18603 W System.err:    at com.phonegap.AudioHandler.execute(AudioHandler.java:64)
05-31 13:23:04.235 18440 18603 W System.err:    at com.phonegap.api.PluginManager$1.run(PluginManager.java:86)
05-31 13:23:04.235 18440 18603 W System.err:    at java.lang.Thread.run(Thread.java:1096)

Des idées ?

0voto

Marcell Points 462

Je viens de rencontrer le même problème, parce que le gnome-enregistreur de son crée des fichiers OGG, que je ne peux pas lire avec le MediaPlayer. Je les ai donc convertis en MP3 avec ffmpeg et cela a fonctionné. Je pense donc que c'est la méthode la plus simple.

ffmpeg -i youroggfile yournewfile.mp3

J'ai également remarqué qu'il apparaît toujours avec un point d'interrogation dans les ressources et que lorsque j'y accède avec la commande R.raw.yournewfile Je n'écris pas l'extension ".mp3" dans le code.

0voto

Seven Points 9

J'ai eu le même problème, et j'ai copié le fichier de res/raw dans le dossier /data/data/your.app.pkg/cache, et tout s'est bien passé :D

AssetFileDescriptor afd = null;
try {
    File cache = new File(getCacheDir(), "my_data.dat");
    if (!cache.exists()) {
        copyInputStreamToFile(getResources().openRawResource(R.raw.my_data), cache);
    }
    afd = new AssetFileDescriptor(ParcelFileDescriptor.open(cache, ParcelFileDescriptor.MODE_READ_ONLY), 0, AssetFileDescriptor.UNKNOWN_LENGTH);
} catch (Exception e) {
    e.printStackTrace();
}

private void copyInputStreamToFile(InputStream in, File file) {
    BufferedOutputStream bfos = null;

    try {
        bfos = new BufferedOutputStream(new FileOutputStream(file));
        byte[] buf = new byte[4096];

        int len;
        while ((len = in.read(buf)) != -1) {
            bfos.write(buf, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (bfos != null) {
                bfos.close();
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

0voto

Rei Ryuki Points 1

Dans mon cas, cela est dû au fait que resource.arsc est compressé. La reconstruction avec un resource.arsc non compressé résout le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X