【问题标题】:How to create a chooser for a list of applications using package manager如何使用包管理器为应用程序列表创建选择器
【发布时间】:2016-01-06 14:39:31
【问题描述】:

基本上我有一个流行电子邮件应用程序的包名称列表,我想创建一个选择器来启动发送电子邮件意图,你可以参考this 问题,这里他只使用 gmail 的包管理器,我想为包列表做它

【问题讨论】:

  • “基本上我有一个流行的电子邮件应用程序包名称列表”——请允许用户使用任何用户想要的电子邮件应用程序。这可能包括您列表中的应用程序。或者,请解释为什么限制在您的列表中符合用户的最大利益。
  • @CommonsWare 我这样做是因为据我所知(根据此问题中链接的问题),没有专门针对电子邮件应用程序的适当 Intent 操作或更正确地 - 世界上所有电子邮件应用程序的通用 Intent 操作听
  • "启动发送电子邮件意图" -- 如果您想发送电子邮件,请使用ACTION_SENDTO(如果您有电子邮件地址)或ACTION_SEND(如果你不)。您不需要使用PackageManager,也不需要电子邮件应用程序包列表。在您链接到的问题中,OP 确实 想要“启动发送电子邮件意图”。 OP 用粗体字写道:“我不想发送新消息”。
  • 我想要做的是模拟桌面行为,当您单击打开 Outlook/gmail 客户端的电子邮件链接时,将 to 字段设置为电子邮件 ID,但除此之外,我还想让用户选择启动的电子邮件应用程序

标签: android android-intent android-package-managers


【解决方案1】:

我想要做的是模拟桌面行为,当您单击打开 Outlook/gmail 客户端的电子邮件链接时,将 to 字段设置为电子邮件 ID,但除此之外,我想让用户选择电子邮件启动的应用程序

startActivity(new Intent(Intent.ACTION_SENDTO)
  .setData(Uri.parse("mailto:"+yourEmailAddressGoesHere)));

您将 yourEmailAddressGoesHere 替换为“电子邮件 ID”。

如果用户有多个电子邮件客户端,并且用户没有选择默认的电子邮件客户端,用户将自动获得一个选择器。如果用户只有一个电子邮件客户端,或者选择了默认的电子邮件客户端,这将引导用户进行一些活动以撰写邮件到您指定的电子邮件地址。

【讨论】:

  • 是的,这就是我想要的,所以当没有电子邮件客户端存在时,我使用 try catch 块来显示错误是吗?您确定这仅适用于电子邮件应用程序吗?
  • @Bhargav:“所以我使用了 try catch 块……”——是的。您还可以创建Intent 并在PackageManager 上调用queryIntentActivities(),传入Intent。如果queryIntentActivities() 返回一个长度为零的列表,你知道如果你尝试在Intent 上调用startActivity(),你会得到一个ActivityNotFoundException
  • @Bhargav:“你确定这仅适用于电子邮件应用程序吗?” -- 任何具有为mailto 方案实现ACTION_SENDTO 的活动的应用程序都将是用户的一个选项。这通常只是电子邮件应用程序。不过,更重要的是,应用程序的组合取决于用户,而不是您。你并不比你的用户更重要。如果您的用户想要使用其他东西,并且选择器中出现了其他东西,欢迎用户选择它。
  • 好的,您的第二条评论为我解决了问题,谢谢,我选择了正确的答案,如果您可以尝试将您的第二条评论附加到答案中
【解决方案2】:

创建意图并设置其 uri 数据

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);

然后创建选择器意图。当您希望用户在每次发送电子邮件时选择他想要的应用程序时,这很有用。如果你想选择一个应用并将其设为默认,你可以省略选择器并直接启动意图

Intent chooser = Intent.createChooser(intent, "Chooser title");

然后检查是否至少有一个活动可以处理电子邮件意图

if(intent.resolveActivity(getPackageManager()) != null){
    // there are apps, start the chooser
    startActivity(chooser);
} else {
    // no apps found
    Toast.makeText(this, "No apps found", Toast.LENGTH_SHORT).show();
}

【讨论】:

  • 您不应将这些 Extras 与 ACTION_SENDTO 一起使用,因为它们仅记录在 ACTION_SEND 和 ACTION_SEND_MULTIPLE 中。另外,我强烈建议不要使用带有 ACTION_SENDTO 的选择器。更多细节在这里:medium.com/@cketti/…
  • 尊重你的观点和很好的解释,但我有另一种看法。首先,您提到它们也适用于该操作,我认为将它们用作额外内容而不是在 uri 中合并更清楚。其次,我可能会使用 gmail,但有时我会使用 yahoo,所以我认为在这种情况下选择器很有用。
  • 不使用Intent.createChooser() 时,用户不必选择默认应用。在这种情况下,他们每次都会看到一个选择器对话框。但是,如果您作为应用程序的开发人员决定使用Intent.createChooser(),则用户将无法选择默认应用程序。
  • 是的,我知道,我认为并不是所有人都喜欢选择默认的东西,他们希望每次都看到一个选择器,尽管他们总是选择同一个应用程序。在成为开发人员之前,我是一名 android 用户,我也看到很多人在做同样的事情。我认为默认应用程序在浏览器或真正不需要选择器的应用程序中可能有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多