【发布时间】:2014-10-14 09:06:43
【问题描述】:
在我的应用程序中,我将图像路径存储在我的 SQlite 数据库中以供进一步使用。我得到的路径是
content://com.android.providers.media.documents/document/image%3A71964
当我从数据库中检索此路径并尝试从 android 抛出的该路径中检索图像时
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
根据https://developer.android.com/guide/topics/providers/document-provider.html#permissions我需要通过添加以下代码来持久化权限
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);
当我将此代码添加到扩展 BaseAdapter android 抛出的 ImageAdapter 类中时
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
这是我的 ImageAdapter 代码的相关部分
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;
}
我做错了什么? 谢谢
【问题讨论】:
-
在您最初获得
Uri时尝试调用takePersistableUriPermission(),而不是在您稍后尝试使用Uri时。此外,请不要在主应用程序线程上调用ContentResolver,就像您在getView()中的几个地方所做的那样。特别是,openInputStream()和您的BitmapFactory工作肯定需要移至后台线程。 -
@CommonsWare 我收到此错误
Requested flags 0x1, but only 0x0 are allowed错误。我正在尝试使用ACTION_GET_CONTENT从图库中检索图像。 -
我还没有玩过这些东西(它在我的待办事项清单上很重要),但我猜画廊没有为您提供持久许可。
-
@Pdksock 改变这个:final int takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
标签: java android sqlite android-4.4-kitkat storage-access-framework