使用FileProvider Android从可移动SD卡打开文件时出错

问题描述

我的目标是从任何内存中打开pdf文件

我使用具有设备内存和可移动SD卡的android仿真器。

所以路径看起来像:

/storage/emulated/0/hts221.pdf -设备内存

/storage/1317-231C/LPS22HB.pdf -可移动SD卡

使用此代码打开文件(其中fileName是以上两个文件之一):

 File file = new File(fileName);
 Intent target = new Intent(Intent.ACTION_VIEW);
 Uri fileURI = FileProvider.getUriForFile(context,context.getApplicationContext().getPackageName() + ".provider",file);
 target.setDataAndType(fileURI,"application/pdf");
 target.setFlags(target.getFlags() | Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION );
 Intent intent = Intent.createChooser(target,"Open File");
 context.startActivity(intent);

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>

xml / provier_path

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

问题:

当我尝试从设备内存中打开pdf文件(/storage/emulated/0/hts221.pdf)时-一切正常。

但是,当我尝试从SD卡打开pdf文件(/storage/1317-231C/LPS22HB.pdf)时-应用程序崩溃

W System.err: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/1317-231C/LPS22HB.pdf
W System.err:   at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
W System.err:   at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)

在这里想念什么?我猜问题出在xml / provier_path中。

我使用的是Qt Android,但在这种情况下,我认为这并不重要。

解决方法

已添加

 <root-path name="root" path="." />

到xml / provider_path。而且两个文件现在都可以正常工作。

,

FileProvider无法提供可移动Micro SD卡中的文件。

如果您想从可移动Micro SD卡提供文件,请扩展ContentProvider来实现。

很难相信root-path可以解决问题,但我会尽快检查。

更新:确实可以。在android 11上,Android /数据仍然保持关闭状态。

很棒的发现! (我想我以前看过但忘了。嗯...所有问题和答案都是重复的,您知道。)