在Content Provider的帮助下打开资产文件时出现问题

And*_*ala 7 java android android-assets

我的要求是通过内容提供商从另一个应用程序打开一个应用程序的资产文件.(我使用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);
}
Run Code Online (Sandbox Code Playgroud)

有时候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)
Run Code Online (Sandbox Code Playgroud)

但是,我可以在我的电脑甚至Android设备中以其他方式打开相同的文件.

任何人都可以指出我,在什么情况下,我们会得到这个例外.

提前致谢.

slu*_*lup 12

Android尝试压缩所有资产,除非它没用,就像*.mp3文件一样.我不知道是否有完整的文件类型列表没有被压缩,但如果你只是将你的文件重命名为.mp3你应该没问题(压缩与否的决定仅基于扩展)

一个小谷歌搜索透露:

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.
Run Code Online (Sandbox Code Playgroud)

aapt位于你的

Android的SDK \平台\ Android的版本\工具

目录

从上面引用的链接:

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"
};
Run Code Online (Sandbox Code Playgroud)