- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
当我尝试打开文件时,应用程序崩溃了。它在 Android Nougat 下工作,但在 Android Nougat 上它会崩溃。只有当我尝试从 SD 卡而不是系统分区打开文件时,它才会崩溃。一些权限问题?
示例代码:
File file = new File("/storage/emulated/0/test.txt");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "text/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // Crashes on this line
日志:
android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()
编辑:
针对 Android Nougat 时,不再允许使用 file://
URI。我们应该改用 content://
URI。但是,我的应用程序需要在根目录中打开文件。有什么想法吗?
最佳答案
如果您的 targetSdkVersion >= 24
, 那么我们必须使用 FileProvider
类以授予对特定文件或文件夹的访问权限,以使其他应用程序可以访问它们。我们创建自己的类继承 FileProvider
为了确保我们的 FileProvider 不会与在导入的依赖项中声明的 FileProvider 冲突,如 here 所述.
更换步骤file://
带有 content://
的 URI网址:
<provider>
标记 AndroidManifest.xml
在 <application>
下标签。为 android:authorities
指定唯一权限属性以避免冲突,导入的依赖项可能会指定 ${applicationId}.provider
和其他常用的权威机构。<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<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>
</application>
</manifest>
provider_paths.xml
文件在 res/xml
文件夹。如果文件夹尚不存在,则可能需要创建它。该文件的内容如下所示。它描述了我们希望共享对根文件夹 (path=".")
的外部存储的访问权限。名称为 external_files。<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>
最后一步是更改下面的代码行
Uri photoURI = Uri.fromFile(createImageFile());
到
Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());
编辑:如果您使用 Intent 让系统打开您的文件,您可能需要添加以下代码行:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
请引用已解释的完整代码及解决方案here.
关于android.os.FileUriExposedException : file:///storage/emulated/0/test. txt 通过 Intent.getData() 暴露在应用程序之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38200282/
需要你的帮助。我正在编写一个简单的应用程序来拍照并将它们保存在智能手机的内部存储器中,因为我没有外部 microSD。当我运行应用程序并点击拍照按钮时,它崩溃了。我该如何处理?提前谢谢你。以下是监控结
我正在尝试共享一个文本文件。我已经按照所有必需的步骤使用 FileProvider 共享文件 >=Nougat 但仍然收到 FileUriExposedException : Fatal Except
当文件名不包含阿拉伯语或 unicode 字符时,我不会得到异常 这是共享文件的代码: Intent intent = new Intent(Intent.ACTION_SEND); Uri file
这个问题在这里已经有了答案: android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyo
作为前言,我熟悉编码(高中 2 年),但对于 Android Studio(以及一般而言的 Java)完全是新手。我一直在寻找问题的解决方案,但由于我缺乏经验,我不知道如何在我的项目中实现这些解决方案
在 Nougat 以下的安卓设备上,我可以毫无问题地将图像保存在设备的外部存储器中,然后存储文件路径并使用 Picasso 显示图像。 . 但是,在 Nougat 设备上进行测试时,每当我启动相机 I
我尝试打开本地 pdf,但由于以下异常而无法打开:android.os.FileUriExposedException: file:///storage/emulated/0/appid/1438-9
这个问题在这里已经有了答案: android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyo
这个问题在这里已经有了答案: android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyon
我想打开PDF,它在interaly保存在app/assets/pdf_name.pdf 我使用File f = new File(getContext().getCacheDir() +/pdf_n
我使用此代码从相机获取图片并将其放在 imageview 上: private void openCamera() { mMediaUri =getOutputMediaFileUri(M
这个问题在这里已经有了答案: android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyo
在针对 Android API = 24 为目标,该代码产生了这个问题的主题错误。 我努力在 Delphi Use android fileprovider to send intent to ope
我尝试做一个按钮来打开相机并拍照。我的代码在这里 //for imports check on bottom of this code block public class HomeProfileAc
当我尝试打开文件时,应用程序崩溃了。它在 Android Nougat 下运行,但在 Android Nougat 上它崩溃了。它仅在我尝试从 SD 卡而不是系统分区打开文件时崩溃。一些权限问题? 示
当我尝试打开文件时,应用程序崩溃了。它在 Android Nougat 下工作,但在 Android Nougat 上它会崩溃。只有当我尝试从 SD 卡而不是系统分区打开文件时,它才会崩溃。一些权限问
我正在尝试使用以下代码从手机相机拍照: activity_main.xml: MainActivity.java: public class CameraDemoActivity ex
这是我的代码: private void createPdf() { File docsFolder = new File(Environment.getExternalStorageDire
我是一名优秀的程序员,十分优秀!