最近在做一个从图库选择图片或拍照,然后裁剪的功能.本来是没问题的,一直在用
**[java]** [view plain](http://blog.csdn.net/tempersitu/article/details/20557383#)[copy](http://blog.csdn.net/tempersitu/article/details/20557383#)[](https://code.csdn.net/snippets/219069)[](https://code.csdn.net/snippets/219069/fork) - Intent intent=<span class="keyword">new</span> Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 的方式来做,是调用系统图库来做,但是发现如果有图片是同步到google相册的话,图库里面能看到一个auto backup的目录,点进去选图片的话是无法获取到图片的路径的.因为那些图片根本就不存在于手机上.然后看到无论是百度贴吧,Instagram,或者还有些会选取图片做修改的app,都是用一个很漂亮的图片选择器(4.4以上,4.3的还是用系统旧的图库).
而这个图片选择器可以屏蔽掉那个auto backup的目录.所以就开始打算用这个图片选择器来选图片了.
这个方法就是
**[java]** [view plain](http://blog.csdn.net/tempersitu/article/details/20557383#)[copy](http://blog.csdn.net/tempersitu/article/details/20557383#)[](https://code.csdn.net/snippets/219069)[](https://code.csdn.net/snippets/219069/fork) - Intent intent=<span class="keyword">new</span> Intent(Intent.ACTION_GET_CONTENT);<span class="comment">//ACTION_OPEN_DOCUMENT</span> - intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(<span class="string">“image/jpeg”</span>); - <span class="keyword">if</span>(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){ - startActivityForResult(intent, SELECT_PIC_KITKAT); - }<span class="keyword">else</span>{ - startActivityForResult(intent, SELECT_PIC); - } 为什么要分开不同版本呢?其实在4.3或以下可以直接用ACTION_GET_CONTENT的,在4.4或以上,官方建议用ACTION_OPEN_DOCUMENT,但其实都不算太大区别,区别是他们返回的Uri,那个才叫大区别.这就是困扰了我一整天的问题所在了.
4.3或以下,选了图片之后,根据Uri来做处理,很多帖子都有了,我就不详细说了.主要是4.4,如果使用上面pick的原生方法来选图,返回的uri还是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri跟4.3是完全不一样的,4.3返回的是带文件路径的,而4.4返回的却是content://com.android.providers.media.documents/document/image:3951这样的,没有路径,只有图片编号的uri.这就导致接下来无法根据图片路径来裁剪的步骤了.
还好找了很多方法,包括加权限啊什么的,中间还试过用一些方法,自己的app没崩溃,倒是让系统图库崩溃了,引发了java.lang.SecurityException.
**[java]** [view plain](http://blog.csdn.net/tempersitu/article/details/20557383#)[copy](http://blog.csdn.net/tempersitu/article/details/20557383#)[](https://code.csdn.net/snippets/219069)[](https://code.csdn.net/snippets/219069/fork) - Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{437b5d88 <span class="number">9494</span>:com.google.android.gallery3d/u0a20} (pid=<span class="number">9494</span>, uid=<span class="number">10020</span>) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 看来4.4的系统还是有些bug.重点来了,4.4得到的uri,需要以下方法来获取文件的路径
...