有意图地启动短信应用程序


144

我对意图有疑问...我尝试启动短信应用...

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
结帐gist.github.com/gelldur/9c199654c91b13478979您可以通过短信应用共享
Dawid Drozd

Answers:


238

要开始启动sms活动,您需要做的是:

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

您可以添加其他内容来填充自己的消息,例如这样

sendIntent.putExtra("sms_body", x); 

然后只需启动startActivity就可以了。

startActivity(sendIntent);

我尝试了一下,但是当我完全写出您所提供的内容时,Eclipse控制台返回(编译时)“未找到Launcher活动!”
Olivier69 2010年

好吧,您的清单中的意图过滤器中是否有一个具有以下属性的活动?<action android:name =“ android.intent.action.MAIN” /> <category android:name =“ android.intent.category.LAUNCHER” />
jqpubliq 2010年

实际上,启动来自appwidgetactivity。Perh'aps从这里来,我把您所做的事情放在清单中,什么也没发生...我已经用另一种功能测试了我的按钮,而这是我不想去的!
Olivier69年

22
要在“至”框中自动包含电话号码,请将代码setData行更改为sendIntent.setData(Uri.parse("sms:" + phoneNumber));(感谢jqpubliq和jaydeepw)
tmr

2
我需要检查SMS是否发送,当用户将通过Intent ti sms从我的应用程序发送短信时,我该怎么做?
用户

139
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);

4
最好的解决方案!谢谢!
尼克,

20
请注意,这将不适用于android 4.4或更高版本……不再支持“ vnd.android-dir / mms-sms”
Max Ch

2
刚刚在Android 4.4.2上进行了测试,并且可以正常工作。你能把我链接到那个公告吗?@MaxCh
theknut 2014年

3
如果没有像我这样添加电话号码,只需添加:intent.setData(Uri.parse("smsto:" + phoneNumber));
乌托邦

4
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
Nguyen Minh Binh's

49

如果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 2015年

3
@KarthikeyanVe,你可以试试吗?意图sendIntent =新意图(Intent.ACTION_SENDTO); sendIntent.setData(Uri.parse(“ smsto:phonenumber”));;
android_developer 2015年

我试过了。它的工作正常。但是,当我从消息应用程序中单击“后退”按钮时,它也会关闭我的应用程序。如果我从消息应用程序中按回去,它应该回到我离开的地方。
Karthikeyan Ve 2015年

2
好答案。如果您想直接转到默认的SMS应用程序,则使用它,就像魅力一样。如果需要选择器,请在此处查看其他答案。
Nemanja Kovacevic

1
为什么当我从消息中回来时,应用会关闭
Muhammad Younas 16-10-22

31
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

22

如果要从其他一些活动中启动“ SMS撰写”活动,并且还必须传递电话号码和SMS文本,请使用以下代码:

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:是用于识别SMS撰写活动中的文本和电话号码的键,因此请在此处小心。


当它启动消息意图或当我按下返回键时,该应用程序关闭
Muhammad Younas 16-10-22

首先告诉我何时执行此代码,然后打开写短信功能,如果应用程序在按下后退按钮后关闭,则您的代码中会有问题,尤其是在公共void BackPressed(){}函数中,像这样
Pir Fahim Shah

我没有覆盖BackPresed Functionn
Muhammad

17

这是将打开SMS活动的代码,该活动预先填充了SMS必须发送到的电话号码。这在模拟器以及设备上都可以正常工作

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 2012年

我对此有一个问题,如果我们看到框架代码,则setType()将数据设置为null,而setData()将类型设置为null。那么在这种情况下类型将如何持久化?
AndroidGuy 2013年

我们如何更改短信中的文本字体
jyomin

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中唯一
可行的

3
try {
    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setData(Uri.parse("smsto:" + Uri.encode(number)));
    smsIntent.putExtra("address", number);
    smsIntent.putExtra("sms_body", message);

    PackageManager pm = activity.getPackageManager();
    List<ResolveInfo> resInfo = pm.queryIntentActivities(smsIntent, 0);

    for (int i = 0; i < resInfo.size(); i++) {
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;

        if (packageName.contains("sms")) {
            //Log.d("TAG", packageName + " : " + ri.activityInfo.name);
            smsIntent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
        }
    }
    activity.startActivity(smsIntent);
} catch (Exception e) {
    // Handle Error
}

最好的方法。


只为我自己此代码的工作...但是如何避免多个SMS应用程序的选择......只有默认将开始..
马比尔·拉曼·汗

3

您可以打开默认的短信应用并通过以下方式传递详细信息:
注意:如果您要发送多个号码,请用“;”分隔每个号码。内线

String mblNumVar = "9876543210;9123456789";
Intent smsMsgAppVar = new Intent(Intent.ACTION_VIEW);
smsMsgAppVar.setData(Uri.parse("sms:" +  mblNumVar));
smsMsgAppVar.putExtra("sms_body", "Hello Msg Tst Txt");
startActivity(smsMsgAppVar);

|或| 使用此功能:

void openSmsMsgAppFnc(String mblNumVar, String smsMsgVar)
{
    Intent smsMsgAppVar = new Intent(Intent.ACTION_VIEW);
    smsMsgAppVar.setData(Uri.parse("sms:" +  mblNumVar));
    smsMsgAppVar.putExtra("sms_body", smsMsgVar);
    startActivity(smsMsgAppVar); 
}

这显示了两个选项:1.环聊和2.默认消息应用。我想强制打开Android消息应用程序。我们如何存档?
Milind Mevada'17

3

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的修改后的答案


2
Intent sendIntent = new Intent(Intent.ACTION_SEND); 
//CHANGE YOUR MESSAGING ACTIVITY HERE IF REQUIRED 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("sms_body",msgbody); 
sendIntent.putExtra("address",phonenumber);
//FOR MMS
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/mms.png"));
sendIntent.setType("image/png");
startActivity(sendIntent);

2

与默认SMS应用程序配合使用的最佳代码是。

Uri SMS_URI = Uri.parse("smsto:+92324502****"); //Replace the phone number
Intent sms = new Intent(Intent.ACTION_VIEW,SMS_URI);    
sms.putExtra("sms_body","This is test message"); //Replace the message witha a vairable 
startActivity(sms);

1

以下代码适用于android 6.0。
它将在默认消息传递应用程序中打开搜索活动,并提供与特定字符串相关的对话。

Intent smsIntent = new Intent(Intent.ACTION_MAIN);
        smsIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        smsIntent.setClassName("com.android.mms", "com.android.mms.ui.SearchActivity");
        smsIntent.putExtra("intent_extra_data_key", "string_to_search_for");
        startActivity(smsIntent);  

您可以有意开始搜索活动。这将打开默认消息传递应用程序的搜索活动。现在,要显示搜索活动中特定对话的列表,您可以将搜索字符串作为额外的字符串提供,并附带键为

“ intent_extra_data_key”

如此类的onCreate所示

String searchStringParameter = getIntent().getStringExtra(SearchManager.QUERY);
    if (searchStringParameter == null) {
        searchStringParameter = getIntent().getStringExtra("intent_extra_data_key" /*SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA*/);
    }
    final String searchString = searchStringParameter != null ? searchStringParameter.trim() : searchStringParameter;

您还可以将sm的SENDER_ADDRESS作为额外的字符串传递,这将列出与该特定发件人地址的所有对话。

检查com.android.mms.ui.SearchActivity了解更多信息

您也可以检查此答案


0

在模拟器上为我工作

Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null));
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("sms_body", remindingReason);

                startActivity(i);


0

撰写短信:

Uri smsUri = Uri.parse("tel:" + to);
Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
intent.putExtra("address", to);
intent.putExtra("sms_body", message);
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

0

您都可以使用它,两者都可以在4.4以上的android上正常工作

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

要么

    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.putExtra("sms_body","Body of Message");
    smsIntent.setData(Uri.parse("sms:9212107320"));
    startActivity(smsIntent);

0

您可以使用以下代码段实现目标:

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+model.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.putExtra("sms_body","Hello this is dummy text");
startActivity(smsIntent);

如果您不想输入任何文本,请删除sms_body键。

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.