与 FileProvier 共享文件

问题描述 投票:0回答:1

我正在尝试使用 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 FilesFileProvider 工作,但还没有发现我错过了什么。

我做了什么,导致我没有正确授予意图接收者读取权限?谢谢!

android android-intent android-fileprovider
1个回答
0
投票

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();
© www.soinside.com 2019 - 2024. All rights reserved.