报错信息:
Caused by: java.lang.SecurityException:
Permission Denial: opening provider
com.android.providers.media.MediaDocumentsProvider from
ProcessRecord{42dd83a8
18369:com.android.gallery3d/u0a44}(pid=18369, uid=10044) requires
android.permission.MANAGE_DOCUMENTS or
android.permission.MANAGE_DOCUMENTS
调用系统相册代码:
IntentalbumIntent=newIntent(Intent.ACTION_GET_CONTENT);
albumIntent.addCategory(Intent.CATEGORY_OPENABLE);
albumIntent
.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(albumIntent,
0x01);的方式来做,是调用系统图库来做,但是发现如果有图片是同步到google相册的话,图库里面能看到一个auto
backup的目录,点进去选图片的话是无法获取到图片的路径的.因为那些图片根本就不存在于手机上.然后看到无论是百度贴吧,Instagram,或者还有些会选取图片做修改的app,都是用一个很漂亮的图片选择器(4.4以上,4.3的还是用系统旧的图库)
这里先看下4.4之前的uri的形式:
Uri:
content://media/extenral/images/media/17766
是不是很熟悉?
再看4.4及以后的Uri形式:
content://com.android.providers.media.documents/document/image:2706
有时候格式:content://com.android.providers.media.documents/document/image:2706
网络上的代码要求的项目sdk版本>=4.4,项目低于4.4版本“DocumentsContract”类是不能使用的,链接:http://blog.csdn.net/tempersitu/article/details/20557383
下面的代码项目sdk版本是<4.4,安装到手机或平板sdk版本4.4以上不会报错。
原理:
一、先解析”
content://com.android.providers.media.documents/document/image:2706
”
得到“image:2706”,尔“2706”才是图片资源存储在数据库的id编号,
所以一旦遇到不是数字“A”就把字符串赋空。
二、通过“2706”id去查询数据库,得到文件的路径,再把路径转化为Uri。
三、文件存储的数据库路径“data/data/com.android.providers.media/databases”,里面就有两个数据库“external.db”,"internal.db",要root权限才能进去查看。