安卓:打开短信意图

6
在我的Android应用程序中,我只需要打开短信意图,并预填充message_bodyPhoneNumber。以下是我尝试的代码:
Uri uri = Uri.parse(String.format("smsto:%s", strPhoneNumber));
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, uri);
smsIntent.putExtra("sms_body", "Sample Body");
startActivityForResult(smsIntent, OPEN_SMS_APP);

在默认情况下一切都很好,但如果安装并将Facebook Messenger设置为默认的短信应用程序(设置->应用和通知->默认应用程序->短信应用程序),则功能会出现问题。
问题是,它打开了FB Messenger,但没有消息正文(为空),尽管它正确选择了电话号码(在FB Messenger APP中)。
此外,我尝试了以下测试,但是没有选择SMS_BODY或打开默认的Android APP。
smsIntent.addCategory(Intent.CATEGORY_APP_MESSAGING); // STILL DIDN'T FIX
smsIntent.putExtra(Intent.EXTRA_TEXT, "Sample Body"); // STILL DIDN'T FIX

问题

  1. 如果有人设置了其他第三方短信应用为默认应用,我是否可以强制打开Android默认短信应用(消息应用)?
  2. 或者我是否有其他方法可以使message_body参数在其他第三方应用程序中起作用?

1
Facebook Messenger出故障了。向Facebook报告它是一个bug,他们应该查看body字段。但他们没有这么做。 - Gabe Sechan
只尝试使用 new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null)),不要添加 Intent.CATEGORY_APP_MESSAGING。 我认为 URI sms 应该不会选择 fbmessenger 应用程序。或者是我漏掉了什么? - ADM
1
实际上,我只是通过前员工反馈渠道进行了报告。我们将看看是否会引起任何关注。 - Gabe Sechan
1
根据 Messenger 团队的说法,这个问题在二月初悄悄出现了,将会在下一个版本中得到修复。 - Gabe Sechan
这个问题在2021年还没有被修复... - iForests
显示剩余4条评论
2个回答

4
如果你真的想限制只使用Google Android短信应用程序,那么可以指定Google应用程序的包名称。但是,还有许多其他应用程序将阅读'sms_body' Intent关键字。
Uri uri = Uri.parse(String.format("smsto:%s", strPhoneNumber));
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, uri);
smsIntent.putExtra("sms_body", "Sample Body");
// To Force Google Android SMS APP To Open
smsIntent.setPackage("com.google.android.apps.messaging"); 
if (smsIntent.resolveActivity(getPackageManager()) != null)
{
    startActivityForResult(smsIntent, OPEN_SMS_APP);
}
else
{
    // Display error message to say Google Android SMS APP required.
}

我建议使用应用程序选择器,而不仅限于 Google 短信应用。显然,用户需要多进行一步(单击),但是它会列出所有 SMS 应用程序(每次都是如此),并且用户可以选择一个正确工作的 SMS 应用程序。

startActivityForResult(Intent.createChooser(smsIntent, "Sample Title"), OPEN_SMS_APP); 

0
它打开FB Messenger,但不带有消息正文(为空)。
没有任何应用程序需要遵守未记录的Intent extras的要求。
此外,我尝试了以下测试,但没有选择SMS_BODY或打开默认的Android APP。
EXTRA_TEXT未记录为与ACTION_SENDTO一起使用,也未记录为CATEGORY_APP_MESSAGING。
有没有办法可以强制打开默认的Android SMS应用程序(Messages APP)?
大约有10,000个Android设备型号。我预计会有几十个,甚至数百个预安装的“Android SMS应用程序”。其中没有一个必须遵守未明确记录支持ACTION_SENDTO的Intent extras或类别。
还有其他方法可以将message_body参数传递给其他第三方应用程序吗?
ACTION_SEND - 而不是ACTION_SENDTO - 提供EXTRA_TEXT。但是,您无法强制规定内容应发送到哪里。这取决于用户。

如果您拥有SEND_SMS权限,还可以直接使用SmsManager发送短信。


嗨CommonsWare,谢谢你的解释。在这个链接(https://developer.android.com/guide/components/intents-common.html#Messaging)中,Android解释了应该传递给文本消息的意图附加项。其中"sms_body"是短信的内容。 问题是Android允许设置第三方应用作为默认的短信应用程序,而这些应用程序不遵守Android的标准,导致功能无法正常运行。 - JibW
如果是这种情况,我想知道是否有一种方法可以强制打开Android短信应用程序,而不是任何其他应用程序,即使将其中一个设置为默认应用程序。我已经检查了SmsManager,但真的希望使用意图来支持类似于IOS应用程序的功能。 - JibW
@JibW:“默认的GOOGLE ANDROID短信应用程序”--许多设备不会预装Google的短信应用程序。 - CommonsWare
在这些情况下,为了阻止用户继续操作并显示错误消息,需要使用谷歌安卓短信应用程序(而不是任何第三方应用程序)。就像在大多数情况下默认的谷歌安卓安装的“信息应用程序”或其他遵循正确行为的谷歌安卓短信应用程序一样。 - JibW
@JibW 你能解决这个问题了吗? - cortex
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接