我的要求是通过内容提供商从另一个应用程序打开一个应用程序的资产文件。(我使用ContentProvider实现公开该文件)
我可以打开几个文件并阅读,但在打开一些文件时我会遇到异常。请找到打开资产文件的实现。
@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设备中打开相同的文件。
任何人都可以指出我,在什么情况下,我们会得到这个例外。
提前致谢。
答案 0 :(得分:12)
Android试图压缩所有资产,除非它没用,就像* .mp3文件一样。 我不知道是否有完整的文件类型列表没有被压缩,但如果你只是将你的文件重命名为.mp3(压缩或不压缩的决定仅基于扩展名)你应该没问题/ p>
谷歌搜索显示:
http://osdir.com/ml/android-ndk/2010-04/msg00086.html
如果您对构建过程有足够的控制权,则可以使用 带有zip或aapt的“-0”标志添加资产。
-0 specifies an additional extension for which such files will not be stored compressed in the .apk. An empty string means to not compress any files at all.
aapt位于你的
Android的SDK \平台\机器人-VERSION \工具
目录
来自上面引用的链接:
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"
};