【问题标题】:launch sms application with an intent有意图地启动短信应用程序
【发布时间】:2011-01-23 06:07:53
【问题描述】:

我有一个关于意图的问题... 我尝试启动短信应用...

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

所以,你可以看到我在我的意图中投入了太多的东西,但那是因为我不知道我该怎么做...... 谢谢

【问题讨论】:

标签: android sms android-intent


【解决方案1】:

要开始启动短信活动,您只需要这样:

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

您可以添加额外的内容来填充您自己的消息等

sendIntent.putExtra("sms_body", x); 

那么就根据意图启动Activity。

startActivity(sendIntent);

【讨论】:

  • 我试过了,但是当我准确地写出你给出的内容时,eclipse控制台返回(编译时)“找不到启动器活动!”
  • 好的,您的清单中的意图过滤器中是否有具有以下属性的活动?
  • 其实启动来自一个appwidgetactivity。也许它来自这里,我把你所做的事情放在清单中,没有任何反应......我已经用另一个功能测试了我的按钮,这个不想去!
  • 要在“收件人”框中自动包含电话号码,请将 setData 代码行更改为 sendIntent.setData(Uri.parse("sms:" + phoneNumber));(感谢 jqpubliq 和 jaydeepw)
  • 当用户通过 Intent ti sms 从我的应用程序发送短信时,我需要检查是否发送了短信,我该怎么做?
【解决方案2】:
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 上运行,它会打开短信列表视图。这就是我需要的!!!
【解决方案3】:

使用

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

【讨论】:

  • 这适用于我的股票应用程序,例如在模拟器上,但它可能不适用于例如 Galaxy S3。
  • @G.Lombard Lombard 是的,此代码不适用于 s3。 s3 的任何解决方案?
【解决方案4】:

我用:

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

【讨论】:

    【解决方案5】:
    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);
    

    【讨论】:

    • 最佳解决方案!谢谢!
    • 请注意,这不适用于 android 4.4 并且可能更高版本...不再支持“vnd.android-dir/mms-sms”
    • 刚刚在 Android 4.4.2 上进行了测试,并且可以正常工作。你能把我链接到那个公告吗? @MaxCh
    • 如果没有像我这样添加电话号码,只需添加:intent.setData(Uri.parse("smsto:" + phoneNumber));
    • android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
    【解决方案6】:

    以下代码将打开预先填充了电话号码的 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 个关于这个的问题,如果我们看到框架代码, setType() 使数据为空,而 setData() 使类型为空。那么在这种情况下,该类型将如何持续存在?
    • 如何更改短信中文字的字体
    【解决方案7】:

    如果您想从其他一些活动中启动 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: 是在短信撰写活动中识别文本和电话号码的键,所以这里要小心。

    【讨论】:

    • 应用程序在启动消息意图时关闭或当我按下返回键时应用程序关闭
    • 首先告诉我当你执行这个代码然后它是否打开写短信功能,如果应用程序在点击返回按钮后关闭,那么你的代码会有一些问题,特别是在公共 void BackPressed( ){ }这样的功能
    • 我没有覆盖 BackPresed Functionn
    【解决方案8】:

    在模拟器上为我工作

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

    【讨论】:

      【解决方案9】:

      短信意图:

      Intent intent = new Intent("android.intent.action.VIEW");
              /** creates an sms uri */
              Uri data = Uri.parse("sms:");
              intent.setData(data);
      

      【讨论】:

        【解决方案10】:

        如果安卓版本是 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);
              }
           }
        

        【讨论】:

        • 我正在使用 KitKat 版本。我想在 To 字段中设置接收方号码。我该如何设置?
        • @KarthikeyanVe 你能试试吗?意图 sendIntent = new Intent(Intent.ACTION_SENDTO); sendIntent.setData(Uri.parse("smsto:phonenumber"));
        • 我试过了。它工作正常。但是当我从消息应用程序中单击后退按钮时,它也会关闭我的应用程序。如果我从消息应用程序返回,它应该返回到我离开的应用程序。
        • 很好的答案。如果您想直接转到默认的短信应用程序,请使用它,就像魅力一样。如果您想要选择器,请在此处查看其他答案。
        • 为什么当我从消息返回时应用程序关闭
        【解决方案11】:

        撰写短信:

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

        【讨论】:

          【解决方案12】:
          Intent eventIntentMessage =getPackageManager()
           .getLaunchIntentForPackage(Telephony.Sms.getDefaultSmsPackage(getApplicationContext));
          startActivity(eventIntentMessage);
          

          【讨论】:

          • 对于 SDK_INT>=19(此 api 可用)它可以工作。事实上,如果你想用消息列表打开短信应用程序,这是我的 Nexus 6 中唯一可行的解​​决方案与牛轧糖
          【解决方案13】:
          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
          }
          

          这样做的最佳方式。

          【讨论】:

          • 只有这段代码对我有用...但是如何避免选择多个短信应用...只有默认会启动..
          【解决方案14】:
          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);
          

          【讨论】:

            【解决方案15】:

            以下代码适用于 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;
            

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

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

            您也可以查看this answer

            【讨论】:

              【解决方案16】:

              与默认短信应用配合使用的最佳代码是。

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

              【讨论】:

                【解决方案17】:

                您可以打开默认短信应用程序并传递如下详细信息:
                注意:如果您要发送到多个号码,请用“;”分隔每个号码字符串内

                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 消息应用程序。我们如何存档?
                【解决方案18】:

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

                【讨论】:

                  【解决方案19】:

                  你可以使用这个,两者都可以在 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);
                  

                  【讨论】:

                    【解决方案20】:

                    您可以使用以下代码sn-p来实现您的目标:

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

                    【讨论】:

                      【解决方案21】:

                      对于 Kotlin 只需这样做:

                      val messageIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:03xxxxxxxxx"))
                          messageIntent.putExtra("sms_body", "Enter your body here")
                          startActivity(messageIntent)
                      

                      【讨论】:

                        猜你喜欢
                        • 2015-09-19
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-10-05
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-08-23
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多