在我的应用程序中,我将图像的路径存储在我的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);
当我将此代码添加到ImageBase类中,该类扩展了BaseAdapter android引发时
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;
}
我究竟做错了什么?谢谢
我相信我已经解决了。请求意图:
Intent intent;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
}else{
intent = new Intent(Intent.ACTION_GET_CONTENT);
}
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.form_pick_photos)), REQUEST_PICK_PHOTO);
和 onActivityResult
...
// kitkat fixed (broke) content access; to keep the URIs valid over restarts need to persist access permission
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
ContentResolver resolver = getActivity().getContentResolver();
for (Uri uri : images) {
resolver.takePersistableUriPermission(uri, takeFlags);
}
}
...
我尚未测试过此kitkat,我的手机运行的是5.1,有人可以在旧手机上验证吗?
这是我的ImageAdapter代码的相关部分 我做错了什么?谢谢
问题内容: 我在网上找到的大多数示例都显示了如何删除空格-但就我而言,我需要保留它。 我希望保留空白(“ html”变量包含pre标记的内容),但是似乎用一个空格代替了多个空格。 如何保存/获取给定beautifulsoup解析器的原始内容? 问题答案: 如果您要解析的内容在 保留空白。
问题内容: 在AngularJS部分中,我如下遍历条目列表: 的内容有一些换行符,AngularJS会忽略它们。如何使其保留换行符? 问题答案: 这只是基本的HTML。AngularJS对此不会做任何改变。您可以改用标签: 或使用CSS: 如果包含HTML代码,则可以使用: 不要忘记包括ngSanitize:
问题内容: 我想按照我的Web服务器的版本控制中所述,通过在Web服务器上创建gitrepo来对[Web服务器进行版本控制。我希望我能够将Web内容从我们的开发服务器推送到github,再将其拉到我们的生产服务器,并在剩下的一天中度过。 显然,我的计划中的一个缺点是Git不尊重文件权限(我还没有尝试过,仅现在就阅读它。)我想这很有意义,因为不同的盒子可能具有不同的用户/组设置。但是,如果我想强制传
问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合