2010-07-05 8 views
7

Meine Forderung ist eine App Asset-Datei aus einer anderen Anwendung über Content-Provider zu öffnen. (Ich diese Datei mit Content Implementierung bin legenden)Problem beim Öffnen Asset-Datei mit Hilfe des Content Provider

Ich bin in der Lage einige zu öffnen Dateien und lesen, aber beim Öffnen von Dateien bekomme ich eine Ausnahme. Sie finden die Implementierung zum Öffnen der Asset-Datei.

@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); 
} 

Einige Male, am.openFd(file_name); wirft eine Ausnahme zu sagen, dass,

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) 

Aber die gleiche Datei, die ich in meinem PC oder sogar in Android-Gerät auf andere Weise öffnen können.

Kann mir jemand sagen, in welchen Szenarien, wir werden diese Ausnahme bekommen.

Vielen Dank im Voraus.

Antwort

12

Android versucht, alle Assets zu komprimieren, es sei denn, es ist nutzlos, wie für * .mp3-Dateien. Ich weiß nicht, ob es eine vollständige Liste von Dateitypen gibt, die nicht komprimiert werden, aber Sie sollten in Ordnung sein, wenn Sie nur Ihre Dateien in .mp3 umbenennen (die Entscheidung zu komprimieren oder nicht basiert nur auf der Erweiterung)

Ein wenig google-Suche ergab:

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

Wenn Sie eine ausreichende Kontrolle über den Build-Prozess haben, können Sie die „-0“ Flagge mit Reißverschluss oder aapt verwenden, um die Vermögenswerte hinzuzufügen.

-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 ist in Ihrem

android-sdk \ Plattformen \ android-VERSION \ tools

Verzeichnis

aus dem Link oben zitierten gelegen:

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

Wenn wir die Erweiterung so ändern, wird das kein Problem bei der Verwendung der Datei in der App, wenn sie etwas anderes erwartet? – clu