2010-07-05 11 views
7

La mia esigenza è quella di aprire il file Asset propria applicazione da un'altra applicazione tramite fornitore di contenuti. (Sto esponendo il file con l'attuazione ContentProvider)problema durante l'apertura Asset file con l'aiuto di provider di contenuti

Sono in grado di aprire alcuni file e leggere, ma durante l'apertura di alcuni file ricevo un'eccezione. Si prega di trovare l'implementazione per l'apertura del file di asset.

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

Alcune volte, am.openFd(file_name); è un'eccezione dicendo che,

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) 

Ma, lo stesso file posso aprire nel mio PC o anche in un dispositivo Android in qualche altro modo.

Qualcuno può indicarmi, in quali scenari, otterremo questa eccezione.

Grazie in anticipo.

risposta

12

Android tenta di comprimere tutte le risorse, a meno che non sia inutile, come per i file * .mp3. Non so se c'è un elenco completo di tipi di file che non vengono compressi, ma si dovrebbe andare bene se si rinomina semplicemente i file in .mp3 (la decisione di comprimere o meno è basata solo sull'estensione)

Un po 'di ricerca su Google ha rivelato:

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

Se si dispone di un sufficiente controllo del processo di compilazione, è possibile utilizzare il "-0" bandiera con cerniera o aapt per aggiungere i beni.

-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 si trova nelle vostre

android-sdk \ piattaforme \ android-Version \ strumenti

directory

dal link sopra citato:

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

Se cambiamo l'estensione in questo modo, ciò non causerà alcun problema quando si utilizza il file nell'app se si aspetta qualcos'altro? – clu

Problemi correlati