服务器之家

服务器之家 > 正文

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

时间:2021-05-11 16:55     来源/作者:xu佳佳

在学习获取相册中图片进行裁剪的时候遇到了比较大的问题,在纠结了近半天才真的解决,下面分享一下学习经验。
问题:
选择了相册中的图片之后要进入图片裁剪的时候出错,(华为)手机提示“此图片无法获取”,经百度后,明白是版本不同导致的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输出:

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

得到如下效果:

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

然后是用该图片的绝对路径作为toast输出:

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

得到如下效果:

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

果然是如该博文所讲,那么到底要如何修改呢?由于各个读者碰到的问题不同,只能附上笔者从相册中选择图片并且裁剪的源码仅作参考。

如实在有不懂的,可以访问笔者的上一篇博客,运行一下笔者提供的demo。

mainactivity:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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图片无法裁剪问题的方法,希望对大家的学习有所帮助。

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部