android 解决小米手机上选择照片路径为null情况

下返回的路径 为null,在网上搜索了下解决方案,现在把解决方案记录下:

这是在onActivityResult方法中执行的,

[html] view plain copy

print?

  1. if (data == null) {
  2. return;
  3. }
  4. uri = data.getData();
  5. uri = geturi(data);//解决方案
  6. String[] proj = { MediaStore.Images.Media.DATA };
  7. Cursor cursor = managedQuery(uri, proj, null, null, null);
  8. if(cursor!=null){
  9. int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  10. cursor.moveToFirst();
  11. String path = cursor.getString(column_index);// 图片在的路径
  12. Intent intent3 = new Intent(this, SYClipActivity.class);
  13. intent3.putExtra("path", path);
  14. startActivityForResult(intent3, IMAGE_COMPLETE);
  15. }

[html] view plain copy

print?

  1. /**
  2. * 解决小米手机上获取图片路径为null的情况
  3. * @param intent
  4. * @return
  5. */
  6. public Uri geturi(android.content.Intent intent) {
  7. Uri uri = intent.getData();
  8. String type = intent.getType();
  9. if (uri.getScheme().equals("file") && (type.contains("image/"))) {
  10. String path = uri.getEncodedPath();
  11. if (path != null) {
  12. path = Uri.decode(path);
  13. ContentResolver cr = this.getContentResolver();
  14. StringBuffer buff = new StringBuffer();
  15. buff.append("(").append(Images.ImageColumns.DATA).append("=")
  16. .append("‘" + path + "‘").append(")");
  17. Cursor cur = cr.query(Images.Media.EXTERNAL_CONTENT_URI,
  18. new String[] { Images.ImageColumns._ID },
  19. buff.toString(), null, null);
  20. int index = 0;
  21. for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
  22. index = cur.getColumnIndex(Images.ImageColumns._ID);
  23. // set _id value
  24. index = cur.getInt(index);
  25. }
  26. if (index == 0) {
  27. // do nothing
  28. } else {
  29. Uri uri_temp = Uri
  30. .parse("content://media/external/images/media/"
  31. + index);
  32. if (uri_temp != null) {
  33. uri = uri_temp;
  34. }
  35. }
  36. }
  37. }
  38. return uri;
  39. }

在此记录下,

来源:http://blog.csdn.net/coderinchina/article/details/50799501

http://blog.csdn.net/iamwutianbao/article/details/52459509

小米手机选择了图片之后,小米机会崩掉(别的机子,啥版本都没问题)。看异常信息,指示cursor.moveToFirst(),空指针异常。也就是说,cursor为空。是uri的问题,4.4之前,返回的是包含图片绝对路劲的,4.4之后,返回的不再是绝对路劲了,而是一个图片的编码。小米不论版本高低,小米机会崩掉,得到的只是一个图片编码。这时需要去转换为绝对路径,才能方便使用。下面方法是可以得到绝对路径的方法,是大神封装好了,封装成了一个pictureHelper工具类。

吐槽一下,除了小米,用ACTION_PICK,都能得到一个图片的绝对路径。如果是小米,用ACTION_PICK,就需要去转化了。但是,小米用ACTION_GET_CONTENT或者ACTION_OPEN_DOCUMENT,低版本,也能得到绝对路径。。最后统一的处理方法就是,用ACTION_GET_CONTENT,然后分版本处理,低版本还是旧的方法,高版本,用pictureHelper工具类处理得到绝对路径。

[java] view plain copy

  1. package com.xxxe.utils;
  2. import android.annotation.SuppressLint;
  3. import android.content.ContentUris;
  4. import android.content.Context;
  5. import android.database.Cursor;
  6. import android.net.Uri;
  7. import android.os.Build;
  8. import android.os.Environment;
  9. import android.provider.DocumentsContract;
  10. import android.provider.MediaStore;
  11. /**
  12. *  小米手机获取本地相册图片出现空指针异常处理类
  13. * @author dec
  14. *
  15. */
  16. public class MiPictureHelper {
  17. @SuppressLint("NewApi")
  18. public static String getPath(final Context context, final Uri uri) {
  19. final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
  20. // DocumentProvider
  21. if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
  22. // ExternalStorageProvider
  23. if (isExternalStorageDocument(uri)) {
  24. final String docId = DocumentsContract.getDocumentId(uri);
  25. final String[] split = docId.split(":");
  26. final String type = split[0];
  27. if ("primary".equalsIgnoreCase(type)) {
  28. return Environment.getExternalStorageDirectory() + "/" + split[1];
  29. }
  30. }
  31. // DownloadsProvider
  32. else if (isDownloadsDocument(uri)) {
  33. final String id = DocumentsContract.getDocumentId(uri);
  34. final Uri contentUri = ContentUris.withAppendedId(
  35. Uri.parse("content://downloads/public_downloads"),
  36. Long.valueOf(id));
  37. return getDataColumn(context, contentUri, null, null);
  38. }
  39. // MediaProvider
  40. else if (isMediaDocument(uri)) {
  41. final String docId = DocumentsContract.getDocumentId(uri);
  42. final String[] split = docId.split(":");
  43. final String type = split[0];
  44. Uri contentUri = null;
  45. if ("image".equals(type)) {
  46. contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  47. } else if ("video".equals(type)) {
  48. contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  49. } else if ("audio".equals(type)) {
  50. contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  51. }
  52. final String selection = "_id=?";
  53. final String[] selectionArgs = new String[] { split[1] };
  54. return getDataColumn(context, contentUri, selection,
  55. selectionArgs);
  56. }
  57. }
  58. // MediaStore (and general)
  59. else if ("content".equalsIgnoreCase(uri.getScheme())) {
  60. // Return the remote address
  61. if (isGooglePhotosUri(uri))
  62. return uri.getLastPathSegment();
  63. return getDataColumn(context, uri, null, null);
  64. }
  65. // File
  66. else if ("file".equalsIgnoreCase(uri.getScheme())) {
  67. return uri.getPath();
  68. }
  69. return null;
  70. }
  71. public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
  72. Cursor cursor = null;
  73. final String column = "_data";
  74. final String[] projection = { column };
  75. try {
  76. cursor = context.getContentResolver().query(uri, projection,
  77. selection, selectionArgs, null);
  78. if (cursor != null && cursor.moveToFirst()) {
  79. final int index = cursor.getColumnIndexOrThrow(column);
  80. return cursor.getString(index);
  81. }
  82. } finally {
  83. if (cursor != null)
  84. cursor.close();
  85. }
  86. return null;
  87. }
  88. public static boolean isExternalStorageDocument(Uri uri) {
  89. return "com.android.externalstorage.documents".equals(uri.getAuthority());
  90. }
  91. public static boolean isDownloadsDocument(Uri uri) {
  92. return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  93. }
  94. public static boolean isMediaDocument(Uri uri) {
  95. return "com.android.providers.media.documents".equals(uri.getAuthority());
  96. }
  97. private static boolean isGooglePhotosUri(Uri uri) {
  98. return "com.google.android.apps.photos.content".equals(uri.getAuthority());
  99. }
  100. }

如果是想要获取相册中图片的路径,直接这样调用:

[java] view plain copy

  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  2. switch (requestCode) {
  3. case PICK_PICTURE:
  4. // 选取照片
  5. if(data!=null){
  6. try {
  7. Uri uri = data.getData();
  8. String pickPath = MiPictureHelper.getPath(mContext, uri);  // 获取图片路径的方法调用
  9. System.out.println("图片路径 -->> " + pickPath);
  10. }
  11. }
  12. }
  13. }
  14. }

====================== 我是一条分割线 ==========================

下面是其他开发者的处理方法

[java] view plain copy

  1. * 解决小米手机上获取图片路径为null的情况
  2. * @param intent
  3. * @return
  4. */
  5. public Uri getPictureUri(android.content.Intent intent) {
  6. Uri uri = intent.getData();
  7. String type = intent.getType();
  8. if (uri.getScheme().equals("file") && (type.contains("image/"))) {
  9. String path = uri.getEncodedPath();
  10. if (path != null) {
  11. path = Uri.decode(path);
  12. ContentResolver cr = this.getContentResolver();
  13. StringBuffer buff = new StringBuffer();
  14. buff.append("(").append(Images.ImageColumns.DATA).append("=")
  15. .append("‘" + path + "‘").append(")");
  16. Cursor cur = cr.query(Images.Media.EXTERNAL_CONTENT_URI,
  17. new String[] { Images.ImageColumns._ID },
  18. buff.toString(), null, null);
  19. int index = 0;
  20. for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
  21. index = cur.getColumnIndex(Images.ImageColumns._ID);
  22. // set _id value
  23. index = cur.getInt(index);
  24. }
  25. if (index == 0) {
  26. // do nothing
  27. } else {
  28. Uri uri_temp = Uri
  29. .parse("content://media/external/images/media/"
  30. + index);
  31. if (uri_temp != null) {
  32. uri = uri_temp;
  33. }
  34. }
  35. }
  36. }
  37. return uri;
  38. }

他们这样调用方法:

[java] view plain copy

  1. <span style="white-space:pre">    </span>if (data == null) {
  2. return;
  3. }
  4. uri = data.getData();
  5. uri = getPictureUri(data); // 方法调用
  6. String[] proj = { MediaStore.Images.Media.DATA };
  7. Cursor cursor = managedQuery(uri, proj, null, null, null);
  8. if(cursor!=null) {
  9. int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  10. cursor.moveToFirst();
  11. String path = cursor.getString(column_index);// 图片在的路径
  12. Intent intent3 = new Intent(this, SYClipActivity.class);
  13. intent3.putExtra("path", path);
  14. startActivityForResult(intent3, IMAGE_COMPLETE);
  15. }

时间: 2024-10-29 19:12:02

android 解决小米手机上选择照片路径为null情况的相关文章

解决小米手机不能运行Android Studio程序的问题

转载自:解决小米手机不能运行Android Studio程序的问题 问题描述 Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: Installation failed with message Failed to establish session. It is possible that this issue is resolved by uninstalling an existing version of apk i

ios系统 竖屏拍照 canvas处理后 图片旋转(利用exif.js解决ios手机上传竖拍照片旋转90度问题)

转:https://www.cnblogs.com/lovelgx/articles/8656615.html ---恢复内容开始--- 问题:html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 解决方法:利用exif.js解决ios手机上传竖拍照片旋转90度问题 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见 htt

误删小米手机内的照片怎么恢复?

相对于苹果手机在国内销售的疯狂,小米手机用完全国人的设计理念和最纯粹的用户体验至上的原则,打造出了另外一款风靡无数雷军粉丝的畅销机型.据媒体的数据调查显示,当前国内最受欢迎的三大手机品牌当中,小米与风头巧劲的苹果手机一时之间不分伯仲,成为消费者最想买入的手机品牌之一. 据了解,当前网络上不少的用户对于如何恢复误删除的小米手机内的照片非常疑惑.笔者了解到,虽然小米方面对于数据安全防护工作做的非常到位,正常的存储备份包括云在线备份系统都一应俱全,但是实际情况是,并非所有的用户都会选择备份.不少用户由

Android开发之从相册选择照片

Android开发之从相册选择照片 请尊重他人的劳动成果,转载请注明出处:Android开发之从相册选择照片 我曾在 <Android开发之裁剪照片>一文中介绍过,如何从相册选取照片和拍摄照片并进行裁切,在本篇中主要向介绍从相册选择原生照片(不裁切). 第一步:向系统发送选择照片的意图. /** * 从相册选择原生的照片(不裁切) */ private void selectFromGallery() { // TODO Auto-generatedmethod stub Intentinte

解决小米手机无法收到开机广播的问题

今天在做个推推送的时候遇到了小米手机无法收到开机广播的问题. <receiver android:name="com.XXXXXXXXXXX > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 开机广播很容易写,如上代码所示,但是这段代码在小米手机上却

手机上的照片删除了怎么恢复?简单恢复的方法

手机上的照片删除了怎么恢复?简单恢复的方法.手机照片删除之后,真的可以通过方法去找回我们的手机照片吗?相信不少的人都有过这个疑问,那么若是我们不小心删除了我们的手机照片,是否真的可以找回呢? 其实,我们是不用担心的,我们是可以通过我们手机上的一些功能去找回我们的手机中照片的,就像是手机上的最近删除一样,我们是可以通过最近删除去找回的,或者是我们可以通过我们的手机备份去找回的,若是不行的话,你也可以试试下面的方法. 第一步:需要在恢复过程的时候首先打开电脑, 可以先在电脑浏览器上下载安装"互盾安卓

手机上的照片误删了怎么恢复

手机上的照片误删了怎么恢复?恢复手机照片小妙招.手机里心爱的照片被误删了之后,都很心痛.如果不及时找回的话,那就很危险了.我们知道数据恢复是有限制的,那就是被误删的照片存在手机数据库里没有被新的数据覆盖.那么要怎么快速找回手机里误删除的照片呢?手机上照片丢失的时候,不要太惊慌,首先避免再使用手机产生新的数据,然后手机相册如果有保存误删除照片的文件夹的话,先查看里面有没有要找的照片,没有的话再使用数据恢复软件来尝试找回.今天就教给大家一个简单的恢复手机上误删除照片的办法.具体的操作步骤如下:第一步

怎么恢复手机上的照片呢?

怎么恢复手机上的照片呢?我们经常的会因为我们的一些失误的操作到之我们的手机照片被删除,不知道你是不是也有过这样的经历呢?若是你也有这种经历,那么你是怎么恢复我们的手机照片呢? 首先,最近删除有的话,我们直接从最近删除中找回即可,若是最近删除给删除了的话,我们可以试试我们的备份中有没有,若是备份中没有的话,我们也不用担心,我们可以用下面的办法去恢复. 1.首先在准备恢复的时候我们先打开电脑,在电脑上浏览器上下载安装"强力安卓恢复精灵",安装结束之后用数据线将电脑和丢失数据手机连接在一起,

Android 解决魅族手机豌豆荚能连上,Eclipse不能识别的问题

本人使用的是魅蓝note,之前一直用公司的测试机,几天心血来潮想把项目在自己的手机上运行,发现Eclipse竟然不能识别,但是用豌豆荚的话却能正常使用. 经过一番百度+google,终于找到了办法.原来这不是我的手机问题,而是很多魅族手机的共有问题. 解决方法就是在"adb_usb.ini"文件中手动加上厂商ID就可以了. 然后windows和mac设置方法稍有不同哦: MAC的设置方法: 1.把Android手机开启调试模式,然后连接在我们的Mac OS上. 2.选择Mac的 关于本