【发布时间】:2020-04-21 20:59:14
【问题描述】:
我在创建一个将大量原始数据写入文本文件,然后共享该文本文件以通过电子邮件/whatsapp 发送的函数时遇到了一些麻烦。从 Android 10 开始,由于隐私原因,无法再使用Environment.getExternalStorageDir()。现在看来我的文件对其他应用程序不可见,因此它们无法打开。我的代码如下:
负责导出的片段:
CoroutineScope(Dispatchers.IO).launch {
withContext(Dispatchers.IO) {
val data: String = retrieveData() ?: return@withContext
val file = File(requireContext().getExternalFilesDir(null), "export.xml")
val outputStream =
requireContext().openFileOutput("export.xml", Context.MODE_PRIVATE)
outputStream.write(data.toByteArray())
outputStream.close()
val uri = FileProvider.getUriForFile(requireContext(),BuildConfig.APPLICATION_ID, file)
val shareIntent = Intent().apply {
type = "text/plain"
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_file_subject))
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
startActivity(
Intent.createChooser(
shareIntent,
getString(R.string.share_file_subject)
)
)
}
}
在清单中:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
文件路径.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="files"
path="/" />
</paths>
使用 Android Studio 文件资源管理器时,我可以看到该文件是使用正确的内容创建的。 Uri 指向:content://myApplicationId/files/export.xml,该文件位于我的设备上的data/data/myApplicationId/files,但我似乎无法弄清楚如何让它可供其他应用程序打开。
当使用例如 gmail 应用程序打开它时,它会创建一个新概念并填写主题,但我从 gmail 应用程序中得到一个 Toast 说“无法添加附件”。意图似乎正确触发,因此我的代码中没有发生异常。我的猜测是由于某种原因,其他应用程序仍然无法访问该文件。
有什么建议吗?
提前致谢。
【问题讨论】:
标签: android android-intent privacy android-10.0 file-sharing