Мое требование состоит в том, чтобы открыть файл Актива одного приложения из другого приложения через контент-провайдера. (Я выставляю тот файл с реализацией 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 некоторым другим способом.
Может любой указывать на меня, в том, какие сценарии, мы получим это исключение.
Заранее спасибо.
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"
};