Проблема при открытии Asset File with the help of Content Provider

Мое требование состоит в том, чтобы открыть файл Актива одного приложения из другого приложения через контент-провайдера. (Я выставляю тот файл с реализацией ContentProvider),

Я могу открыть немного файлов и читать, но при открытии некоторых файлов я получаю исключение. Найдите реализацию для открытия Asset File.

@Override
public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
    AssetManager am = getContext().getAssets();
    String file_name = uri.getLastPathSegment();
    if(file_name == null) 
        throw new FileNotFoundException();
    AssetFileDescriptor afd = null;
    try {
        afd = am.openFd(file_name);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return afd;//super.openAssetFile(uri, mode);
}

Несколько раз, am.openFd(file_name); выдает исключение, говоря это,

java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
at android.content.res.AssetManager.openAssetFd(Native Method)
at android.content.res.AssetManager.openFd(AssetManager.java:329)
at com.pineone.swfinstaller.SwfProvider.openAssetFile(SwfProvider.java:25)
at android.content.ContentProvider$Transport.openAssetFile(ContentProvider.java:218)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:234)
at android.os.Binder.execTransact(Binder.java:288)
at dalvik.system.NativeStart.run(Native Method)

Но, тот же файл я могу открыться в своем ПК или даже в устройстве на базе Android некоторым другим способом.

Может любой указывать на меня, в том, какие сценарии, мы получим это исключение.

Заранее спасибо.

7
задан Andhravaala 5 July 2010 в 08:42
поделиться

1 ответ

Android пытается сжать все ресурсы, если они не бесполезны, например, для файлов * .mp3. Я не знаю, есть ли полный список типов файлов, которые не сжимаются, но все будет в порядке, если вы просто переименуете свои файлы в .mp3 (решение сжимать или нет зависит только от расширения)

Небольшой поиск в Google показал:

http://osdir.com/ml/android-ndk/2010-04/msg00086.html

Если у вас есть достаточный контроль над процессом сборки, вы можете использовать Флаг «-0» с zip или aapt для добавления ресурсов.

 -0 указывает дополнительное расширение, для которого такие файлы не будут
храниться в сжатом виде в .apk. Пустая строка означает не
сжимать вообще любые файлы.

aapt находится в вашем каталоге

android-sdk \ platform \ android-VERSION \ tools

по указанной выше ссылке:

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"
};
12
ответ дан 6 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: