小米手机从相册获照片返回空指针异常
小米手机选择了图片之后,小米机会崩掉(别的机子,啥版本都没问题)。看异常信息,指示cursor.moveToFirst(),空指针异常。也就是说,cursor为空。是uri的问题,4.4之前,返回的是包含图片绝对路劲的,4.4之后,返回的不再是绝对路劲了,而是一个图片的编码。小米不论版本高低,小米机会崩掉,得到的只是一个图片编码。这时需要去转换为绝对路径,才能方便使用。下面方法是可以得到绝对路径的方法,是大神封装好了,封装成了一个pictureHelper工具类。
吐槽一下,除了小米,用ACTION_PICK,都能得到一个图片的绝对路径。如果是小米,用ACTION_PICK,就需要去转化了。但是,小米用ACTION_GET_CONTENT或者ACTION_OPEN_DOCUMENT,低版本,也能得到绝对路径。。最后统一的处理方法就是,用ACTION_GET_CONTENT,然后分版本处理,低版本还是旧的方法,高版本,用pictureHelper工具类处理得到绝对路径。
package com.xxxe.utils;import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;/*** 小米手机获取本地相册图片出现空指针异常处理类* @author dec**/public class MiPictureHelper {@SuppressLint("NewApi")public static String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// DocumentProviderif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (isExternalStorageDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {return Environment.getExternalStorageDirectory() + "/" + split[1];}}// DownloadsProviderelse if (isDownloadsDocument(uri)) {final String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));return getDataColumn(context, contentUri, null, null);}// MediaProviderelse if (isMediaDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[] { split[1] };return getDataColumn(context, contentUri, selection,selectionArgs);}}// MediaStore (and general)else if ("content".equalsIgnoreCase(uri.getScheme())) {// Return the remote addressif (isGooglePhotosUri(uri))return uri.getLastPathSegment();return getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {Cursor cursor = null;final String column = "_data";final String[] projection = { column };try {cursor = context.getContentResolver().query(uri, projection,selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {final int index = cursor.getColumnIndexOrThrow(column);return cursor.getString(index);}} finally {if (cursor != null)cursor.close();}return null;}public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}private static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}}
如果是想要获取相册中图片的路径,直接这样调用:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case PICK_PICTURE:// 选取照片if(data!=null){try {Uri uri = data.getData();String pickPath = MiPictureHelper.getPath(mContext, uri); // 获取图片路径的方法调用System.out.println("图片路径 -->> " + pickPath);}}}}
}
====================== 我是一条分割线 ==========================
下面是其他开发者的处理方法
* 解决小米手机上获取图片路径为null的情况 * @param intent * @return */ public Uri getPictureUri(android.content.Intent intent) { Uri uri = intent.getData(); String type = intent.getType(); if (uri.getScheme().equals("file") && (type.contains("image/"))) { String path = uri.getEncodedPath(); if (path != null) { path = Uri.decode(path); ContentResolver cr = this.getContentResolver(); StringBuffer buff = new StringBuffer(); buff.append("(").append(Images.ImageColumns.DATA).append("=") .append("'" + path + "'").append(")"); Cursor cur = cr.query(Images.Media.EXTERNAL_CONTENT_URI, new String[] { Images.ImageColumns._ID }, buff.toString(), null, null); int index = 0; for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { index = cur.getColumnIndex(Images.ImageColumns._ID); // set _id value index = cur.getInt(index); } if (index == 0) { // do nothing } else { Uri uri_temp = Uri .parse("content://media/external/images/media/" + index); if (uri_temp != null) { uri = uri_temp; } } } } return uri; }
他们这样调用方法:
<span style="white-space:pre"> </span>if (data == null) { return; } uri = data.getData(); uri = getPictureUri(data); // 方法调用String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, proj, null, null, null); if(cursor!=null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(column_index);// 图片在的路径 Intent intent3 = new Intent(this, SYClipActivity.class); intent3.putExtra("path", path); startActivityForResult(intent3, IMAGE_COMPLETE); }
小米手机从相册获照片返回空指针异常相关推荐
- 小米手机从相册获取照片异常,返回空指针异常
现象: 小米手机MIUI 8 从相册获取照片返回空指针异常 小米手机选择了图片之后,当前Activity会崩掉(别的手机,其他版本都没问题).看异常信息,指示各种空指针异常.也就是说图片路径空了.是u ...
- 手机小技巧:小米手机怎么恢复删除的照片?
说到小米手机,小米手机是国产手机中比较出名的一款,以性价比闻名于世,虽然系统真的有待完善(吐槽).话不多说,本文主题:小米手机怎么恢复删除的照片?下面一起来看看! 手机都会自带相机,这是家喻户晓的,那 ...
- 小米手机通过相册修改头像时报java.lang.SecurityException
问题解决办法记录(好记性不如烂笔头-电子笔头,嘿嘿) Caused by: java.lang.SecurityException: UID 10764 does not have permissio ...
- MIUI打开相册怎么默认显示全部照片_小米手机让相册默认展示所有图片怎么设置?
问题:怎么可以将相册默认显示的图片,设置为显示所有呢? MIUI打开相册怎么默认显示全部照片? 小米k40,发现打开相册默认不显示全部照片,每次截图录屏后都不直接显示在照片里,得手动点到全部照片,很不 ...
- android 小米手机选择相册图片截取照片不进onActivityResult报“保存时发生错误,保存失败”
小米选择相册时如果不使用系统截屏,直接压缩不会报"保存时发生错误,保存失败"的错误,如果截屏就会报如上错误. 需要把URI地址转为图片地址,再包成file文件转为URI Uri u ...
- 小米手机从相册选择图片问题
从相册选择图片,我从标题栏的菜单项上进行点击操作 @Override public boolean onOptionsItemSelected(MenuItem item) {if (item.get ...
- Android--使用手机拍照获取图片路径,小米手机选择照片问题处理
Android开发选取照片问题 本文主要记录使用手机自带相机拍照获取返回照片路径,以及从本地相册选取已有照片时返回Intent data; 数据处理 操作.(小米手机获取照片路径与其他手机不一致问题! ...
- 找回华为云删除的通讯录_找回小米手机误删照片只要10秒!人人都知道的方法,你怎能不知道...
现在有很多小伙伴都会在手机中保存很多照片,当我们的手机内存开始不是很足够的时候,很多人都会对相册中的照片进行清理.但是偶尔会因为粗心将自己想要保存在手机中的照片删除,那也是尴尬了. 别担心,今天小编将 ...
- 小米手机相册选取后的intent为空?
一.问题现象 在小米手机选择相册图片-裁剪后发现拿不到图片 展示不出来,通过debug发现小米手机上的Intent返回了空 @Override public void onActivityResult ...
最新文章
- 9273:PKU2506Tiling
- 数据不一致问题排查1
- 看到关于java资料比较全的,自己收藏
- nao机器人拆解_一些机器人硬件网站
- strictmath_Java StrictMath log1p()方法与示例
- split和join和pop和remove用法
- matlab repmat 函数的使用
- 【多任务】多任务学习在推荐算法中的应用
- Java中对数组的操作
- 实验五|Python 企业获利能力分析
- 全新天狼星网络验证系统源码+功能强大
- 将TXT文件作为数据库批量生成条形码
- pythonallowpos_基于Python的诗和远方
- lol韩服游戏内设置_lol韩服设置对照
- matlab在点内加入权值,matlab权值矩阵
- 将若干字符串按照字母顺序输出
- 什么是共识?(理论篇)
- 【Java面向对象编程——名片管理系统】
- oracle计算两个日期相隔月数,计算日期相差
- CTC:围观大佬从语音/文字客观存在的 blank 发力,玩转前缀 + 动态规划,打造无缝衔接神经网络的不定长序列识别
热门文章
- 老生常谈之--修内功还是打把势
- 工作2年,月薪5K?这个赚钱技能你可能用得上
- [转]工作流:小明和小强都是张老师的学生
- 计算机毕业设计django基于python的读书笔记共享平台
- 交易开拓者在哪里回测_请问这个策略有偷价或者未来函数行为吗?回测效果很好-开拓者知识 -程序化交易(CXH99.COM)...
- vue2基础 - vue2 动态组件和异步组件使用
- direct wifi 芯片_Wifi Direct是什么意思
- 威洛特:猫咪中耳炎及内耳炎的常见因素
- 接触监控步入监控工程师行业
- anychart学习