【问题标题】:How to send data inside an intent without external storage如何在没有外部存储的情况下在意图内发送数据
【发布时间】:2012-02-27 18:59:53
【问题描述】:

我正在尝试将数据发送到 ACTION_VIEW 或 ACTION_SEND Intent 而不将该数据写入文件。

大多数意图都需要一个 Uri,它通常基于文件路径或 url,如下所示:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(context.getFilesDir(), TEMP_FILE_NAME));
intent.setDataAndType(uri, "application/pdf");
context.startActivity(intent);

我希望外部存储上的每个人都无法查看我有意共享的数据。内部存储(如上面的示例)不授予被调用的意图(这意味着 pdf 查看器无法查看我的应用程序私人空间中的文件)。

Diane Hackborne 在此处暗示可以复制数据:http://groups.google.com/group/android-developers/browse_thread/thread/be9b069ca8906417#

但我还没有找到任何其他数据说明这是如何发生的。

有什么想法吗?谢谢!

【问题讨论】:

    标签: android android-intent share


    【解决方案1】:

    这取决于您的数据采用什么形式/大小,但可能最简单的选择是将数据作为“额外”包含在Intent 上。

    Extras 可以是各种不同的类型,包括大多数 Java 原语(Stringintdouble 等)和Bundles 和ArrayLists。

    如果您有自己的类结构,您还可以实现Parcelable 并包含您自己的类的实例作为附加项。

    但是,我想说,如果您的数据量很大,那么使用 Intent 在内存中传递它可能不是最好的主意。如果是这种情况,您可能只需要硬着头皮在通话期间暂时将数据写入存储,并在您的通话Activity/Service 重新获得焦点时将其清除。

    【讨论】:

    • 我同意你为你自己的意图使用额外的东西。这对于 ACTION_VIEW 和 ACTION_SEND 将如何通过第三方查看和发送?黛安在我发布的链接中说了什么?
    • 我相信 Dianne 在她的帖子中指的是额外内容。如果您尝试使用您的Intent 调用第三方活动/服务,那么在一定程度上您的选择会受到限制,因为第三方组件将期望以某种方式接收数据(应记录在案)。如果第三方组件希望收到Uri,那么您将不得不使用内部/外部存储或提出自己的ContentProvider 实现(例如,由 Sqlite 数据库支持)
    • 好的,只是为了验证一下,如果不将文件写入共享存储或创建对所有人开放的内容提供程序,真的没有一种安全的方法可以将文件传递给这些通用意图吗?
    • 请问您打算通过什么类型的数据来传递您的意图(如果我知道更多,我可能会给您一个更好的答案)?
    • 并非如此。 Android 的 Intent 机制是特意设计的,以确保应用程序之间的耦合非常松散。一个应用程序不应该了解另一个特定应用程序,而是使用 Intent 请求任何支持的应用程序执行所需的功能。因此,通过 Intent 提供您的数据,您可以定义为任何支持您的 Intent 的应用程序都可以使用它。如果有任何帮助,我将不胜感激:-)
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2021-07-20
    • 2011-08-31
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多