解决Android从相册中获取图片出错图片却无法裁剪问题的方法
程序员文章站
2024-02-16 13:28:52
在学习获取相册中图片进行裁剪的时候遇到了比较大的问题,在纠结了近半天才真的解决,下面分享一下学习经验。
问题:
选择了相册中的图片之后要进入图片裁剪的时候出错,(华为)...
在学习获取相册中图片进行裁剪的时候遇到了比较大的问题,在纠结了近半天才真的解决,下面分享一下学习经验。
问题:
选择了相册中的图片之后要进入图片裁剪的时候出错,(华为)手机提示“此图片无法获取”,经百度后,明白是版本不同导致的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.这就导致接下来无法根据图片路径来裁剪的步骤了.
在程序可以运行之后也是进行了一定的测试,如下图:
首先是用onactivityresult接收到的返回值作为toast输出:
得到如下效果:
然后是用该图片的绝对路径作为toast输出:
得到如下效果:
果然是如该博文所讲,那么到底要如何修改呢?由于各个读者碰到的问题不同,只能附上笔者从相册中选择图片并且裁剪的源码仅作参考。
如实在有不懂的,可以访问笔者的上一篇博客,运行一下笔者提供的demo。
mainactivity:
import java.io.file; import java.io.filenotfoundexception; import java.io.ioexception; import android.app.activity; import android.content.intent; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.net.uri; import android.os.bundle; import android.os.environment; import android.provider.mediastore; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.imageview; import android.widget.toast; public class mainactivity extends activity { public static final int cut_picture = 1; public static final int show_picture = 2; private button takephoto; private button choosefromalbum; private imageview picture; private uri imageuri; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); takephoto = (button) findviewbyid(r.id.take_photo); choosefromalbum = (button) findviewbyid(r.id.choose_from_album); picture = (imageview) findviewbyid(r.id.picture); takephoto.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { //创建file对象,用于存储拍照后的图片 //将此图片存储于sd卡的根目录下 file outputimage = new file(environment.getexternalstoragedirectory(), "output_image.jpg"); try { if (outputimage.exists()) { outputimage.delete(); } outputimage.createnewfile(); } catch (ioexception e) { e.printstacktrace(); } //将file对象转换成uri对象 //uri表标识着图片的地址 imageuri = uri.fromfile(outputimage); //隐式调用照相机程序 intent intent = new intent("android.media.action.image_capture"); //拍下的照片会被输出到output_image.jpg中去 intent.putextra(mediastore.extra_output, imageuri); //此处是使用的startactivityforresult() //因此在拍照完后悔有结果返回到onactivityresult()中去,返回值即为take_photo //onactivityresult()中主要是实现图片裁剪 startactivityforresult(intent, cut_picture); } }); choosefromalbum.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { file outputimage = new file(environment.getexternalstoragedirectory(), "output_image.jpg"); imageuri = uri.fromfile(outputimage); try { if (outputimage.exists()) { outputimage.delete(); } outputimage.createnewfile(); } catch (ioexception e) { e.printstacktrace(); } intent intent = new intent(intent.action_pick,null); //此处调用了图片选择器 //如果直接写intent.setdataandtype("image/*"); //调用的是系统图库 intent.setdataandtype(mediastore.images.media.external_content_uri, "image/*"); intent.putextra(mediastore.extra_output, imageuri); startactivityforresult(intent, cut_picture); } }); } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { switch (requestcode) { case cut_picture: if (resultcode == result_ok) { //此处启动裁剪程序 intent intent = new intent("com.android.camera.action.crop"); //此处注释掉的部分是针对android 4.4路径修改的一个测试 //有兴趣的读者可以自己调试看看 string text=imageuri.tostring(); toast.maketext(mainactivity.this, text, toast.length_short).show(); intent.setdataandtype(data.getdata(), "image/*"); intent.putextra("scale", true); intent.putextra(mediastore.extra_output, imageuri); startactivityforresult(intent, show_picture); } break; case show_picture: if (resultcode == result_ok) { try { //将output_image.jpg对象解析成bitmap对象,然后设置到imageview中显示出来 bitmap bitmap = bitmapfactory.decodestream(getcontentresolver() .openinputstream(imageuri)); picture.setimagebitmap(bitmap); } catch (filenotfoundexception e) { e.printstacktrace(); } } break; default: break; } } }
以上就是为大家分享的解决android图片无法裁剪问题的方法,希望对大家的学习有所帮助。
上一篇: C#实现在两个数字之间生成随机数的方法
下一篇: mysql 按照时间段来获取数据的方法