我正在尝试使用 FileProvider 和选择器由我的应用程序创建文件。然而,在我的实现中,选择器完成后,所选应用程序会抛出一个错误,指出它无法“从意图获取共享数据”(信号),或者什么都不做(whatsapp、编辑器……)。
我已将 FileProvider 节添加到我的应用程序标签中的
AndroidManifest.xml
:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.domain.name.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
我的
file_paths.xml
包含
<paths>
<files-path path="." name="root" />
<files-path path="shared/" name="shared" />
</paths>
我的实现是
File filesDir = getApplicationContext().getFilesDir();
File shareDir = new File(filesDir, "shared/");
File file = new File(shareDir, "filename.txt");
Uri fileUri = FileProvider.getUriForFile(getApplicationContext(),
"com.domain.name.fileprovider",
file);
// Create the text message with a string
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendIntent.setData(fileUri);
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getString(R.string.share_title)));
fileUri
已成功填充,我可以从 AndroidStudio 的设备资源管理器中看到该文件存在并且具有我期望的内容。
我一直在使用 Sharing Files 和 FileProvider 工作,但还没有发现我错过了什么。
我做了什么,导致我没有正确授予意图接收者读取权限?谢谢!
ACTION_SEND
不使用 setData()
。
最好的解决方案是使用
ShareCompat.IntentBuilder
,它可以为你处理很多的ACTION_SEND
特质。根据 Ian Lake 的帖子,您可以替换:
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendIntent.setData(fileUri);
sendIntent.setType("text/plain");
与:
Intent shareIntent = ShareCompat.IntentBuilder.from(this)
.setType("text/plain")
.setStream(fileUri)
.getIntent();