android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]

android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]一.获得图片路径当我们通过Intent打开相册,获取图片后,在onActivityResult回调中会得到图片的Uri。但是Uri无法直接获得图片的路径。如果你曾经直接操作过android里的数据库的话,应该明白,Uri可以通过ContentResolver获得数据库表里的数据。例如:content://com.android.providers.media.documents/document/…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一.获得图片路径

当我们通过Intent打开相册,获取图片后,在onActivityResult回调中会得到图片的Uri。

但是Uri无法直接获得图片的路径。如果你曾经直接操作过android里的数据库的话,应该明白,Uri可以通过ContentResolver获得数据库表里的数据。

例如:

content://com.android.providers.media.documents/document/image:38

content:// 代表scheme

com.android.providers.media.documents 代表authority

document/image:38 代表path

由于打开图片获取的Uri会有不同的类型,所以需要通过不同的方法获取

private String getImagePath(Uri uri, String selection) {

String path = null;

Cursor cursor = getContentResolver().query(uri, null, selection, null, null);

if (cursor != null) {

if (cursor.moveToFirst()) {

path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));

}

cursor.close();

}

return path;

}

private String Uri2Path(Uri uri) {

String imagePath = null;

if (DocumentsContract.isDocumentUri(this, uri)) {

String docId = DocumentsContract.getDocumentId(uri);

if (“com.android.providers.media.documents”.equals(uri.getAuthority())) {

//Log.d(TAG, uri.toString());

String id = docId.split(“:”)[1];

String selection = MediaStore.Images.Media._ID + “=” + id;

imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);

} else if (“com.android.providers.downloads.documents”.equals(uri.getAuthority())) {

//Log.d(TAG, uri.toString());

Uri contentUri = ContentUris.withAppendedId(

Uri.parse(“content://downloads/public_downloads”),

Long.valueOf(docId));

imagePath = getImagePath(contentUri, null);

}

} else if (“content”.equalsIgnoreCase(uri.getScheme())) {

//Log.d(TAG, “content: ” + uri.toString());

imagePath = getImagePath(uri, null);

}

return imagePath;

}

二.运行时权限获取

由于需要进行文件的读取操作,所以需要获取相关权限。而在23及以上的手机上需要动态获取权限,所以只是进行上面的操作会显示错误。

首先我们需要在manifast清单中加入权限

android.permission.WRITE_EXTERNAL_STORAGE

当然,Read也是可以的,毕竟我们只是读取文件。

然后在java文件中,我们首先需要检测是否获得了权限,如果没有,再请求。

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){

int isPermitted=ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (isPermitted!=PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

}

}

然后在onRequestPermissionsResult中可以获得结果。

参考:

https://www.jianshu.com/p/f9a63fcc0b91

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190703.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月15日 下午5:22
下一篇 2026年2月15日 下午6:01


相关推荐

  • C++模板、类模板、函数模板详解都在这里了

    C++模板、类模板、函数模板详解都在这里了C 模板 类模板 函数模板详解一 引言二 函数模板 1 定义 2 调用 3 多个虚类型三 类模板 1 定义 2 调用四 类的函数模板五 类作为数据类型传入六 类模板与继承七 类模板与友元一 引言在写排序算法时 如果要写一个交换两个数据的函数 由于基本数据类型有 int float double 等等类型 所以针对每种数据类型可能我们要写很多 swap 函数 这些函数除了传入的数据类型不同 函数体结构大致相同

    2026年3月19日
    1
  • 缠中说禅电子书_缠中说禅108课PDF电子书

    缠中说禅电子书_缠中说禅108课PDF电子书缠中说禅 教全班人炒股票 108 课 是炒股册本 作者为缠中说禅 由科学身手文献出版社出版 此书告急介绍怎么从瞬息万变的股市中看清事势 获得利润 该篇阐明 课程 72 是缠中途禅为了容易厥后者纯熟拟订的一个懒人线途图操演计划 教你炒股票 72 本 ID 已有课程的再梳理 该篇阐发 中央是分级其余 大级别总是由小级别渐渐兴盛出来的 那么最幼级别中央又是怎样被最闭理的构造出来呢 该篇即是主题表面不得不学的底子课

    2026年3月20日
    2
  • jdbc 事务

    jdbc 事务

    2021年10月3日
    46
  • DoS攻击防范_防dos攻击

    DoS攻击防范_防dos攻击利用扩展模块limit,我们还可以配置iptables规则,实现DoS攻击防范:iptables-AINPUT-ptcp–dport80-mlimit–limit25/minute–limit-burst100-jACCEPT–litmit25/minute指示每分钟限制最大连接数为25–litmit-burst100指示当总连接数超过100时,启动…

    2026年4月20日
    4
  • stringstream的用法如何会出现-1为ffff的情况_string读取文件指定长度

    stringstream的用法如何会出现-1为ffff的情况_string读取文件指定长度【本文来自】http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/10/27823.html使用stringstream对象简化类型转换C++标准库中的提供了比ANSIC的更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库

    2022年5月3日
    73
  • 【n8n 入门系列】10 分钟部署 n8n,手把手教你搭第一个自动化工作流,小白可学!

    【n8n 入门系列】10 分钟部署 n8n,手把手教你搭第一个自动化工作流,小白可学!

    2026年3月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号