当我试图打开文件时,应用程序正在崩溃。它在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。但是,我的应用程序需要打开根目录中的文件。有什么想法吗?
如果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);
你可以走了。希望有帮助。
除了使用文件提供程序的解决方案之外,还有另一种解决方法。简单地说
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
在
应用程序中。onCreate()
。通过这种方式,虚拟机会忽略文件URI
exposure。
方法
builder.detectFileUriExposure()
启用文件曝光检查,这也是未设置VmPolicy时的默认行为。
我遇到了一个问题,如果我使用
内容://
URI
发送东西,一些应用程序就是无法理解它。并且不允许降级目标SDK
版本。在这种情况下,我的解决方案很有用。
更新:
如注释中所述,StrictMode是诊断工具,不应该用于此问题。当我一年前发布这个答案时,许多应用程序只能接收文件uris。他们只是崩溃时,我试图发送一个FileProvider uri给他们。这在大多数应用程序中是固定的,所以我们应该使用FileProvider解决方案。
如果您的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暴露超越应用程序通过
我试图用这个代码从手机的相机拍照: 主要活动。xml: 主要活动。爪哇: 我还将这些权限添加到清单中。xml: 但我得到了这个错误信息: android.os.文件://存储/仿真/0/图片/picFolder/1.jpg通过ClipData暴露在应用程序之外。我tem.getUri() 问题是什么?如何解决? 编辑:这是更新的代码: 主要活动: 显示: 建筑gradle(应用程序): 这是新的错
我正在用大量粒子在Python中做一个分子动力学模拟。在这里,我必须跟踪所有500个或1000个粒子的x位置,y位置,z位置,x速度,y速度,z速度,x加速度,y加速度,z加速度,x力,y力,z力,势,以及系统在每个时间间隔的动能,势能,总能量。为了保存这些数据,我目前正在以以下方式将它们写入一个文件: 所以如果有500个粒子,那么数据文件中的每一行将有7000列。这似乎不是一种保存数据的好方法。
我正在尝试在Android 8 API Level 26 emulator上运行Xamarin Android应用程序。当我试图将日志写入文件时,这是一个例外。 例外: 系统UnauthorizedAccessException:对路径“/storage/emulated/0/abc.txt”的访问被拒绝 代码: 我也给了和权限。 目标Android版本:Android8.0 API级别26 Or
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 硬件在环仿真 硬件在环仿真指的自驾仪与仿真器相连并且所有的代码运行在自驾仪上的仿真。这种方法的优点是可以测试代码在实际处