当前位置: 首页 > 知识库问答 >
问题:

共享文件不需要导出提供程序,或grantUriPermission()

艾俊晖
2023-03-14

我一直在尝试解决一个问题与共享映像从外部存储目录。它在大多数设备中起作用,但在其他设备中不起作用。我有:1。添加了扩展FileProvider的类:

public class GenericFileProvider extends FileProvider {}
 <provider
            android:name=".Utils.GenericFileProvider"
            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>
 <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        tools:ignore="MissingDefaultResource">
        <external-path name="external_files" path="."/>
    </paths>

我的共享映像功能在下面:

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

    context!!.grantUriPermission(
        "com.ideasfactory.mjcprojet",
        path,
        Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
    )

    val emailIntent = Intent(Intent.ACTION_SEND)
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    // set the type to 'email'
    emailIntent.type = "vnd.android.cursor.dir/email"
    emailIntent.setType("text/plain")
    emailIntent.type = "application/jpg"
    val to = arrayOf("contact@mjclambres.fr")
    emailIntent.putExtra(Intent.EXTRA_EMAIL, to)
    emailIntent.putExtra(Intent.EXTRA_BCC, arrayOf<String>())
    // the attachment
    emailIntent.putExtra(Intent.EXTRA_STREAM, path)
    // the mail subject
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Transaction")
    emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(Intent.createChooser(emailIntent, "Transaction"))


}
E/DatabaseUtils: Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading com.ideasfactory.mjcprojet.Utils.GenericFileProvider uri content://com.ideasfactory.mjcprojet.provider/external_files/Avoir%2B2020-06-11%2011%3A08.jpg from pid=12602, 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)

我将感谢你的帮助

共有1个答案

东方乐
2023-03-14

嘿,我也遇到过同样的问题,经过大量研究,我发现问题出在provider_paths.xml.,我得到了许多不同可能性的不同路径。使用以下代码更改provider_paths.xml:

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

  <cache-path name="cache" path="." />
  <external-path name="external" path="." />

  <root-path name="root" path="." />
  <files-path name="my_images" path="/" />
  <files-path name="my_images" path="myfile/"/>
  <files-path name="files" path="." />

  <external-path name="external_files" path="." />
  <external-path name="images" path="Pictures" />
  <external-path name="my_images" path="." />
  <external-files-path name="images" path="Pictures"/>
  <external-files-path name="camera_image" path="Pictures/"/>
  <external-files-path name="external_files" path="." />
  <external-files-path name="my_images" path="my_images" />

  <external-cache-path name="external_cache" path="." />
</paths>
 类似资料:
  • 过程或函数“login”需要参数“@Abc”,但未提供该参数 4个小时的搜索和尝试,没有用我已经提供了这个参数(复制/粘贴),给程序的参数数量是相同的程序和顺序。 @Abc是一个输出参数。 存储过程定义: 调用存储过程的代码:

  • 问题内容: 我正在尝试通过调用存储过程将数据插入SQL Server数据库中,但出现错误 过程或函数“插入”期望参数“ @Emp_no”,但未提供 我的存储过程称为。我已经对其进行了彻底检查,并且没有丢失任何参数,也已经通过使用标签对其进行了检查。标签显示该值,但我不知道为什么会收到错误消息。 我的代码是 并且存储过程是 请帮我。提前致谢。 问题答案: 您需要使用: 或其他数据类型: 替换使用字符

  • 我试图捕捉图像使用相机意图并将其发送到服务器。 我遵循了官方https://developer.android.com/training/camera/photobasics 但是在使用FileProvider从filepath获取Uri时出现异常。 我有个例外 无法找到包含 /storage/emulated/0/Android/data/com.example.app/files/Pictur

  • 我对C#相当陌生,我正在尝试设置对数据库中一个存储过程的调用,该过程只接受一个参数。 我得到错误“过程或函数'SP_getName'需要参数'@username',但未提供该参数。” 当我向存储过程提供参数并通过SQL management studio运行它时,它工作正常。 然而,当我尝试调用它时,错误在于我如何传递参数,但我无法发现问题是什么。 如果您能帮我发现错误,我们将不胜感激! 我也试过

  • 我最近更改了DNS提供商,我正在尝试将DNS记录添加到我的新提供商。但是,我不确定应该添加多少记录。 我的旧名称服务器有一大堆自动创建的记录,如“ftp.example.com”、“cpanel.example.com”、“carddavs.\u tcp.example.com”、“webdisk.example.com”、“autodiscover.example.com”等。 所以我的问题是,