à l'aide Intent.ACTION_GET_CONTENT pour ouvrir le sélecteur de fichierpourquoi même après getContentResolver(). Requête (uri ...) retourne le curseur mais context.getContentResolver(). OpenInputStream (uri) lancers francs
Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT);
openIntent.addCategory(Intent.CATEGORY_OPENABLE);
String contentType = "*/*";
openIntent.setType(contentType);
startActivityForResult(openIntent, ANDROID_FILE_PICKER);
et à partir de là dans un fichier sélectionné "téléchargements, l'uri il retourne:
content://com.android.providers.media.documents/document/image%3A1679
lors de l'utilisation du uri pour interroger les données du fichier, il retourne bien. mais en utilisant le même uri pour faire openInputStream (uri), il lance "FileNotFoundException: No tel fichier ou répertoire".
quand ramasser un autre fichier, il retourne uri:
content://com.android.providers.media.documents/document/image%3A3372
qui fonctionne très bien avec la requête et openInputStream.
est-il possible que l'androïde renvoyé uri pour la requête, mais ne peut pas être utilisé pour openInputStream (quelqu'un travaille cependant)? qu'est-ce qui pourrait causer ça? est-il un autre moyen d'obtenir le contenu du fichier?
extrait de code:
try {
cursor = context.getContentResolver().query(uri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
fileDisplayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
if (!cursor.isNull(sizeIndex)) {
fileSize = cursor.getInt(sizeIndex);
}
if (!TextUtils.isEmpty(fileDisplayName) && fileSize > 0 {
// the query uri return cursor with the filename and size, looks good
try {
// it throws at this line:
InputStream inputStream = context.getContentResolver().openInputStream(uri);
... ...
} catch (Exception ex) {
//java.io.FileNotFoundException: No such file or directory
}
}
}
} catch (Exception e) {
return null;
} finally {
if (cursor != null) {
cursor.close();
}
}
la pile d'appel:
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: java.io.FileNotFoundException: No such file or directory
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1104)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:942)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at android.content.ContentResolver.openInputStream(ContentResolver.java:662)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at com.zeta.app.utils.FileUtils.cacheFileLocally(FileUtils.java:63)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at com.zeta.app.ui.FilePickerActivity.pickedFile(FilePickerActivity.java:377)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at com.zeta.app.ui.FilePickerActivity.access$100(FilePickerActivity.java:84)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at com.zeta.app.ui.FilePickerActivity$1.run(FilePickerActivity.java:243)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: at java.lang.Thread.run(Thread.java:818)
Veuillez éditer votre question et publier l'intégralité de la trace de la pile Java. Aussi, pour confirmer: ce code est-il dans la même activité que le 'Uri' de' onActivityResult() '? Et, êtes-vous sûr que le premier morceau de contenu existe réellement? Gardez à l'esprit que 'MediaStore' peut être à la traîne derrière ce qui se trouve sur le système de fichiers, si le fichier a été supprimé et que l'index' MediaStore' n'a pas encore été mis à jour pour refléter ce fait. – CommonsWare
Merci CommonWare !, callstack est ajouté, il est de la même onActivityResult(). J'ai été testé contre le même fichier plusieurs fois. Ne peut pas expliquer pourquoi openStream sur cet uri lancera même si la requête avec l'uri est bien. – lannyf
Cela semble vraiment comme le fichier sous-jacent est manquant. – CommonsWare