Comment faire pour conserver l'autorisation de l'API android 19 (KitKat)?
Dans mon application je stocker le chemin d'accès de l'image dans ma db SQlite pour une utilisation ultérieure. Le chemin que je reçois est
content://com.android.providers.media.documents/document/image%3A71964
Quand j'ai récupérer ce chemin à partir de la base de données et d'essayer de récupérer l'image de ce chemin android jette
java.lang.SecurityException: Permission Denial: opening provider
com.android.providers.media.MediaDocumentsProvider
from ProcessRecord{42c84ec8 23911:com.gots.gb/u0a248} (pid=23911, uid=10248)
requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
Selon https://developer.android.com/guide/topics/providers/document-provider.html#permissions j'ai besoin de persister autorisation en ajoutant le code suivant
final int takeFlags = intent.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//Check for the freshest data.
getContentResolver().takePersistableUriPermission(uri, takeFlags);
Quand j'ai ajouté ce code à mon ImageAdapter classe qui s'étend BaseAdapter android jette
08-21 02:14:38.530: W/System.err(24452): java.lang.SecurityException:
No permission grant found for UID 10248 and Uri
content://com.android.providers.media.documents/document/image:71964
C'est la partie pertinente de mon ImageAdapter code
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView ;
if (convertView == null){
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(185, 185));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
}
else{
imageView = (ImageView)convertView ;
}
InputStream is = null;
Bitmap bitmap = null ;
try {
Log.d(TAG,String.valueOf(list.get(position)));
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
final int takeFlags = intent.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//Check for the freshest data.
if (Build.VERSION.SDK_INT >= 19){
mContext.getContentResolver().takePersistableUriPermission(list.get(position), takeFlags);
}
is = mContext.getContentResolver().openInputStream(list.get(position));
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
bitmap = BitmapFactory.decodeStream(is,null, options);
is.close();
imageView.setImageBitmap(bitmap);
return imageView;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
ce que je fais mal?
Grâce
Essayez d'appeler
J'obtiens cette erreur
Je n'ai pas joué avec ce genre de choses encore (il est haut sur ma liste de choses à faire), mais ma conjecture est que la Galerie n'est pas vous offrir un permanent de l'autorisation.
takePersistableUriPermission()
lorsque vous obtenez la Uri
à l'origine, et non pas lorsque vous essayez d'utiliser la Uri
plus tard. Aussi, s'il vous plaît ne pas appeler un ContentResolver
sur le thread principal de l'application, comme vous le faites dans un couple de points dans getView()
. En particulier, openInputStream()
et votre BitmapFactory
travail doit absolument être déplacé à un thread d'arrière-plan.J'obtiens cette erreur
Requested flags 0x1, but only 0x0 are allowed
erreur. Je suis en train d'essayer de récupérer une image à partir de la galerie à l'aide de ACTION_GET_CONTENT
.Je n'ai pas joué avec ce genre de choses encore (il est haut sur ma liste de choses à faire), mais ma conjecture est que la Galerie n'est pas vous offrir un permanent de l'autorisation.
OriginalL'auteur Pdksock | 2014-08-20
Vous devez vous connecter pour publier un commentaire.
Je crois que je l'ai résolu. La demande intention:
et
onActivityResult
Je n'ai pas testé cette pré-kitkat, mon téléphone est en cours d'exécution 5.1, n'importe qui peut le vérifier sur les téléphones plus anciens?
Utils.isKitkat()
n'est pas disponible sans autres bibliothèques. UtilisationBuild.VERSION.SDK_INT >= 19
au lieuOui, la méthode est simple de contre-vérifier la version de build.
L'ajout de @Erich commentaire, vous pouvez utiliser Construire.VERSION.SDK_INT >= Construire.VERSION_CODES.KITKAT pour le rendre un peu plus lisible.
J'obtiens une erreur de dire Non permanent autorisation des subventions trouvé pour UID xxxx et Uri 0 @ contenus://media/externe/video/media/xxxx.. quel pourrait être le problème ?? TIA
Combien de temps si vous gardez l'Uri? Je pense que je l'ai eu quand j'ai utilisé une URI à travers le réinstalle.
OriginalL'auteur DariusL
Le code ci-dessous,
a bien fonctionné pour moi, de toute façon j'ai remarqué que le nombre maximum de permanent uri accordé à mon application est limité à 128. Si je sélectionne plus de 128 uri, j'obtiens l'erreur:
juste quand j'ai essayer de traiter une image pour laquelle je n'étais pas capable de persister à l'autorisation. Pouvez-vous trouver une solution?
Si vous n'avez pas réellement besoin de tous 128 Uri à la fois, puis peut-être vous devriez appeler
ContentResolver.releasePersistableUriPermission()
sur ceux que vous n'avez pas besoin...OriginalL'auteur David
Autre façon d'éviter de demander des autorisations est d'utiliser SharedPreferences. enregistrer uri comme une chaîne de caractères (ou d'autres comme vous en avez besoin), et de la récupérer sans aucun problème.
OriginalL'auteur Ivan Vovk