博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android选择本地图片过大程序停止的经历
阅读量:6306 次
发布时间:2019-06-22

本文共 2336 字,大约阅读时间需要 7 分钟。

最近在搞学校的创新训练项目,自己设计了个界面,通过一个按钮选择本地图片。读取较小的图片时能够顺利显示,但是读取2m的大图片时就出现程序停止运行的错误。于是在网上找到了图片压缩的方法。以下是项目中的压缩代码:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubif (resultCode != RESULT_OK) {Log.e("CODE", "ActivityResult resultCode error");return;}if (requestCode == 1) {Uri uri = data.getData();Bitmap bitmap = null;try {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;// 节约内存options.inPreferredConfig = Bitmap.Config.RGB_565;/** inPurgeable如果设置为true,则由此产生的位图将分配其像素,以便系统需要回收内存时可以将它们清除;* inInputShareable与inPurgeable一起使用 ,如果inPurgeable为false那该设置将被忽略* ,如果为true,那么它可以决定位图是否能够共享一个指向数据源的引用,或者是进行一份拷贝;*/options.inPurgeable = true;options.inInputShareable = true;// 只返回图片的大小等信息存于options中bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);// 获得图片的真实宽高int height = options.outHeight;int width = options.outWidth;Log.i("path", "" + height);final float STANDARD_HEIGHT = 800f;final float STANDARD_WIDTH = 480f;// 根据需要设置inSampleSize的值int size = (int) ((height / STANDARD_HEIGHT + width/ STANDARD_WIDTH) / 2);if (size <= 0) {size = 1;}Log.i("path", "" + size);options.inSampleSize = size;// 重新设置inJustDecodeBounds = falseoptions.inJustDecodeBounds = false;// 此时图片载入bitmap中bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);ImageView imgShow = (ImageView) findViewById(R.id.imgShow);imgShow.setImageBitmap(bitmap);} catch (FileNotFoundException e) {Log.e("exception", e.toString());}super.onActivityResult(requestCode, resultCode, data);}}

 

 

图片是顺利压缩了,可是还是报程序错误,于是我想到了查看错误日志,发现一段错误日志是这样的:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/201 (has extras) }} to activity {com.example.picselecter/com.example.picselecter.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/201 from pid=19596, uid=10107 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

很明显我的程序没有赋予READ_EXTERNAL_STORAGE权限,于是加上后,程序成功运行。当然你加上WRITE_EXTERNAL_STORAGE权限也是可以的,因为它包含了READ权限。

事实证明,查看错误日志是我们定位问题的绝佳途径。

转载于:https://www.cnblogs.com/badrice/p/4239525.html

你可能感兴趣的文章
你的可用性达标了吗?云端业务性能高可用的深度实践
查看>>
linux yum清缓存脚本
查看>>
基于epoll封装的事件回调miniserver
查看>>
天猫高管全面解读大快消2018新零售打法
查看>>
idea springboot热部署无效问题
查看>>
第八章 进程间通信
查看>>
HttpSession接口中的方法(Jsp中的session类的用法)
查看>>
「镁客早报」AI可预测心脏病人死亡时间;机器人开始在美国送外卖
查看>>
MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
查看>>
物联网全面升级,十年内推动工业进入智能化新阶段
查看>>
spring-通过ListFactory注入List
查看>>
一种基于SDR实现的被动GSM嗅探
查看>>
阿里云ECS每天一件事D1:配置SSH
查看>>
SQL Server 性能调优(性能基线)
查看>>
uva 10801 - Lift Hopping(最短路Dijkstra)
查看>>
[Java Web]servlet/filter/listener/interceptor区别与联系
查看>>
POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
查看>>
从零开始学MVC3——创建项目
查看>>
CentOS 7 巨大变动之 firewalld 取代 iptables
查看>>
延时任务和定时任务
查看>>