小米手机选择了图片之后,小米机会崩掉(别的机子,啥版本都没问题)。看异常信息,指示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);  }  

小米手机从相册获照片返回空指针异常相关推荐

  1. 小米手机从相册获取照片异常,返回空指针异常

    现象: 小米手机MIUI 8 从相册获取照片返回空指针异常 小米手机选择了图片之后,当前Activity会崩掉(别的手机,其他版本都没问题).看异常信息,指示各种空指针异常.也就是说图片路径空了.是u ...

  2. 手机小技巧:小米手机怎么恢复删除的照片?

    说到小米手机,小米手机是国产手机中比较出名的一款,以性价比闻名于世,虽然系统真的有待完善(吐槽).话不多说,本文主题:小米手机怎么恢复删除的照片?下面一起来看看! 手机都会自带相机,这是家喻户晓的,那 ...

  3. 小米手机通过相册修改头像时报java.lang.SecurityException

    问题解决办法记录(好记性不如烂笔头-电子笔头,嘿嘿) Caused by: java.lang.SecurityException: UID 10764 does not have permissio ...

  4. MIUI打开相册怎么默认显示全部照片_小米手机让相册默认展示所有图片怎么设置?

    问题:怎么可以将相册默认显示的图片,设置为显示所有呢? MIUI打开相册怎么默认显示全部照片? 小米k40,发现打开相册默认不显示全部照片,每次截图录屏后都不直接显示在照片里,得手动点到全部照片,很不 ...

  5. android 小米手机选择相册图片截取照片不进onActivityResult报“保存时发生错误,保存失败”

    小米选择相册时如果不使用系统截屏,直接压缩不会报"保存时发生错误,保存失败"的错误,如果截屏就会报如上错误. 需要把URI地址转为图片地址,再包成file文件转为URI Uri u ...

  6. 小米手机从相册选择图片问题

    从相册选择图片,我从标题栏的菜单项上进行点击操作 @Override public boolean onOptionsItemSelected(MenuItem item) {if (item.get ...

  7. Android--使用手机拍照获取图片路径,小米手机选择照片问题处理

    Android开发选取照片问题 本文主要记录使用手机自带相机拍照获取返回照片路径,以及从本地相册选取已有照片时返回Intent data; 数据处理 操作.(小米手机获取照片路径与其他手机不一致问题! ...

  8. 找回华为云删除的通讯录_找回小米手机误删照片只要10秒!人人都知道的方法,你怎能不知道...

    现在有很多小伙伴都会在手机中保存很多照片,当我们的手机内存开始不是很足够的时候,很多人都会对相册中的照片进行清理.但是偶尔会因为粗心将自己想要保存在手机中的照片删除,那也是尴尬了. 别担心,今天小编将 ...

  9. 小米手机相册选取后的intent为空?

    一.问题现象 在小米手机选择相册图片-裁剪后发现拿不到图片 展示不出来,通过debug发现小米手机上的Intent返回了空 @Override public void onActivityResult ...

最新文章

  1. 9273:PKU2506Tiling
  2. 数据不一致问题排查1
  3. 看到关于java资料比较全的,自己收藏
  4. nao机器人拆解_一些机器人硬件网站
  5. strictmath_Java StrictMath log1p()方法与示例
  6. split和join和pop和remove用法
  7. matlab repmat 函数的使用
  8. 【多任务】多任务学习在推荐算法中的应用
  9. Java中对数组的操作
  10. 实验五|Python 企业获利能力分析
  11. 全新天狼星网络验证系统源码+功能强大
  12. 将TXT文件作为数据库批量生成条形码
  13. pythonallowpos_基于Python的诗和远方
  14. lol韩服游戏内设置_lol韩服设置对照
  15. matlab在点内加入权值,matlab权值矩阵
  16. 将若干字符串按照字母顺序输出
  17. 什么是共识?(理论篇)
  18. 【Java面向对象编程——名片管理系统】
  19. oracle计算两个日期相隔月数,计算日期相差
  20. CTC:围观大佬从语音/文字客观存在的 blank 发力,玩转前缀 + 动态规划,打造无缝衔接神经网络的不定长序列识别

热门文章

  1. 老生常谈之--修内功还是打把势
  2. 工作2年,月薪5K?这个赚钱技能你可能用得上
  3. [转]工作流:小明和小强都是张老师的学生
  4. 计算机毕业设计django基于python的读书笔记共享平台
  5. 交易开拓者在哪里回测_请问这个策略有偷价或者未来函数行为吗?回测效果很好-开拓者知识 -程序化交易(CXH99.COM)...
  6. vue2基础 - vue2 动态组件和异步组件使用
  7. direct wifi 芯片_Wifi Direct是什么意思
  8. 威洛特:猫咪中耳炎及内耳炎的常见因素
  9. 接触监控步入监控工程师行业
  10. anychart学习