Android选择本地图片过大程序停止的总结
2015-03-27 15:06
405 查看
最近在搞学校的创新训练项目,自己设计了个界面,通过一个按钮选择本地图片。读取较小的图片时能够顺利显示,但是读取2m的大图片时就出现程序停止运行的错误。于是在网上找到了图片压缩的方法。以下是项目中的压缩代码:
图片是顺利压缩了,可是还是报程序错误,于是我想到了查看错误日志,发现一段错误日志是这样的:
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权限。
事实证明,查看错误日志是我们定位问题的绝佳途径。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if (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 = false options.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权限。
事实证明,查看错误日志是我们定位问题的绝佳途径。
相关文章推荐
- Android选择本地图片过大程序停止的经历
- Android关于本地多媒体(图片、视频、音频)Media的选择总结
- Android开发 点击在本地选择换图片(头像)并且保存,实例总结。
- php程序获取远程图片进行下载到本地方法的总结
- Android内存溢出整理总结 OOM(Out Of Memory) 加载的图片太多或图片过大时经常出现OOM问题
- android 选择本地图片并截剪图片保存到,sdcard指定目录中
- 【Android Intent】本地图片选择(打开媒体库,选择图片)
- 【Android】本地图片选择(打开媒体库,选择图片)
- 最新历史版本 :【Android】本地图片选择(打开媒体库,选择图片)
- 【Android】本地图片选择(打开媒体库,选择图片)
- Android Listview 加载图片优化--本地加载大量图片,解决滑动卡顿现象(滑动停止加载图片)
- Android[高级教程] Android程序调用本地图片并进行绘制
- android本地图片选择(相册选取,相机拍摄)
- 【Android】本地图片选择(打开媒体库,选择图片)
- android-显示选择本地图片或拍照
- android 选择本地图片并预览
- android imageview 选择本地图片
- Android本地图片选择
- android 选择本地图片上传到服务端并保存
- Android 从 Android 本地图库选择多个图片