2017-10-17 18 views
1

Mon application permet à l'utilisateur d'afficher certaines images sélectionnées dans la galerie ou ailleurs. Je demande au Uri de d'images par:L'autorisation pour une image de la galerie est perdue après la relance

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, PickerFragment.PICK_PHOTO); 

Et puis obtenir le Uri dans onActivityResult (int requestCode, int resultCode, les données d'intention) et avoir accès à ces images pour les mettre à la vue de mon application via:

Uri imageUri= data.getData(); 

lorsque les finitions app, je sauve tout Uri dans ma base de données sous forme de chaînes par:

String imageUriString = imageUri.toString(); 
saveToDB (imageUriString); 

Cependant quand je Relancez l'application et restaurer toutes les dat de mon Uri abase via:

String imageUriString = restoreFromDB(); 
imageUri = Uri.parse (imageUriString); 

l'application n'a plus de droits sur ces Uri dans Android 7.1. J'accès aux images par:

ContentResolver cr = mContext.getContentResolver(); 
InputStream is = cr.openInputStream(imageUri); 
BitmapFactory.decodeStream(is, null, o); 

Mais reçoivent cette exception:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord 

Y at-il une façon élégante et légitime de garder cette permission? J'ai essayé de lire tous les documents sur les autorisations, mais je me sens vraiment confus.

J'apprécierais que vous me donniez la bonne direction pour apprendre.

PS Copier les images dans la mémoire des apps alors que la permission d'Uri dure était une option, mais je voudrais éviter cela. Au moins pour voir si c'est possible. PPS J'ai toutes les autorisations accordées, comme la caméra et le stockage externe écrivent et lisent.

+0

vérifier ce lien https://stackoverflow.com/questions/37409181/java-lang-securityexception-permission-denial-opening-provider – Anonymous

+0

magasin byteArray au lieu de uri.Uri échoue lorsque l'image est pas présent dans la galerie. – Anonymous

+0

@Anonyme, le stockage est une option, mais pas souhaitable. Dans mon cas, Uri échoue même si l'image _is_ présente dans la galerie – rommex

Répondre

1

Ainsi, avec l'aide significative de @greenapps et après le test ing sur l'émulateur et réels des dispositifs, la solution est la suivante:

  • utilisation un autre but:

    intention photoPickerIntent = new Intent (Intent.ACTION_OPEN_DOCUMENT);

  • dans onActivityResult() obtenir l'autorisation persistable pour Uri qui sera intact après relancement de l'application:

    Uri SelectedImage = data.getData();

    si (Build.VERSION.SDK_INT> Build.VERSION_CODES.JELLY_BEAN_MR2) { getContentResolver(). TakePersistableUriPermission (selectedImage, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); }

0

Reportez-vous répondre here

Ouvrir une boîte de dialogue en utilisant le code ci-dessous:

ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        1); 

obtenir le résultat de l'activité comme ci-dessous:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: { 

      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do.   
      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

Plus d'info: https://developer.android.com/training/permissions/requesting.html

+0

J'ai toutes les autorisations accordées, comme la caméra et le stockage externe écrire et lire. Ma question concerne un autre problème. – rommex

+0

Donc, utilisez le code dans la réponse à coup sûr? –

+0

Le problème concerne les autorisations de fichier URI et non les autorisations d'exécution générales. – rommex