android4.4从系统图库无法加载图片的问题

2024-05-12 07:32

本文主要是介绍android4.4从系统图库无法加载图片的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

典型的使用场景就是要设置一个头像,头像需要从系统图库或者拍照获得,在android4.4之前,我用的代码没问题,但是今天使用android4.4的时候突然发现不灵了。baidu了一圈,终于解决了。 
下面是解决方案: 
Java代码   收藏代码
  1. private String[] items = new String[] { "图库","拍照" };  
  2.         /* 头像名称 */  
  3.         private static final String IMAGE_FILE_NAME = "face.jpg";  
  4.         /* 请求码 */  
  5.         private static final int IMAGE_REQUEST_CODE = 0;  
  6.         private static final int SELECT_PIC_KITKAT = 3;  
  7.         private static final int CAMERA_REQUEST_CODE = 1;  
  8.         private static final int RESULT_REQUEST_CODE = 2;  
  9.   
  10.         private void showSettingFaceDialog() {  
  11.   
  12.             new AlertDialog.Builder(this)  
  13.                     .setTitle("图片来源")  
  14.                     .setCancelable(true)  
  15.                     .setItems(items, new DialogInterface.OnClickListener() {  
  16.   
  17.                         @Override  
  18.                         public void onClick(DialogInterface dialog, int which) {  
  19.                             switch (which) {  
  20.                             case 0:// Local Image  
  21.                                 Intent intent=new Intent(Intent.ACTION_GET_CONTENT);  
  22.                                 intent.addCategory(Intent.CATEGORY_OPENABLE);  
  23.                                 intent.setType("image/*");  
  24.                                 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {  
  25.                                     startActivityForResult(intent,SELECT_PIC_KITKAT);  
  26.                                 } else {  
  27.                                     startActivityForResult(intent,IMAGE_REQUEST_CODE);  
  28.                                 }  
  29.                                 break;  
  30.                             case 1:// Take Picture  
  31.                                 Intent intentFromCapture = new Intent(  
  32.                                         MediaStore.ACTION_IMAGE_CAPTURE);  
  33.                                 // 判断存储卡是否可以用,可用进行存储  
  34.                                 if (hasSdcard()) {  
  35.                                     intentFromCapture.putExtra(  
  36.                                             MediaStore.EXTRA_OUTPUT,  
  37.                                             Uri.fromFile(new File(Environment  
  38.                                                     .getExternalStorageDirectory(),  
  39.                                                     IMAGE_FILE_NAME)));  
  40.                                 }  
  41.                                 startActivityForResult(intentFromCapture,  
  42.                                         CAMERA_REQUEST_CODE);  
  43.                                 break;  
  44.                             }  
  45.                         }  
  46.                     })  
  47.                     .setNegativeButton("取消",  
  48.                             new DialogInterface.OnClickListener() {  
  49.   
  50.                                 @Override  
  51.                                 public void onClick(DialogInterface dialog,  
  52.                                         int which) {  
  53.                                     dialog.dismiss();  
  54.                                 }  
  55.                             }).show();  
  56.   
  57.         }  
  58.   
  59.         @Override  
  60.         protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  61.             // 结果码不等于取消时候  
  62.             if (resultCode != RESULT_CANCELED) {  
  63.                 switch (requestCode) {  
  64.                 case IMAGE_REQUEST_CODE:  
  65.                     startPhotoZoom(data.getData());  
  66.                     break;  
  67.                 case SELECT_PIC_KITKAT:  
  68.                     startPhotoZoom(data.getData());  
  69.                     break;  
  70.                 case CAMERA_REQUEST_CODE:  
  71.                     if (hasSdcard()) {  
  72.                         File tempFile = new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);  
  73.                         startPhotoZoom(Uri.fromFile(tempFile));  
  74.                     } else {  
  75.                         ToastUtils.showShort(context,"未找到存储卡,无法存储照片!");  
  76.                     }  
  77.   
  78.                     break;  
  79.                 case RESULT_REQUEST_CODE:  
  80.                     if (data != null) {  
  81.                         setImageToView(data,iv_face);  
  82.                     }  
  83.                     break;  
  84.                 }  
  85.             }  
  86.             super.onActivityResult(requestCode, resultCode, data);  
  87.         }  
  88.   
  89.         /**  
  90.          * 裁剪图片方法实现  
  91.          *   
  92.          * @param uri  
  93.          */  
  94.         public void startPhotoZoom(Uri uri) {  
  95.             if (uri == null) {  
  96.                 Log.i("tag""The uri is not exist.");  
  97.                 return;  
  98.             }  
  99.               
  100.             Intent intent = new Intent("com.android.camera.action.CROP");  
  101.             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {  
  102.                 String url=getPath(context,uri);  
  103.                 intent.setDataAndType(Uri.fromFile(new File(url)), "image/*");  
  104.             }else{  
  105.                 intent.setDataAndType(uri, "image/*");  
  106.             }  
  107.               
  108.             // 设置裁剪  
  109.             intent.putExtra("crop""true");  
  110.             // aspectX aspectY 是宽高的比例  
  111.             intent.putExtra("aspectX"1);  
  112.             intent.putExtra("aspectY"1);  
  113.             // outputX outputY 是裁剪图片宽高  
  114.             intent.putExtra("outputX"200);  
  115.             intent.putExtra("outputY"200);  
  116.             intent.putExtra("return-data"true);  
  117.             startActivityForResult(intent, RESULT_REQUEST_CODE);  
  118.         }  
  119.           
  120.         /**  
  121.          * 保存裁剪之后的图片数据  
  122.          *   
  123.          * @param picdata  
  124.          */  
  125.         private void setImageToView(Intent data,ImageView imageView) {  
  126.             Bundle extras = data.getExtras();  
  127.             if (extras != null) {  
  128.                 Bitmap photo = extras.getParcelable("data");  
  129.                 Bitmap roundBitmap=ImageUtil.toRoundBitmap(photo);  
  130.                 imageView.setImageBitmap(roundBitmap);  
  131.                 saveBitmap(photo);  
  132.             }  
  133.         }  
  134.   
  135.         public void saveBitmap(Bitmap mBitmap) {  
  136.             File f = new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);  
  137.             try {  
  138.                 f.createNewFile();  
  139.                 FileOutputStream fOut = null;  
  140.                 fOut = new FileOutputStream(f);  
  141.                 mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);  
  142.                 fOut.flush();  
  143.                 fOut.close();  
  144.             } catch (FileNotFoundException e) {  
  145.                 e.printStackTrace();  
  146.             } catch (IOException e) {  
  147.                 e.printStackTrace();  
  148.             }  
  149.         }  
  150.           
  151.           
  152.         //以下是关键,原本uri返回的是file:///...来着的,android4.4返回的是content:///...  
  153.         @SuppressLint("NewApi")  
  154.         public static String getPath(final Context context, final Uri uri) {  
  155.   
  156.             final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;  
  157.   
  158.             // DocumentProvider  
  159.             if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {  
  160.                 // ExternalStorageProvider  
  161.                 if (isExternalStorageDocument(uri)) {  
  162.                     final String docId = DocumentsContract.getDocumentId(uri);  
  163.                     final String[] split = docId.split(":");  
  164.                     final String type = split[0];  
  165.   
  166.                     if ("primary".equalsIgnoreCase(type)) {  
  167.                         return Environment.getExternalStorageDirectory() + "/" + split[1];  
  168.                     }  
  169.   
  170.                 }  
  171.                 // DownloadsProvider  
  172.                 else if (isDownloadsDocument(uri)) {  
  173.                     final String id = DocumentsContract.getDocumentId(uri);  
  174.                     final Uri contentUri = ContentUris.withAppendedId(  
  175.                             Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));  
  176.   
  177.                     return getDataColumn(context, contentUri, nullnull);  
  178.                 }  
  179.                 // MediaProvider  
  180.                 else if (isMediaDocument(uri)) {  
  181.                     final String docId = DocumentsContract.getDocumentId(uri);  
  182.                     final String[] split = docId.split(":");  
  183.                     final String type = split[0];  
  184.   
  185.                     Uri contentUri = null;  
  186.                     if ("image".equals(type)) {  
  187.                         contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;  
  188.                     } else if ("video".equals(type)) {  
  189.                         contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;  
  190.                     } else if ("audio".equals(type)) {  
  191.                         contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  
  192.                     }  
  193.   
  194.                     final String selection = "_id=?";  
  195.                     final String[] selectionArgs = new String[] {  
  196.                             split[1]  
  197.                     };  
  198.   
  199.                     return getDataColumn(context, contentUri, selection, selectionArgs);  
  200.                 }  
  201.             }  
  202.             // MediaStore (and general)  
  203.             else if ("content".equalsIgnoreCase(uri.getScheme())) {  
  204.                 // Return the remote address  
  205.                 if (isGooglePhotosUri(uri))  
  206.                     return uri.getLastPathSegment();  
  207.   
  208.                 return getDataColumn(context, uri, nullnull);  
  209.             }  
  210.             // File  
  211.             else if ("file".equalsIgnoreCase(uri.getScheme())) {  
  212.                 return uri.getPath();  
  213.             }  
  214.   
  215.             return null;  
  216.         }  
  217.   
  218.         /** 
  219.          * Get the value of the data column for this Uri. This is useful for 
  220.          * MediaStore Uris, and other file-based ContentProviders. 
  221.          * 
  222.          * @param context The context. 
  223.          * @param uri The Uri to query. 
  224.          * @param selection (Optional) Filter used in the query. 
  225.          * @param selectionArgs (Optional) Selection arguments used in the query. 
  226.          * @return The value of the _data column, which is typically a file path. 
  227.          */  
  228.         public static String getDataColumn(Context context, Uri uri, String selection,  
  229.                 String[] selectionArgs) {  
  230.   
  231.             Cursor cursor = null;  
  232.             final String column = "_data";  
  233.             final String[] projection = {  
  234.                     column  
  235.             };  
  236.   
  237.             try {  
  238.                 cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,  
  239.                         null);  
  240.                 if (cursor != null && cursor.moveToFirst()) {  
  241.                     final int index = cursor.getColumnIndexOrThrow(column);  
  242.                     return cursor.getString(index);  
  243.                 }  
  244.             } finally {  
  245.                 if (cursor != null)  
  246.                     cursor.close();  
  247.             }  
  248.             return null;  
  249.         }  
  250.   
  251.   
  252.         /** 
  253.          * @param uri The Uri to check. 
  254.          * @return Whether the Uri authority is ExternalStorageProvider. 
  255.          */  
  256.         public static boolean isExternalStorageDocument(Uri uri) {  
  257.             return "com.android.externalstorage.documents".equals(uri.getAuthority());  
  258.         }  
  259.   
  260.         /** 
  261.          * @param uri The Uri to check. 
  262.          * @return Whether the Uri authority is DownloadsProvider. 
  263.          */  
  264.         public static boolean isDownloadsDocument(Uri uri) {  
  265.             return "com.android.providers.downloads.documents".equals(uri.getAuthority());  
  266.         }  
  267.   
  268.         /** 
  269.          * @param uri The Uri to check. 
  270.          * @return Whether the Uri authority is MediaProvider. 
  271.          */  
  272.         public static boolean isMediaDocument(Uri uri) {  
  273.             return "com.android.providers.media.documents".equals(uri.getAuthority());  
  274.         }  
  275.   
  276.         /** 
  277.          * @param uri The Uri to check. 
  278.          * @return Whether the Uri authority is Google Photos. 
  279.          */  
  280.         public static boolean isGooglePhotosUri(Uri uri) {  
  281.             return "com.google.android.apps.photos.content".equals(uri.getAuthority());  
  282.         }  


最后只需要在需要的地方调用showSettingFaceDialog()就可以了。 

如果要获得剪裁的图片保存路径,然后上传,我这边是这样处理的(这里每个人的写法不一样): 
但只要获得filePath就可以根据自己的需求处理了 
Java代码   收藏代码
  1. private void uploadFace(){  
  2.         File file = new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);  
  3.         String filePath=file.getAbsolutePath();  
  4.           
  5.         Log.i("tag""filePath="+filePath);  
  6.         HttpHelper.uploadFileWithConcatUrl(context,HttpHelper.UPDATE_USER_ICON,App.user.getUser_session_key() ,filePath ,new HttpHelper.OnFileUploadListener(){  
  7.   
  8.                 @Override  
  9.                 public void onFileUploadSuccess(String orignUrl, String midImgUrl,  
  10.                         String smallImgUrl) {  
  11.                     // TODO Auto-generated method stub  
  12.                       
  13.                     App.user.setHead_icon(orignUrl);  
  14.                       
  15.                     saveUser();  
  16.                 }  
  17.                    
  18.         });  
  19.     }  

这篇关于android4.4从系统图库无法加载图片的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981985

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监