7

私の要件は、コンテンツ プロバイダーを介して別のアプリから 1 つのアプリのアセット ファイルを開くことです (そのファイルを 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)

しかし、同じファイルを PC または Android デバイスで別の方法で開くことができます。

誰でも私に指摘できますか、どのシナリオで、この例外が発生しますか?

前もって感謝します。

4

1 に答える 1

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.

aapt はあなたの

android-sdk\platforms\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"
};
于 2010-07-05T08:47:55.773 に答える