权限拒绝:无法附加文件,文件需要导出提供程序,或 grantUriPermission(),API 29

2023-12-14

我一直在尝试从外部存储共享一张图像,但它在 API 29 中不起作用。错误消息是:权限拒绝,文件需要导出提供程序或 grantUriPermission()。当我谷歌它时,这似乎是旧版本的问题。我不知道为什么 29 API 会出现这个问题。 我已经使用了与 grantUriPermission() 相关的所有解决方案,正如您在我的方法中看到的:

private fun shareInEmail() {
    val filename = "Avoir+$timeStamp.jpg"
    val filelocation =
        File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename)
    //val path = Uri.fromFile(filelocation)
    val path: Uri = FileProvider.getUriForFile(
        requireContext(),
        context!!.applicationContext.packageName + ".provider",
        filelocation
    )

    val emailIntent = Intent(Intent.ACTION_SEND)

    //if current version is greater than 21 version
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) {
        emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

    } else if(Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {// if current version is equal to 29 version
        //grant permision for app with package to all
        val resInfoList: List<ResolveInfo> = requireContext().packageManager
            .queryIntentActivities(emailIntent, PackageManager.MATCH_DEFAULT_ONLY)
        for (resolveInfo in resInfoList) {
            val packageName: String = resolveInfo.activityInfo.packageName
            requireContext().grantUriPermission(
                packageName,
                path,
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        }
    }else {//lower versions
        val resInfoList: List<ResolveInfo> = requireContext().packageManager
            .queryIntentActivities(emailIntent, PackageManager.MATCH_DEFAULT_ONLY)
        for (resolveInfo in resInfoList) {
            val packageName: String = resolveInfo.activityInfo.packageName
            requireContext().grantUriPermission(
                packageName,
                path,
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        }
    }
    //emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    // set the type to 'email'
    emailIntent.type = "vnd.android.cursor.dir/email"
    val to = arrayOf("[email protected]")
    emailIntent.putExtra(Intent.EXTRA_EMAIL, to)
    // the attachment
    emailIntent.putExtra(Intent.EXTRA_STREAM, path)
    // the mail subject
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Transaction")

    if (emailIntent.resolveActivity(context!!.getPackageManager()) != null) {
        startActivity(Intent.createChooser(emailIntent, "Transaction"))
    }

}

我指定,如果 API 是 29,则授予权限。但仍然不起作用

用于分享我使用的内容文件提供者.

这是我的清单:

 <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

这是我的provider_paths.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external_files"
        path="." />
</paths>

这是日志:

E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.ideasfactory.mjcprojet.provider/.provider/Avoir%2B2020-06-11%2019%3A16.jpg from pid=15561, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:729)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:602)
        at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:593)
        at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:507)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:307)
        at android.os.Binder.execTransactInternal(Binder.java:1021)
        at android.os.Binder.execTransact(Binder.java:994)

我已经这样做了一段时间了,我不知道我错过了什么。我将感谢您的所有帮助。


经过几个小时的搜索,我终于找到了基于的解决方案在此输入链接描述。我必须添加以体现这一行:android:requestLegacyExternalStorage="true"使内容在版本 10、Q API 29 中可读,并且一切正常。我可以附加该文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

权限拒绝:无法附加文件,文件需要导出提供程序,或 grantUriPermission(),API 29 的相关文章

随机推荐

  • 调整 div 元素的大小

    jQuery 有resize 事件 但它只适用于窗口 jQuery window resize function What ever 这很好用 但是当我想将事件添加到 div 元素时它不起作用 E g jQuery div resize f
  • 使用Javascript或HTML,如何获取div或其他元素的高度和宽度?

    我已经尝试了一段时间 获取 网页上 div 的高度和宽度 我尝试了很多事情 其中 一些是 document getElementById header getHeight height height pixelHeight 以及所有其他 明
  • 是否可以通过firebase云消息传递中断级别(iOS)?

    尝试使用 FCM 发送推送通知POST https fcm googleapis com fcm send 是一种发送方式interruption level to aps在推送通知上 根据HTTP API 规范您可以通过以下方式提供 AP
  • LWP::UserAgent 不是线程安全的吗?

    我正在使用以下子例程运行 40 个左右的线程 my app shift my ua LWP UserAgent gt new ua gt timeout 5 my response ua gt get app watch url my ne
  • 获取 List 中不同值的列表

    在 C 中 假设我有一个名为Note具有三个字符串成员变量 public class Note public string Title public string Author public string Text 我有一个类型列表Note
  • 如何使 zsh 在 mac 10.9 上使用 python 2.7.6 而不是 Apple 预装的 2.7.5

    如何使 Mac 上的 zsh 使用 usr local bin python 中的 python 2 7 6 而不是 usr bin python 中的 python 2 7 5 无需在我要运行的脚本之前输入 usr local bin p
  • Windows 程序:如何监听命令行参数?

    我正在尝试对基于商业 Windows 的 IDE 的构建系统进行逆向工程 以便我可以使用 make 来构建我的项目 启动一个程序来执行任务 我需要知道在运行该程序时将哪些命令行参数传递给该程序 但是 Windows 进程查看器不显示命令行参
  • T-SQL 将单词拆分为字符

    我到处搜索 但在任何地方都找不到这个实现 假设我有一句话 QWERTY 我想获得这张表 Q W E R T Y Or for QWERTY AnotherWord我想获得 Q W E R T Y space character here A
  • 是什么原因导致“请求在等待太长时间而无法尝试满足您的请求后被中止”?

    是什么原因导致 请求在等待太长时间而无法尝试满足您的请求后被中止 这似乎是某种内部超时的结果 但我不知道这是在哪里配置的 我们当前正在使用自动缩放 该错误是由于任务队列中的任务数量临时增加而导致的 自动缩放不应该创建更多实例来处理该请求吗
  • 如何捕获两个标签之间的字符串

    我正在编写一个小书签以增强我的工作流程 我的部分工作是获取要放入电子邮件中的正确信息 我喜欢 JavaScript 和 jQuery 所以我正在研究一种使用这个库让我的工作更轻松的方法 我的目标是一个具有特别奇怪标记的网站 我需要捕获匹配的
  • 从 valueEventListener java 返回值

    我试图返回一个布尔值 但返回的值始终为 false 即本例中的 0 检查变量是一个实例变量 按下按钮时将调用以下函数 private boolean checkAnswerSubmission DatabaseReference answe
  • DAX、PowerBI 中的 RANKX() 问题

    我正在学习 DAX 并对 PowerBI 中的 RANKX 感到困惑 这是我的数据 这是我的措施 Rank RANKX ALL RankDemo Sub Category CALCULATE SUM RankDemo My Value 这是
  • 在类中调用 self 有什么作用?

    我注意到 Pytorch Lightning 的文档中提到 您可以通过调用从同一个类中的另一个方法调用前向方法self x 我无法找到任何有关其工作原理的信息 我一直以为你会使用调用该方法self forward 显然 它调用了forwar
  • 如何获取sql server 2005中两个日期之间的月份数

    我的 sql server 2005 表中有一个列应该保存员工的工作月数 由于我还有员工的聘用日期 因此我希望 months In Service 列成为计算列 现在如果我使用DATEDIFF month DateEngaged GETDA
  • 类模板参数推导不适用于别名模板

    考虑下面粘贴的代码 我定义了一个非常简单的类 编译器为其生成隐式推导指南 因此可以在没有显式模板参数的情况下构造它 然而 模板参数推导does not用于从简单的别名模板构造对象 该模板仅直接转发到目标类 template lt typen
  • 处理 php 中的新行

    我有 html 表单 用户可以将文本放入文本区域 我将文本区域的内容保存到MySQL数据库中 在TEXT类型的字段中 然后我在应用程序中的某个位置需要加载该文本并将其放入数组中 其中每个索引将是文本的一行
  • 如何在 CommandButton 单击时隐藏 p:panel

    我想实现这里写的东西 如何在命令按钮单击上隐藏和显示 p panel但看来 hide 不再可用 正确的做法是什么 I tried toggle 但它并没有隐藏它 我真的需要一些吗panelVisibile支持 bean 的属性和使用visi
  • 在 Numba 优化的 Python 中将类对象作为函数参数传递

    我想将一个类对象传递给一个函数 我可以让它工作 但我想知道是否有一种类型可以分配它 我有一个 最小 的例子来说明我正在尝试做的事情 spec a float64 b float64 jitclass spec class SOMETHING
  • subprocess.Popen - 没有这样的文件或目录[重复]

    这个问题在这里已经有答案了 Code import subprocess process subprocess Popen echo 5 Error Traceback most recent call last File test py
  • 权限拒绝:无法附加文件,文件需要导出提供程序,或 grantUriPermission(),API 29

    我一直在尝试从外部存储共享一张图像 但它在 API 29 中不起作用 错误消息是 权限拒绝 文件需要导出提供程序或 grantUriPermission 当我谷歌它时 这似乎是旧版本的问题 我不知道为什么 29 API 会出现这个问题 我已