小米手机Attempt to invoke interface method 'boolean android.database.Cursor.moveToFirst()'

2023-11-03

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

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

[java]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  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   在CODE上查看代码片 派生到我的代码片
  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(), nullnull);      
  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   在CODE上查看代码片 派生到我的代码片
  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, nullnullnull);    
  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.     }    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小米手机Attempt to invoke interface method 'boolean android.database.Cursor.moveToFirst()' 的相关文章

随机推荐

  • iOS17可以更新了!网友实测炫酷值拉满,但续航嘛…

    丰色 发自 凹非寺量子位 公众号 QbitAI iOS 17终于来了 今天凌晨正式推送 有数码博主评价 实用性不高 但酷炫值拉满 旺柴 可以说是一句话概括了 不过有测评发现 更新后续航掉依然的厉害 特别是iPhone XR 可得谨慎了 还登
  • 关于代理抓包,ssl pinning解决方案

    详情见我的博客小生博客 抓包 代理抓包 Fiddler charles能抓http https websocket属于应用层 优点 配置简单 抓取解析ssl方便 缺点 app对代理抓包的检测越发厉害 https http是明文传播 易被修改
  • 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用

    首先介绍下在本文出现的几个比较重要的概念 函数计算 Function Compute 函数计算是一个事件驱动的服务 通过函数计算 用户无需管理服务器等运行情况 只需编写代码并上传 函数计算准备计算资源 并以弹性伸缩的方式运行用户代码 而用户
  • ajax.request,ajaxrequest.js ajaxrequest 0.7最新版 使用AJAXRequest进行AJAX应用程序开发入门小技巧...

    使用AJAXRequest进行AJAX应用程序开发 1 初识AJAXRequest 前言 在发布了AJAXRequest类的几个版本之后 渐渐地有许多朋友用上了它 也有许多朋友问我有没有更详细的说明和示例 不过因为时间的问题以及我能想到的示
  • ClamAV 详解

    1 ClamAV介绍Clam AntiVirus是一个类UNIX系统上使用的反病毒软件包 主要应用于邮件服务器 采用多线程后台操作 可以自动升级病毒库 ClamAV是一个在命令行下查毒软件 因为它不将杀毒作为主要功能 默认只能查出您计算机内
  • 微信小程序canvas生成图片并保存

    需求 做一个类似下图的功能 图片内容是动态的 用canvas画出来 生成临时图片 再保存 实现
  • Python中的isinstance()函数

    1 描述 Python中的 isinstance 函数 是Python中的一个内置函数 用来判断一个函数是否是一个已知的类型 类似 type 2 语法 isinstance object classinfo 参数 object 实例对象 c
  • Servlet工作原理

    文章目录 一 Servlet是什么 二 相关接口 三 Servlet的工作流程 四 Servlet的生命周期 总结 一 Servlet是什么 Servlet 类是 JavaWeb 的三大组件之一 它属于动态资源 是一组 Tomcat 提供给
  • Thread的API介绍

    join 等待当前线程执行完成之后 再执行接下来的语句 如下面的例子所示 在t1线程启动完之后 调用t1 join 的方法 那么会在这里阻塞住 直到t1线程执行完之后 才会继续执行下面的语句 public class RunnableJob
  • 什么是MTTF、MTBF、MTRF?

    1 MTTF 全称是Mean Time ToFailure 即平均失效时间 系统平均能够正常运行多长时间 才发生一次故障 系统的可靠性越高 平均无故障时间越长 2 MTBF 全称是Mean Time BetweenFailure 即平均无故
  • lisp编译器_200行代码实现超轻量级编译器

    前言 本篇内容主要由 https github com jamiebuilds the super tiny compiler 中的注释翻译而来 该项目实现了一款包含编译器核心组成的极简的编译器 希望能够给想要初步了解编译过程的同学提供到一
  • 2021-02-06

    DVWA SQL Injection Blind SQL Injection SQL Injection 即SQL注入 是指攻击者通过注入恶意的SQL命令 破坏SQL查询语句的结构 从而达到执行恶意SQL语句的目的 SQL注入漏洞的危害是巨
  • Qt项目中出现的问题小结

    Qt项目中出现的问题小结 写在前面 总结这个星期自学Qt踩过的一些坑 并不包含所有问题 仅仅是基于自己所做的小界面而言 文章目录 Qt项目中出现的问题小结 1 Qt中文乱码 2 关于Qt调用vs编译的dll控件 3 关于动态链接库导出类与函
  • xss靶场挑战之旅总结

    第一关 没有做任何的过滤 我们试下 第二关 我们用 gt 有转义 参考HTML的转义 输入的 gt lt 被做了转义处理 变成了 gt lt 我们用javascript里边的oninput事件试试 我们用12 ninput alert 12
  • 利用 Redis 构建全文索引组件

    文章目录 前言 一 反向索引 二 实现代码 前言 数据库文章全文搜索中我们很少使用 like 查询 因为假设使用包含查询 我们需要对每个检索词每一篇文章的每个单词进行遍历 检索的时间复杂度则会达到 o n三次方 通常 我们会直接使用 ela
  • 线性插值方法介绍及图像缩放

    1 线性插值 设函数 y f x y f x y f x 在两点
  • NewStarCTF week5 web wp

    Give me your photo PLZ 进去后看内容 看这个文字意思应该是考的二次渲染 贴个利用代码 制作二次渲染后不会被修改的图片马 其实还可以自己比对哪块地方被修改了 然后插到没被修改的里面就行
  • git am详解

    git am详解 在使用git am前 首先要使用git am abort 用来放弃以前的am信息 否则可能会遇到这样的错误 git rebase apply still exists but mbox given 打patch git a
  • BP神经网络Matlab实现(工具箱实现、自主编程实现)

    序 BP神经网络是最常见 也是最基础的一种神经网络 网上教程颇多 但是对初学者可能会不太友好 本文打算由浅入深 先使用神经网络工具箱快速实现 然后再自己编写代码加深理解 本文使用 MATLAB 2018B 一 快速实现 1 1 背景介绍 我
  • 小米手机Attempt to invoke interface method 'boolean android.database.Cursor.moveToFirst()'

    原文 http blog csdn net iamwutianbao article details 52459509 小米手机选择了图片之后 小米机会崩掉 别的机子 啥版本都没问题 看异常信息 指示cursor moveToFirst 空