gpt4 book ai didi

android - 如何判断Uri指向的是外部存储还是内部存储?

转载 作者:行者123 更新时间:2023-11-29 01:18:51 25 4
gpt4 key购买 nike

在为 Android 开发时,我有一个 Uri,它指向用户先前选择的通知声音文件。该文件可能位于内部或外部存储设备上。是否有一种通用方法(适用于所有 API 级别)来检查此 Uri 是指向外部存储还是内部存储?

为什么我需要这个?好吧,在 Google 在 API23 中引入新的权限策略后,我遇到了以下问题。如果 Uri 指向内部存储,我的应用程序无需获得 READ_EXTERNAL_STORAGE 权限即可访问该 Uri。但是,如果 Uri 指向位于外部存储上的某个声音文件,则应用程序必须具有 READ_EXTERNAL_STORAGE 权限才能访问该文件。

所以我想根据 Uri 的来源显示不同的对话框。

最佳答案

他们把它放在 developer.android.com 的方式:

  • Internal Storage
    Store private data on the device memory.
  • External Storage
    Store public data on the shared external storage.
  • 因此内部意味着“由您的应用拥有,因此其他第三方应用无法读取”(与系统应用相反)并且将始终位于设备内存中,而外部存储 表示“所有人都可读”并存储在任何位置。

    如果您的应用以某种方式(安装或下载)导致铃声保存在内部存储中,则您不需要任何权限。

    另一方面,如果铃声在共享公共(public)内存中,您需要 READ_EXTERNAL_STORAGE 才能访问它。

    这取决于目标 SDK 以及当前 API 级别何时会要求用户授予权限:

  • 运行 5.1 或更早版本的设备:
    权限必须在安装时授予,不能撤销
  • 运行 6.0+(= API 级别 23)且目标 API 级别 22 或更低的设备:
    必须在安装时授予权限,稍后可以撤销,无 SecurityException 如果应用试图在不询问的情况下继续进行,但当然某些部分可能会失败(Content Provider 查询可能返回 null 等)
  • 运行 6.0+(= API 级别 23)且目标 API 级别 23 或更高的设备:
    权限不必在安装时授予,可以稍后撤销,应用必须请求权限,如果它在缺少权限的情况下仍尝试继续,则会遇到 SecurityException
  • 编辑使事情变得更复杂的是一种“内部”外部存储。该文档称此为“应用程序私有(private)”数据。如果查询来自第三方应用程序,则 MediaStore 内容提供者不会访问它,但它对所有持有 READ_EXTERNAL_STORAGE 权限的应用程序都是可读的。

    您的应用将始终能够访问此类存储,例如使用 ContextCompat.getExternalFilesDirs()这将返回到内置设备内存和 SD 卡(如果存在)的路径。

    但不应指望 Uri 是绝对路径(例如参见 Commonsware blog)

    相反,建议使用 ContentResolver query ,在您的情况下分别使用 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI MediaStore.Audio.Media.INTERNAL_CONTENT_URI。

    如果您从查询内部内容开始,则不需要许可。如果您没有找到该文件,它可能已被删除或 SD 卡可能已被移除。或者它存储在“公共(public)”外部存储中,如果您没有权限,您将根本无法获得任何信息......

    因此您可以检查权限状态(ContextCompat.checkSelfPermission() 如果您的目标是 API 级别 23 或更高,PermissionChecker.checkSelfPermission() 当目标是较低的 API levels),如果有权限,查询ContentResolver,根据结果显示对话框。

    关于android - 如何判断Uri指向的是外部存储还是内部存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38090362/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com