Problem while opening Asset File with the help of Content Provider

折月煮酒 提交于 2020-01-11 05:07:05

问题


My requirement is to open one app's Asset file from another app via content provider.(I am exposing that file with ContentProvider implementation)

I am able to open few files and read, but while opening some files I am getting exception. Please find the implementation for opening 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);
}

Some times, am.openFd(file_name); is throwing an exception saying that,

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)

But, the same file I can open in my PC or even in Android device in some other manner.

Can anyone point out me, in what scenarios, we will get this exception.

Thanks in advance.


回答1:


Android tries to compress all assets, unless it's useless, like for *.mp3 files. I don't know if there is a complete list of filetypes that don't get compressed, but you should be fine if you just rename your files to .mp3 (the decision to compress or not is only based on the extension)

A little google search revealed:

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

If you have sufficient control over the build process, you can use the "-0" flag with zip or aapt to add the assets.

-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 is located in your

android-sdk\platforms\android-VERSION\tools

directory

from the link cited above:

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"
};


来源:https://stackoverflow.com/questions/3177026/problem-while-opening-asset-file-with-the-help-of-content-provider

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!