Android 如何指定发送操作的文件名?

Android 如何指定发送操作的文件名?,android,android-intent,Android,Android Intent,我正在使用ACTION_SEND从我的应用程序中的内容提供商那里发送一个文件,作为GMail中的电子邮件附件。这很好,只是我不能以编程方式指定附件的文件名。当我的URI为 content://my.documentcontentprovider/321 附件的文件名是321。321是文档id 我查看了规范的意图,没有看到用于指定文件名的额外密钥。我能想到的唯一解决办法是将文件名附加到我的URI中: content://my.documentcontentprovider/321/photo.jp

我正在使用ACTION_SEND从我的应用程序中的内容提供商那里发送一个文件,作为GMail中的电子邮件附件。这很好,只是我不能以编程方式指定附件的文件名。当我的URI为

content://my.documentcontentprovider/321

附件的文件名是321。321是文档id

我查看了规范的意图,没有看到用于指定文件名的额外密钥。我能想到的唯一解决办法是将文件名附加到我的URI中:

content://my.documentcontentprovider/321/photo.jpg

它应该可以工作,但似乎有点不太正常。如果有人有更好的主意,请插嘴。以下是我的代码,以防有用:

    Intent sendDoc = new Intent();
    sendDoc.setAction(Intent.ACTION_SEND);
    sendDoc.putExtra(Intent.EXTRA_SUBJECT, doc.name);
    sendDoc.putExtra(Intent.EXTRA_STREAM, DocumentContentProvider.getUri(doc.id));
    sendDoc.setType(doc.contentType);
    this.foldersFragment.startActivity(sendDoc);

您需要将文件路径作为
Intent.EXTRA\u STREAM
传递。设计良好的内容提供者在
\u DATA
列中公开文件路径。

您需要将文件路径作为
Intent.EXTRA\u流
传递。设计良好的ContentProviders在
\u DATA
列中公开文件路径。

如果不知道DocumentContentProvider查询将返回什么,很难提供帮助。我假设它不是光标。它是文件对象吗?如果不知道DocumentContentProvider查询将返回什么,就很难提供帮助。我假设它不是光标。它是文件对象吗?谢谢你给我指出了正确的方向。问题出在我的ContentProvider实现中,正如您所预料的那样。在实现ContentProvider.query()来处理MediaStore.MediaColumns.DISPLAY_NAME之后,GMail开始正确设置文件名。“设计良好的ContentProviders在_数据列中公开文件路径”——首先,并非由
ContentProvider提供的每个流都由文件表示。第二,并非每个文件都能被第三方应用程序访问。一段时间以来,谷歌一直在引导开发者远离向其他应用公开“文件路径”。我不记得上次我把
\u DATA
作为推荐模式是什么时候了
ContentProviders
FileProvider
一样,直接从
Uri
向上游提供服务。感谢您为我指明了正确的方向。问题出在我的ContentProvider实现中,正如您所预料的那样。在实现ContentProvider.query()来处理MediaStore.MediaColumns.DISPLAY_NAME之后,GMail开始正确设置文件名。“设计良好的ContentProviders在_数据列中公开文件路径”——首先,并非由
ContentProvider提供的每个流都由文件表示。第二,并非每个文件都能被第三方应用程序访问。一段时间以来,谷歌一直在引导开发者远离向其他应用公开“文件路径”。我不记得上次我把
\u DATA
作为推荐模式是什么时候了
ContentProviders
类似于
FileProvider
直接从
Uri
向上游提供服务。