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

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


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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • span或者input的disabled(小技巧)

    span或者input的disabled(小技巧)

    2021年8月1日
  • 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑的键盘灯怎么开[通俗易懂]

    联想笔记本电脑键盘灯怎么开启_联想笔记本电脑的键盘灯怎么开[通俗易懂]展开全部1、联想笔记本部分型号具备键盘背32313133353236313431303231363533e4b893e5b19e31333431336664光功能,方法通过“FN+空格”打开,支持此功能的机型,键盘上有相应标示。部分早期的Thinkpad笔记本电脑若带有键盘灯,需要通过“Fn+PageUp”组合键开启。发现电脑键盘的“Space(空格键)”按键上有下图所示的标识符号电脑一般带有键…

    2022年9月20日
  • phpstorm运行thinkphp_零基础入门编程教程

    phpstorm运行thinkphp_零基础入门编程教程PHPStorm是流行对PHP及前端开发IDE,在开发者初次使用写PHP代码时该怎么用呢~1、CreateNewProject2、选择PHPEmptyProject,并新建一个空目录(目录不要放在C盘!!!)3、项目工程中,中刚刚创建对文件夹图标上,点击右键,选择PHPFile,输入文件名,即可创建4、输入完成php代码,点击空白处,右上角会出现chrome、firefox等浏览器的图…

    2022年10月2日
  • iterator迭代器详解_c++迭代器iterator

    iterator迭代器详解_c++迭代器iterator迭代器 Iterator动机模式定义实例结构要点总结笔记动机在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象.我们希望在不暴露其内部结构地同时.可以让外部客户代码透明地访问其中包含地元素;同时这种”透明遍历”也为”同一种算法在多种集合对象上进行操作”提供了可能.使用面向对象技术将这种便利机制抽象为”迭代对象”为”应对变化中地集合对象”提供了一种优雅地方式模式定义提供了一种方法顺序访问一个聚合对象中地各个元素,而又不暴露(稳定)该对象地内部表示.实例结构要点总结迭代抽象

    2022年8月11日
  • strtoul函数的使用

    strtoul函数的使用函数原型:参数1:字符串起始地址参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa

    2022年8月1日
  • 宝塔安装mysql失败_手机如何卸载宝塔防火墙

    宝塔安装mysql失败_手机如何卸载宝塔防火墙先用宝塔自带卸载宝塔软件环境默认是不卸载得mysql先停止服务,再删除服务apache先停止服务,再删除服务然后安装新的宝塔即可

    2022年9月6日

发表回复

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

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