2017-05-17 6 views
0

à 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) 
+0

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

+0

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

+1

Cela semble vraiment comme le fichier sous-jacent est manquant. – CommonsWare

Répondre

0

Assurez-vous que vous avez l'autorisation "Accès Stockage externe" en vous classe manifeste au bloc "Application". Et si vous utilisez Android version 23 ou 23+, alors vous devez demander la permission à l'exécution.

+0

il a toutes les permissions, et si vous récupérez un autre fichier, cela fonctionne très bien, mais quelqu'un recevra cette exception. – lannyf

+0

Assurez-vous ensuite que le fichier auquel vous essayez d'accéder existe avec la méthode "yourfile.isExists()" et assurez-vous que vous fournissez le bon chemin pour le fichier. –