热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

转载http:gundumw100.iteye.comblog2158345,非常感谢!典型的使用场景就是要设置一个头像,头像需要从系统图库或者


转载http://gundumw100.iteye.com/blog/2158345,非常感谢!

典型的使用场景就是要设置一个头像,头像需要从系统图库或者拍照获得,在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.     }  

推荐阅读
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
author-avatar
夜灬哭味
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有