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

android.os.FileUriExposedExc0019: file://存储/仿真/0/test.txt通过ntent.get数据()

洪俊拔
2023-03-14

当我试图打开文件时,应用程序正在崩溃。它在Android牛轧糖下工作,但在Android牛轧糖上崩溃。只有当我试图从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.FileUriExposedExc0019: file://存储/仿真/0/test.txt通过ntent.get数据()

编辑:

针对Android Nougat时,file://URI不再被允许。我们应该使用content://uri。但是,我的应用程序需要打开根目录中的文件。有什么想法吗?

共有3个答案

楚嘉
2023-03-14

如果targetSdkVersion高于24,则使用FileProvider授予访问权限。

创建一个xml文件(路径:res\xml)提供程序\u路径。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>

在AndroidManifest.xml中添加提供程序

    <provider
        android:name="android.support.v4.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>

如果您使用的是androidx,则文件提供程序路径应为:

 android:name="androidx.core.content.FileProvider"

替换

Uri uri = Uri.fromFile(fileImagePath);

Uri uri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider",fileImagePath);

编辑:当您包含带有Intent的URI时,请确保添加以下行:

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

你可以走了。希望有帮助。

郁隐水
2023-03-14

除了使用文件提供程序的解决方案之外,还有另一种解决方法。简单地说

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

应用程序中。onCreate()。通过这种方式,虚拟机会忽略文件URIexposure。

方法

builder.detectFileUriExposure()

启用文件曝光检查,这也是未设置VmPolicy时的默认行为。

我遇到了一个问题,如果我使用内容://URI发送东西,一些应用程序就是无法理解它。并且不允许降级目标SDK版本。在这种情况下,我的解决方案很有用。

更新:

如注释中所述,StrictMode是诊断工具,不应该用于此问题。当我一年前发布这个答案时,许多应用程序只能接收文件uris。他们只是崩溃时,我试图发送一个FileProvider uri给他们。这在大多数应用程序中是固定的,所以我们应该使用FileProvider解决方案。

郑俊美
2023-03-14

如果您的targetSdkVersion

content://URI替换file://URI的步骤:

  • 添加文件提供者
<?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\u路径。xml文件夹中的文件。如果文件夹尚不存在,则可能需要创建该文件夹。该文件的内容如下所示。它描述了我们希望在根文件夹(path=“.”)中共享对外部存储的访问 名为外部_文件
<?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.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

请参考此处解释的完整代码和解决方案。

 类似资料:
  • 这是我的代码: 注销: android.os.FileUriExposed异常:文件:///存储/仿真/0/文档/SM. pdf暴露超越应用程序通过

  • 我正在用大量粒子在Python中做一个分子动力学模拟。在这里,我必须跟踪所有500个或1000个粒子的x位置,y位置,z位置,x速度,y速度,z速度,x加速度,y加速度,z加速度,x力,y力,z力,势,以及系统在每个时间间隔的动能,势能,总能量。为了保存这些数据,我目前正在以以下方式将它们写入一个文件: 所以如果有500个粒子,那么数据文件中的每一行将有7000列。这似乎不是一种保存数据的好方法。

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/airsim.md translated_sha: RETRANSLATE AirSim仿真 AirSim是一个基于虚幻引擎(Unreal Engine)的开源、跨平台无人机模拟器。它可以使用硬件在环(HITL)或软件在环(SITL)的方式为Pixh

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/hitl.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e 硬件在环仿真 硬件在环仿真指的自驾仪与仿真器相连并且所有的代码运行在自驾仪上的仿真。这种方法的优点是可以测试代码在实际处

  • Gazebo是一个自主机器人3D仿真环境。它可以与ROS配套用于完整的机器人仿真,也可以单独使用。本文简要介绍单独的使用方法。 {% raw %} To view this video please enable JavaScript, and consider upgrading to a web browser that supports HTML5 video {% endraw %} {%

  • 我试图用这个代码从手机的相机拍照: 主要活动。xml: 主要活动。爪哇: 我还将这些权限添加到清单中。xml: 但我得到了这个错误信息: android.os.文件://存储/仿真/0/图片/picFolder/1.jpg通过ClipData暴露在应用程序之外。我tem.getUri() 问题是什么?如何解决? 编辑:这是更新的代码: 主要活动: 显示: 建筑gradle(应用程序): 这是新的错