1

sur Android OS 5.11 (peut-être d'autres os aussi bien), Lorsque vous utilisez Intent.ACTION_GET_CONTENT pour lister les fichiers avec sélecteur de fichiers système Android,lors de l'utilisation Intent.ACTION_GET_CONTENT comment éviter « SecurityException »

Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT); 
openIntent.addCategory(Intent.CATEGORY_OPENABLE); 
openIntent.setType("*/*"); 
startActivityForResult(openIntent, ANDROID_FILE_PICKER); 

et onActivityResult void() il a SecurityException:

"Permission refusée: ouverture fournisseur com.google.android.apps.docs.storagebackend.StorageBackendContentProvider ... nécessite android.permission.MANAGE_DOCUMENTS"

le travail autour de la l'exception est:

Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     openIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
     openIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
    openIntent.addCategory(Intent.CATEGORY_OPENABLE); 
    openIntent.setType("*/*"); 
    startActivityForResult(openIntent, ANDROID_FILE_PICKER); 

et onActivityResult(), faites:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    int takeFlags = data.getFlags(); 
    takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    getContentResolver().takePersistableUriPermission(uri, takeFlags); 

pour résoudre la question de l'autorisation.

Mais il est pire que le changement de l'utilisation Intent.ACTION_GET_CONTENT à Intent.ACTION_OPEN_DOCUMENT provoque le menu du sélecteur de fichier système Android ne montre pas les fournisseurs de contenu, comme Dropbox, photos, etc.

(comme indiqué dans le Who to show more providers with ACTION_OPEN_DOCUMENT).

Donc, la question est de savoir si elle doit lister le Dropbox etc. avec l'utilisation de Intent.ACTION_GET_CONTENT, mais comment éviter d'obtenir SecurityException?

+0

Plus de code s'il vous plaît. A quoi ressemble votre onActivityResult avec GET_CONTENT. Quelle ligne obtenez-vous l'exécution – AChez9

+0

à InputStream inputStream = context.getContentResolver(). OpenInputStream (uri); – lannyf

+0

J'ai le même problème, l'avez-vous résolu? –

Répondre

0

semble que cela fonctionne. il doit y avoir une meilleure solution si quelqu'un sait:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
          try { 
           this.grantUriPermission(this.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 
          } catch(IllegalArgumentException e) { 
           this.grantUriPermission(this.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); // kikat api only 0x3 are allowed FLAG_GRANT_READ_URI_PERMISSION = 1 | FLAG_GRANT_WRITE_URI_PERMISSION = 2; 
          } catch (SecurityException e) { 

          } 

          int takeFlags = data.getFlags(); 
          takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION 
            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

          try { 
           getContentResolver().takePersistableUriPermission(uri, takeFlags); 
          } catch (SecurityException e) { 
           // ignore 
          }