如何从 URI 获取完整文件路径

2024-01-02

我想从 URI 获取完整的文件路径。 URI 不是图像,而是音乐文件,但如果我像 MediaStore 解决方案那样执行此操作,则如果应用程序用户选择 Astro 作为浏览器而不是音乐播放器,它将无法工作。我该如何解决这个问题?


PathUtil 方法仅在下面的 oreo 中工作,如果是 oreo 则可能会崩溃,因为在 oreo 中我们不会获得 id,而是 data.getData() 中的整个路径,因此您需要做的就是创建一个文件从 uri 并从 getPath() 获取其路径并拆分它。下面是工作代码:-

Uri uri = data.getData(); 
File file = new File(uri.getPath());//create path from uri
final String[] split = file.getPath().split(":");//split the path.
filePath = split[1];//assign it to a string(your choice).

上面的代码将在 oreo 中运行,如果它低于 oreo,则 PathUtil 将运行。谢谢!

String filePath=PathUtil.getPath(context,yourURI);

路径实用程序.java

import android.annotation.SuppressLint; 
import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Environment; 
import android.provider.DocumentsContract;
import android.provider.MediaStore;

import java.net.URISyntaxException;

/**
 * Created by Aki on 1/7/2017.
 */

public class PathUtil {
    /*
     * Gets the file path of the given Uri.
     */
    @SuppressLint("NewApi")
    public static String getPath(Context context, Uri uri) throws URISyntaxException {
        final boolean needToCheckUri = Build.VERSION.SDK_INT >= 19;
        String selection = null;
        String[] selectionArgs = null;
        // Uri is different in versions after KITKAT (Android 4.4), we need to
        // deal with different Uris.
        if (needToCheckUri && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            } else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                uri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
            } else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("image".equals(type)) {
                    uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                selection = "_id=?";
                selectionArgs = new String[]{ split[1] };
            }
        }
        if ("content".equalsIgnoreCase(uri.getScheme())) {
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (cursor.moveToFirst()) {
                    return cursor.getString(column_index);
                }
            } catch (Exception e) {
            }
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        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());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 URI 获取完整文件路径 的相关文章

  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 使用 Android 前台服务为 MediaPlayer 创建通知

    问题就在这里 我目前正在开发一个应用程序 该应用程序必须提供 A 广播播放器 来自 URL 的 AAC 直播 还有一个播客播放器 来自 URL 的 MP3 流 该应用程序必须能够在后台运行 Android 服务 并通过以下方式向用户公开持续
  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • 设置从 Facebook 登录获取用户电子邮件 ID 的权限

    我在用着Facebook 3 0 SDK对于安卓 我必须实施Facebook登录 我正在访问用户的基本信息 例如姓名 用户 ID 但我也想访问用户的电子邮件 我浏览了很多博客和论坛 但不知道该怎么做 我正在使用我自己的 android 按钮
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • 在 Google Analytics 中跟踪应用程序版本

    我正在使用谷歌分析模块 https marketplace appcelerator com apps 5081 2014113336 https marketplace appcelerator com apps 5081 2014113
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • Android - 将 ImageView 保存到具有全分辨率图像的文件

    我将图像放入 ImageView 中 并实现了多点触控来调整 ImageView 中的图像大小和移动图像 现在我需要将调整大小的图像保存到图像文件中 我已经尝试过 getDrawingCache 但该图像具有 ImageView 的大小 我
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥

随机推荐

  • 使用 antd 隐藏表的列

    我们如何隐藏表中的列以在前端显示 而该列已经存在于使用 ant design 表的数组中 例如 我的数组对象中有一个名为 ID 的列 但不需要在表视图中显示 它应该保留在 JSON 列表本身中以供参考 小提琴链接 https codesan
  • 如何在 Vim 中将另一个文件的内容加载到当前文件?

    如标题 有什么方便的方法吗 我特别需要它来进行一些 cvs git commit 或 sendmail 来加载模板注释 我认为这是一个vi环境 而不是Vim 在 VIM 命令提示符下 read new file 或简称 r new file
  • 使用非接口的构造函数参数进行依赖注入

    我仍然是 DI 的新手 我正在尝试了解我是否以错误的方式思考问题 当我想要表示一个依赖于 IRandomProvider 的 Die 对象时 我正在解决一个玩具问题 该界面很简单 public interface IRandomProvid
  • 如何限制 on_message 回复(Discord Python 机器人)

    我正在制作一个 Discord 机器人 它可以执行各种操作 包括对提到该机器人的人做出反应 以及对某些用户在某个频道中所说的话做出反应 我的代码 为了清楚起见缩短 是 BOT os getenv DISCORD BOT MENTION CH
  • 由于 git pull in git 2.29,VScode git 同步被破坏

    对于 git 2 29 及更高版本 git pull 会出现此问题如何处理这个 git 警告 不鼓励在不指定如何协调不同分支的情况下进行拉取 https stackoverflow com questions 62653114 how to
  • 如何知道何时使用 numpy.linalg 而不是 scipy.linalg?

    公认的智慧是更喜欢scipy linalg over numpy linalg功能 为了进行线性代数 理想情况下 并且方便地 我想结合以下功能numpy array and scipy linalg不曾期待numpy linalg 这并不总
  • printf/sprintf 编译器警告是概念上的破坏吗?

    我注意到 当 printf sprintf 函数的格式字符串中的转换说明符与相应参数的类型或计数不匹配时 大量 C 编译器会发出警告 在我看来 这似乎是一个概念上的突破 因为根据语言规范 C 没有内置函数 编译器应该了解 printf sp
  • 我怎样才能链接我的非常大的程序?

    我们的下一个产品已经变得太大 无法链接到运行 32 位 Windows 的计算机上 所有 lib 文件的总和超过 2Gb 只能在 64 位 Windows 计算机上链接 最终我们将超越这个界限 因为我们的软件往往会增长而不是收缩 而且我们使
  • 带有文本和图像的按钮 (Android)

    我想创建一个带有图像和文本的 android 按钮 但文本会自动居中 如何将文本放置在按钮底部 我知道我可以使用相对布局在图像下方放置第二个文本按钮 但我更喜欢最小化代码 您可以在按钮上声明要分配图像的位置 我假设您已经在按钮上有了图像
  • 将 get 访问器主体克隆/复制为新类型

    我正在从现有类型的动态装配中创建新类型 但仅包含选定的属性 public class EmitTest public Type Create Type prototype Type dynamicBaseType List
  • 从 JavaScript/jQuery 将数组发送到 php [重复]

    这个问题在这里已经有答案了 可能的重复 将数据数组从 php 发送到 javascript https stackoverflow com questions 4290720 send arrays of data from php to
  • 循环访问 VB Web App 中的文本框

    这类问题有几个答案 但对我来说都不是很清楚 而且我没有使用 JQuery 的经验 所以我在这里问 我有一个 VB Web 应用程序 在 Default aspx 中包含一堆文本框 使用 Visual Web Designer 2010 Ex
  • StackExchange.Redis 超时 GET

    我在使用 StackExchange Redis 时遇到超时问题 我已经尝试过在 stackoverflow 上找到的所有内容 这是我得到的 Timeout performing GET XXX inst 4 mgr ProcessRead
  • 无法在单例中创建某些 QML 类型

    我有一个用于样式定义的 QML 单例 定义如下 pragma Singleton import QtQuick 2 2 import QtQuick Controls 1 1 import QtQuick Controls Styles 1
  • Angular4 为存在且公开提供的 json 数据提供 404

    我有一个用 Angular4 编写的测试数据服务 目前看起来是这样的 import Injectable from angular core import Http from angular http import rxjs add ope
  • 如何右对齐内联块元素?

    正如您在下面的 Fiddle 中看到的 http jsfiddle net EvWc4 3 http jsfiddle net EvWc4 3 我目前正在寻找一种方法将第二个链接 link alt 与其父链接 p 的右侧对齐 为什么不使用浮
  • Facebook 图形 API 速率限制和批量请求

    我见过一些人提到的 600 次调用 600 秒的速率限制 例如quora http www quora com Whats the Facebook Open Graph API rate limit 我想知道我是否可以做600batch
  • Flutter 音频播放器返回错误的播放时间?

    我在用着audioplayers 1 1 0从 url 播放音频的插件 玩得很好 但是player onPositionChanged在特定的秒数之后 它会重新启动 并且计时器从 0 开始 这样我的滑块又从 0 开始了 player onP
  • 启动画面在 PhoneGap Build 中不起作用

    无论是 Android 还是 iOS 我都无法让闪屏正常工作 我正在使用 PhoneGap Build 并且我已经像这样设置了 config xml 现在适用于 v3 0 0
  • 如何从 URI 获取完整文件路径

    我想从 URI 获取完整的文件路径 URI 不是图像 而是音乐文件 但如果我像 MediaStore 解决方案那样执行此操作 则如果应用程序用户选择 Astro 作为浏览器而不是音乐播放器 它将无法工作 我该如何解决这个问题 PathUti