使用意图启动短信应用程序

156

我有一个关于intent的问题... 我尝试启动短信应用程序...

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setType("vnd.android-dir/mms-sms");
int flags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |
    Intent.FLAG_ACTIVITY_CLEAR_TOP;
intent.setFlags(flags);
intent.setData(Uri.parse("content://sms/inbox"));
context.startActivity(intent);

所以,你可以看到我在我的意图中放了太多东西,但这是因为我不知道该如何做...谢谢


1
请查看 https://gist.github.com/gelldur/9c199654c91b13478979 您可以通过短信应用程序分享。 - Gelldur
22个回答

247

要启动短信活动,你只需要这样:

Intent sendIntent = new Intent(Intent.ACTION_VIEW);         
sendIntent.setData(Uri.parse("sms:"));

你可以添加额外的内容来填充你自己的消息,就像这样

sendIntent.putExtra("sms_body", x); 

然后只需使用该意图进行startActivity。

startActivity(sendIntent);

我尝试了,但当我按照您给出的内容编写时,Eclipse控制台会返回(在编译时)“找不到启动器活动!” - Olivier69
事实上,启动来自于一个AppWidgetActivity。也许它从这里来,我在清单中放置了你所做的内容,但是没有任何反应...我已经用另一个函数测试了我的按钮,但它不想起作用!! - Olivier69
25
要自动将电话号码包含在“收件人”框中,需要将代码中的"setData"更改为sendIntent.setData(Uri.parse("sms:" + phoneNumber)); (感谢jqpubliq和jaydeepw)。 - tmr
你知道怎么改变短信中文字体吗?字体.ttf文件保存在我的SD卡中。 - jyomin
2
当用户通过Intent发送短信时,我需要检查短信是否已发送,我该如何做到这一点? - user
显示剩余5条评论

143
Intent smsIntent = new Intent(Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address", "12125551212");
smsIntent.putExtra("sms_body","Body of Message");
startActivity(smsIntent);

21
请注意,这将无法在安卓4.4及其以上版本中使用……"vnd.android-dir/mms-sms"不再受支持。 - Max Ch
2
刚在 Android 4.4.2 上测试了,它是可以工作的。你能给我提供那个公告的链接吗?@MaxCh - theknut
3
如果像我的情况一样,电话号码还没有被添加,只需添加以下内容: intent.setData(Uri.parse("smsto:" + phoneNumber)); - Utopia
5
android.content.ActivityNotFoundException: 没有找到处理 Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) } 的活动。 - Nguyen Minh Binh
1
这可能会在不同的移动设备供应商上崩溃。 - Umair Khalid
显示剩余3条评论

50

如果Android版本为KitKat或更高版本,则用户可以更改默认的短信应用程序。此方法将获取默认的短信应用并启动默认的短信应用。

private void sendSMS() {    
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) // At least KitKat
      {
         String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(this); // Need to change the build to API 19

         Intent sendIntent = new Intent(Intent.ACTION_SEND);
         sendIntent.setType("text/plain");
         sendIntent.putExtra(Intent.EXTRA_TEXT, "text");

         if (defaultSmsPackageName != null)// Can be null in case that there is no default, then the user would be able to choose
         // any app that support this intent.
         {
            sendIntent.setPackage(defaultSmsPackageName);
         }
         startActivity(sendIntent);

      }
      else // For early versions, do what worked for you before.
      {
         Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
         smsIntent.setType("vnd.android-dir/mms-sms");
         smsIntent.putExtra("address","phoneNumber");         
         smsIntent.putExtra("sms_body","message");
         startActivity(smsIntent);
      }
   }

2
我正在使用KitKat版本。我想在“收件人”字段中设置接收者号码。我该如何设置? - Karthikeyan Ve
3
意图sendIntent = new Intent(Intent.ACTION_SENDTO); sendIntent.setData(Uri.parse("smsto:手机号")); - msevgi
我尝试过了,它能正常工作。但是当我从消息应用程序中点击返回按钮时,它也会关闭我的应用程序。如果我从消息应用程序中按下返回键,它应该回到我离开的地方。 - Karthikeyan Ve
2
很棒的答案。如果你想直接进入默认的短信应用程序,它能够完美地工作。如果你想要选择器,请在这里查看其他答案。 - Nemanja Kovacevic
1
为什么当我从消息返回时应用程序会关闭? - Muhammad Younas
显示剩余6条评论

32
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

那就是你所需要的全部。


代码在Android 4.2.2上运行,它打开了短信列表视图。这正是我所需要的! - VISHAL VIRADIA

27

如果您想从其他活动启动短信撰写活动,并且还必须传递电话号码和短信文本,则使用此代码:

Uri sms_uri = Uri.parse("smsto:+92xxxxxxxx"); 
Intent sms_intent = new Intent(Intent.ACTION_SENDTO, sms_uri); 
sms_intent.putExtra("sms_body", "Good Morning ! how r U ?"); 
startActivity(sms_intent); 

注意: 这里的 sms_bodysmsto: 是在短信编辑界面中识别文本和电话号码的键,所以要小心。


当应用程序启动消息意图或我按下返回键时,应用程序会关闭。 - Muhammad Younas
首先告诉我,当你执行这段代码时,它是否会打开写短信功能?如果应用程序在按下返回按钮后关闭,则您的代码中可能存在问题,特别是在 public void BackPressed(){ } 函数中。 - Pir Fahim Shah
我没有覆盖 BackPressed 函数。 - Muhammad Younas

18

这是一段代码,可以打开短信活动,并预设要发送短信的电话号码。 在模拟器和设备上都可以正常工作

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.setData(Uri.parse("sms:" + phoneNumber));
startActivity(smsIntent);

1
我该如何在这条消息中附上一张图片? - unresolved_external
我有一个关于这个问题的疑问,如果我们查看框架代码,setType() 会将数据设置为 null,而 setData() 则会将类型设置为 null。那么在这种情况下,类型如何保持不变呢? - AndroidGuy
我们如何更改短信中文本的字体? - jyomin

6

kotlin 中,可以轻松实现如下:

/**
 * If android version is Kitkat or above, users can change default sms application.
 * This method will get default sms app and start default sms app.
 */
private fun openSMS() {
    val message = "message here"
    val phone = "255754......." //255 Tanzania code.

    val uri = Uri.parse("smsto:+$phone")
    val intent = Intent(Intent.ACTION_SENDTO, uri)

    with(intent) {
        putExtra("address", "+$phone")
        putExtra("sms_body", message)
    }

    when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> {
            //Getting the default sms app.
            val defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(context)

            // Can be null in case that there is no default, then the user would be able to choose
            // any app that support this intent.
            if (defaultSmsPackageName != null) intent.setPackage(defaultSmsPackageName)

            startActivity(intent)
        }
        else -> startActivity(intent)
    }
}

这是 @mustafasevgi 的修改后的回答。


5

使用

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.android.mms", "com.android.mms.ui.ConversationList");

1
这对我来说在股票应用程序上运行良好,例如在模拟器上,但是在Galaxy S3上可能不起作用。 - G. Lombard
1
@G.Lombard Lombard 是的,这段代码在S3上不起作用。有关S3的解决方案吗? - Vivek Kumar Srivastava

4

我使用:

Intent sendIntent = new Intent(Intent.ACTION_MAIN);
sendIntent.putExtra("sms_body", "text");
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

4
Intent eventIntentMessage =getPackageManager()
 .getLaunchIntentForPackage(Telephony.Sms.getDefaultSmsPackage(getApplicationContext));
startActivity(eventIntentMessage);

对于SDK_INT>=19(在此API可用的情况下),它可以工作。 实际上,如果您想打开带有消息列表的短信应用程序,则这是我在Nexus 6上使用Nougat的唯一有效解决方案。 - lujop

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