【发布时间】:2020-06-28 06:50:47
【问题描述】:
将文件附加到 Gmail 时,我会在附件中短暂看到文件,然后 Toast 说“无法附加文件”,然后它就消失了。它适用于 Drive、Discord 和其他应用程序。 该文件也保留在模拟器上的附件中,但是当我发送它时,发送的邮件没有附件。我有一个简单的 .csv 文件并通过 FileProvider 附加它。
尝试写入内部存储,但没有帮助。
val fileLocation = File(requireContext().getExternalFilesDir("data"), "data.csv")
// Saving the file into device
val streamOut =
FileOutputStream(fileLocation)
streamOut.write(myString.toByteArray())
streamOut.close()
// Exporting
val contentUri = FileProvider.getUriForFile(
requireContext(),
"mypackage.fileprovider",
fileLocation
)
val fileIntent = Intent(Intent.ACTION_SEND)
.setType("text/csv")
.putExtra(Intent.EXTRA_SUBJECT, "Data")
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.putExtra(Intent.EXTRA_STREAM, contentUri)
val chooser = Intent.createChooser(
fileIntent,
requireContext().resources.getText(R.string.send_to)
)
chooser.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
val resInfoList: List<ResolveInfo> = requireActivity().packageManager
.queryIntentActivities(chooser, PackageManager.MATCH_DEFAULT_ONLY)
for (resolveInfo in resInfoList) {
val packageName = resolveInfo.activityInfo.packageName
requireActivity().grantUriPermission(
packageName,
contentUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
requireActivity().startActivity(
chooser
)
provider_paths
<paths>
<external-files-path
name="data"
path="." />
</paths>
清单
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="mypackage.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
【问题讨论】:
-
我是一名 java 开发人员,但你声明了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限吗?
-
不,因为我正在使用 FileProvider,所以根据文档不需要这些权限。我尝试使用内部存储,但问题仍然存在。也许 Gmail 需要这些权限,我会试试的。
-
No, as I'm using FileProvider these permissions are not needed。确实不需要它们。但这与使用文件提供程序无关。原因是 getExternalFilesDir 不需要它们。 -
.setType("text/csv")尝试设置不同的类型。
标签: android android-intent gmail android-file android-fileprovider