安卓上传本地图片闪退

1.现象

当我们在app上上传一些安卓的本地图片时,有时当上传某些图片时会莫名其妙的闪退,而检查时发现并没有oom异常。同样上传一些类似的图片却可以正常使用。

1.1 开启选择本地图片

Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO);

1.2 onActvityResult中处理返回结果

/* data为onActvityResult的第三个参数 */
Uri uri = data.getData();

String[] proj = { MediaStore.Images.Media.DATA };

Cursor cursor = context.getContentResolver().query(uri, proj, null,null, null);
int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(index);

这样就得到了图片的路径。但是问题就出在这里。当调试的时候发现,闪退的原因是cursor值为null。也就是说,当前数据库中根本就没有这条记录。以下分别是可用图片和闪退图片的url示例

/* 可用url */
content://media/external/images/media/117231
由此url在内容提供者中查到的对应路径为:/storage/emulated/0/DCIM/Camera/IMG_20150624_180203.jpg

/* 造成cursor为null的url  */
file:///storage/emulated/0/MIUI/Gallery/cloud/.thumbnailFile/3a55c22cfe329906fcfbfe62f8b910bca4ad7d54.jpg

显然,这并不是一个url,也不是一个直接可用的路径,所以cursor不会查到任何值。

路径中的.thumbnailFile文件是一个系统的默认的图片缓存文件。所以,这里我猜想由于是缓存文件,所以MideaStore内容提供者并没有记录这个文件的信息,于是返回了它的路径字符串。

2.解决办法

由于可以返回该图片的路径,那么我们可以直接使用这个路径而绕过内容提供者。但是注意,该路径类似于file:///storage/emulated… 的格式,我们并不能直接使用,需要将其file://字符串去掉,转换为可以使用的路径字符串。

String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(uri, proj, null,null, null);

//针对部分手机,图片在缓存文件中,MediaStore中没有对应url,则判断传入url是否为类似"file:///storage/emulated/0/..."路径
//如果是路径,则直接截取为类似/storage/emulated/0/..的字符串,并用这个字符串当做路径
if(cursor == null){
    String str = uri.toString();
    System.out.println(str);
    if(str.contains("file:///")){
            Utility.closeSafely(cursor);
            str = str.substring(7);
            return str;
           }
}

int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String path = cursor.getString(index);
    Utility.closeSafely(cursor);
    return path;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 16:19:02

安卓上传本地图片闪退的相关文章

KindEditor上传本地图片在ASP.NET MVC的配置

http://www.cnblogs.com/upupto/archive/2010/08/24/1807202.html 本文解决KindEditor上传本地图片在ASP.NET MVC中的配置. 开发工具:VS 2010 EN 开发语言:Visual C# ASP.NET MVC 2.0 kindeditor-3.5-zh_CN 下载 文中以Blog文章为例,为做演示,数据表比较简单,如下图: 添加 BlogController Code: 1 2 3 4 5 6 7 8 9 10 11 1

.net mvc 利用 kindeditor 上传本地图片

最近在用kindeditor 编辑器,在上传本地图片的时候遇到了点问题,不能正确的上传. 现在把使用 kindeditor 上传本地图片的配置记录一下. 1.下载kindeditor.http://kindeditor.net/down.php 2.解压,将所有文件复制到项目里.我是放在content里面. (您可以根据需求删除以下目录后上传到服务器,asp - ASP程序,asp.net - ASP.NET程序,php - PHP程序,jsp - JSP程序,examples - 演示文件)

关于KindEditor组件上传本地图片报服务器异常的错误

今天突然间接到一个异常信息的问题,说系统的在线文本编辑器里上传本地图片报服务器异常的错误信息,开始我用firebug调试,发现前台不报错,然后我去服务器日志里找,也没看到相关信息.看网上写的说有可能是路径或者有可能是权限问题,我看权限已经设置,路径看后干脆直接改成: $save_path = '../../xxx';//相对upload_json.php的位置来说 $save_url = ' 但是我发现上传的时候还是报错,最后刷新缓存.好了. 注:我用的是php版.

是用博客园发表博客是如何上传本地图片

之前写了一篇带有图片的文章,我是直接从Word文档copy过来的,结果发现图片没有,找了很多资料,都说的很麻烦,最后还是自己找到了一简单方法, 这样,你的图片就可以上传了! 是用博客园发表博客是如何上传本地图片

​Typecho支持上传本地图片的编辑器插件

搭建Typecho博客平台参考我之前的文章:http://msiyuetian.blog.51cto.com/8637744/1920161 Typecho自带的文章编辑器太简洁了,很多功能都缺少,比如本地上传图片等功能.本文主要介绍一款插件:XhEditor1.0.2,支持本地上传图片,也可以直接拖放图片到编辑器中. 1.下载插件,解压得到一个文件夹,并将整个文件夹上传至usr/plugins/目录下 2.登陆自己的Typecho博客后台,在"控制台"的下拉菜单中选择"插件

xheditor1.1.14在asp.net网站开发中作为可上传本地图片的在线编辑器

xheditor是一个基于jQuery开发的跨平台轻量可视化XHTML编辑器,功能强大,使用方便,CSDN网站的发表文章网页就使用了该编辑器,下面介绍在vs2013的环境下开发网页时使用该编辑器并实现本地图片上传的一种方法. 1.网上搜索并下载文件xheditor1.1.1文件包,解压后应该是一个包括jquery.xheditor_emo.t xheditor_plugins. xheditor_skin.demos等文件夹及xheditor-1.1.14-zh-cn.min.js等文件的一个文

html5上传本地图片,在线预览及裁剪(filereader,canvas)

1 我们常常需要上传头像,点击上传按钮时候需要预览一下,使用filereader方法无需和后台交互,代码如下: //本地图片在上传之前的预览效果 //图片上传预览 function previewImage(file) { if (file.files && file.files[0]) { var img = document.getElementById('imghead'); var reader = new FileReader(); //读取file完成之后加载 reader.o

调用微信接口自动实现上传本地图片

在实现微信图片上传时,因为文件是一个文件,无法向字符串一样通过参数一样直接写在请求地址中, 我自己做了一个页面抓取了一下请求,自己用C#代码拼接了一个请求. public string HttpUploadFile() { string url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=****************&type=image"; #region 本地图片 string path

上传本地图片

input type=file可以用来上传文件. DOM(input)有files属性(一个数组),用来存放file对象.file对象有size(byte unit),name,type3个属性 可以用fileReader这个东西把数据读出来再显示到img标签中. 弄个id为preview的dom,把每个上传的img都显示在里 var file = files[i]; var imageType = /^image\//; //只能传image的 if ( !imageType.test(fil