热门标签 | 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


推荐阅读
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 通过 NuGet 获取最新版本的 Rafy 框架及其详细文档
    为了帮助开发者更便捷地使用Rafy领域实体框架,我们已将最新版的Rafy框架程序集上传至nuget.org,并同步发布了最新版本的Rafy SDK至Visual Studio。此外,我们还提供了详尽的文档和示例,以确保开发者能够快速上手并充分利用该框架的强大功能。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 在Oracle数据库中,若需更新特定列的数据,可以通过联接两张表来实现。例如,假设我们有两张表:`sales` 和 `goods`。为了更新 `sales` 表中的某些列,可以使用 `UPDATE` 语句结合 `JOIN` 操作,确保数据的准确性和一致性。具体操作步骤包括选择需要更新的目标列,定义联接条件,并指定更新后的值。这种方法不仅提高了数据处理的效率,还保证了数据的完整性。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文详细介绍了 Windows API 中的按钮控件及其应用实例。主要功能包括:1. `CheckDlgButton` 用于更改对话框中按钮的选中状态;2. `CheckRadioButton` 用于设置单选按钮的选中状态。此外,还探讨了按钮控件在实际开发中的多种应用场景,帮助开发者更好地理解和使用这些功能。 ... [详细]
  • 在学习LVM(逻辑卷管理)技术的过程中,我对MD(多设备)、DM(设备映射器)以及逻辑设备和RAID的实现有了深入的理解。LVM2架构主要由DM主模块及其多个子模块组成,其中linear子模块用于创建线性设备,类似于简单的磁盘分区拼接。此外,还探讨了其他子模块如striped、mirror等在提高性能和数据冗余方面的应用。通过实际操作,我掌握了LVM的基本配置和管理方法,能够灵活应对不同存储需求。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 利用C#技术实现Word文档的动态生成与编辑
    本文通过一个简单的示例,介绍了如何使用C#语言实现Word文档的动态生成与编辑功能。文章详细阐述了在项目中引用Word动态库的方法,并通过具体代码示例展示了如何创建和操作Word表格。此内容旨在为初学者提供参考和学习资料,欢迎读者提出宝贵意见和建议。 ... [详细]
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社区 版权所有