【问题标题】:using an email intent使用电子邮件意图
【发布时间】:2017-02-20 18:29:39
【问题描述】:

好的,我已经讨论了一段时间了,但我不明白。多个链接中的建议都没有解决问题。

我已成功设置我的应用程序以发送文件。目前,我正在尝试使用我的应用程序打开这些文件。

当我点击收到的电子邮件中的文件时,我的活动就会打开。

接下来我需要将文件保存在本地,在我的应用程序使用的外部存储文件夹中。

那么,当您单击一个文件并且意图过滤器打开正确的活动时,您接下来要做什么来访问该文件?

意图过滤器:

<intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.gmgt" />
        </intent-filter>

活动:

public class ActFileReceiver extends Activity {

private TextView label;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file_receiver);

    label = (TextView) findViewById(R.id.lblFileRecieverText);


}

}

用于发送文件的意图:

public void emailFile(File file) {
    Uri fileURI = Uri.fromFile(file);
    Intent mailIntent = new Intent(android.content.Intent.ACTION_SEND);
    mailIntent.setType("messsage/vnd.com.boardmonkey.TABLETop.gamefile");
    mailIntent.putExtra(Intent.EXTRA_SUBJECT, "TABLETop game file: " + file.getName());
    mailIntent.putExtra(Intent.EXTRA_STREAM, fileURI);
    startActivity(Intent.createChooser(mailIntent, "Send Mail With..."));
}

【问题讨论】:

  • “我没有代码示例”——当然有。根据您的问题,您有一个活动并且您有一个&lt;intent-filter&gt;。做什么的细节因您的&lt;intent-filter&gt; 的用途而异(ACTION_VIEWACTION_SEND?还有别的吗?)。所以,至少给我们这个。
  • 还不错,没有想那么深,我的错。编辑以反映我实际拥有的东西。
  • action_sendto 工作正常,我的应用程序将通过设备上任何支持发送的应用程序成功发送文件。

标签: android android-intent android-file


【解决方案1】:

您希望支持ACTION_VIEW。如果你看the documentation for ACTION_VIEW,你会发现:

输入:getData() 是从中检索数据的 URI。

在这里,“输入”是指从拨打startActivity() 的人发送给您的数据,即用户选择的活动。而且,Intent 操作文档中引用的方法是指Intent 本身。

因此,调用getIntent() 以检索用于创建您的活动的Intent,并在其上调用getData() 以获取您应该查看的内容的Uri


不过,现在您开始遇到问题。具体来说,您正在尝试使用android:pathPattern。你的使用有两个问题:

  1. You cannot use android:pathPattern without also specifying android:scheme and android:host.

  2. 现在是 2017 年,很少有东西再使用文件扩展名了。特别是,大多数内容通过content 方案通过Uri 值共享,content Uri 不太可能有文件扩展名。

使用android:pathPattern 的唯一半有效方法是将自己限制在file 方案中(通过android:scheme),然后接受这样一个事实,即随着时间的推移,您的应用程序将与数量稳步减少的应用程序进行互操作.

【讨论】:

  • 好吧,这就是我所缺少的!!我的应用程序不必与其他应用程序互操作,它是一个套件集,只需要与自己共享文件,输出文件(如文本或短信文档)将按照自己的意图单独格式化,即如果文件名是通过 facebook 共享的名称将从文件中提取为字符串并以文本形式发送。所以,方案和主机:我的文件是我的应用程序创建的对象的序列化文件,这意味着它只是方案:文件?我会查找“主机”,但我认为这是文件的来源,比如电子邮件或网络,对吧?
  • @JohnHaines:“我的应用程序不必与其他应用程序互操作”——是的,确实如此。目前,您的应用正在宣传任何应用都可以要求它查看内容。如果这不是您想要的,您将需要采取不同的方法。
  • 任何应用程序都可以查看文件。他们只是不能对它们做任何事情,因为它们是序列化的对象。如果有人想编写一个解释该对象的应用程序,那不会打扰我。我只想让我的应用程序将文件保存在本地。
  • 我明白你在说什么,但老实说,这是我目前没有做的一个步骤。
  • @JohnHaines:关于方案和主机是什么,它们需要与您的其他应用程序正在使用的 Uri 匹配,它在 Intent 中放入 @987654345 @ 正在触发此活动。如果您不关心互操作性,那么重要的是两个应用程序就Uri 结构的含义达成一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多