热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Android4.4中从相册选择图片并获取其路径的方法详解

在Android4.4系统中,通过使用`Intent`对象并设置动作`ACTION_GET_CONTENT`或`ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为`Intent`添加相应的类别,并处理返回的Uri以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。




?






1

2

3

4

5

6

7

8


Intent intent=new
Intent(Intent.ACTION_GET_CONTENT);//ACTION_OPEN_DOCUMENT 

intent.addCategory(Intent.CATEGORY_OPENABLE); 

intent.setType("image/jpeg"); 

if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){                 

        startActivityForResult(intent, SELECT_PIC_KITKAT);   

}else{               

        startActivityForResult(intent, SELECT_PIC);  


 





?






1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120


public static String getPath(final
Context context, final
Uri uri) { 

   

    final
boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

   

    // DocumentProvider 

    if
(isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 

        // ExternalStorageProvider 

        if
(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 

        } else
if (isDownloadsDocument(uri)) { // DownloadsProvider   

            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); 

        } else
if (isMediaDocument(uri)) {  // MediaProvider 
            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); 

        

    } else
if ("content".equalsIgnoreCase(uri.getScheme())) {  // MediaStore (and general)   

        // Return the remote address 

        if
(isGooglePhotosUri(uri)) 

            return
uri.getLastPathSegment(); 

   

        return
getDataColumn(context, uri, null, null); 

    else
if ("file".equalsIgnoreCase(uri.getScheme())) {  // File
          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 index = cursor.getColumnIndexOrThrow(column); 

            return
cursor.getString(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()); 


   

/**

 * @param uri The Uri to check.

 * @return Whether the Uri authority is Google Photos.

 */ 

public
static boolean isGooglePhotosUri(Uri uri) { 

    return
"com.google.android.apps.photos.content".equals(uri.getAuthority()); 

}

Android 4.4从图库选择图片,获取图片路径,布布扣,bubuko.com


推荐阅读
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本文详细介绍如何使用CSS自定义HTML5视频播放器的样式,涵盖常见属性及跨浏览器兼容性问题。发布时间:2020-09-14 14:46:29;来源:亿速云;阅读量:58;作者:小新。 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • Python Django大学生心理健康管理系统开发(含源码、文档)
    本项目包含完整的源代码、设计文档、数据库结构以及详细的安装指南,旨在为计算机专业的学生提供一个全面的心理健康管理系统解决方案。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
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社区 版权所有