android 从相册选取图片在小米手机报错的解决办法

news/2024/11/13 3:30:46/

在跳转到系统相册选取照片的时候,用如下代码跳转:

        Intent albumIntent = new Intent(Intent.ACTION_PICK, null);/*** 下面这句话,与其它方式写是一样的效果,如果:* intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);* intent.setType(""image/*");设置数据类型* 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"*/albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");startActivityForResult(albumIntent, CHOOSE_BIG_PICTURE);

之后在onActivityResult里拿到回调的里,通过:

Uri uri = data.getData();

拿到了Uri,从而用cursor在数据库里查询真实路径,但是查询到的真实路径在我的红米Note4X上是用不了的,别的机型还没测,但在我的三星手机上真实 路径是可以用的,解决办法如下,通过一个工具类来查询真实路径:

public class GetPathFromUri4kitkat {/*** 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使*/@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];}// TODO handle non-primary volumes}// 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 getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}/*** Get the value of the data column for this Uri. This is useful for* MediaStore Uris, and other file-based ContentProviders.* * @param context*            The context.* @param uri*            The Uri to query.* @param selection*            (Optional) Filter used in the query.* @param selectionArgs*            (Optional) Selection arguments used in the query.* @return The value of the _data column, which is typically a file path.*/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 column_index = cursor.getColumnIndexOrThrow(column);return cursor.getString(column_index);}} finally {if (cursor != null)cursor.close();}return null;}/*** @param uri*            The Uri to check.* @return Whether the Uri authority is ExternalStorageProvider.*/public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/*** @param uri*            The Uri to check.* @return Whether the Uri authority is DownloadsProvider.*/public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/*** @param uri*            The Uri to check.* @return Whether the Uri authority is MediaProvider.*/public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}
}

直接把这个工具类拿去用就可以,使用方法,在onActivityForResult里面:

 String path= GetPathFromUri4kitkat.getPath(context,data.getData());

这个path就是最终的图片路径


http://www.ppmy.cn/news/505840.html

相关文章

小米r1d安装php,小米路由器 一键安装LLM教程

摘 要 原标题:"小米路由器玩法:一键安装LLMP 建自己的网站"的相关路由192.168.1.1登录设置教程。来源 - 191路由网。 插件安装:需开启SSH,一键安装,方便简单。 LLMP介绍LLMP(Linux " 原标题&#xff1a…

android调用系统图片剪裁,兼容小米

public void cropPhoto(Uri uri) {Intent intent new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// crop为true是设置在开启的intent中设置显示的view可以剪裁intent.putExtra("crop", "true"…

小米12X值不值得入手 小米12X性能强不强

小米12X虽然推出许久,但在配置上已久十分强大,可以说是不错的中高端机型,那么,小米12X值不值得入手? 小米12X性能强不强?下面就一起来看看吧。 小米12X性能强不强 屏幕方面 小米12X也是一款小尺寸旗舰,该机正面配…

小米6 刷LineageOS教程

在刷机前确保已解锁手机bootloader引导程序,解锁教程转载自 https://www.jianshu.com/p/f77b464d9a00 1.下载lineageOS的.zip刷机包和recovery.img 下载地址 https://download.lineageos.org/sagit 2.刷recovery.img 1)执行adb reboot bootloader,设备…

完美解决小米6x没有busybox的方法

完美解决小米6x没有BusyBox的方法。 BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称…

小米手机运行linux,小米6成功刷入UOS国产操作系统,可开机运行

喜欢数码的小伙伴,对于手机刷机换系统一定很感兴趣吧!今日有消息称小米6已经可以成功的刷入UOS国产操作系统(国产Linux发行版)。更多信息一起和XDA小编看看吧! 小米6成功刷入UOS国产操作系统 在今日,深度操作系统官方晒出图片&…

小米5x 运行linux,【教程】简述小米5X刷入Lineage OS及刷入体验

先把Lineage OS包的官方下载链接给大家 官方显示为小米A1的包,不用管他,小米A1就是小米5X 给一个适配的twrp 提取码:15c7 刷入方法跟流星的很多教程类似,不详细描述了 可以安装面具 没有什么问题的话,用twrp刷入zip格式…

C++静态对象的移动问题

7.1返回普通的静态对象 MyString func(const char* p) {static MyString tmp(p);return tmp; } int main() {MyString s1("hello");s1func("helloworld");s1.Print();MyString s2;s2func("hello");s2.Print();return 0; } 结果: 进…