【问题标题】:Send a SMS via intent通过意图发送短信
【发布时间】:2012-04-05 14:52:39
【问题描述】:

我想通过 Intent 发送短信,但是当我使用此代码时,它会将我重定向到错误的联系人:

Intent intentt = new Intent(Intent.ACTION_VIEW);         
intentt.setData(Uri.parse("sms:"));
intentt.setType("vnd.android-dir/mms-sms");
intentt.putExtra(Intent.EXTRA_TEXT, "");
intentt.putExtra("address",  phone number);
context.startActivity(intentt);

为什么?

另外,我知道一种跟踪短信发送的方法,但我不知道如何编码:

Starting activity: Intent { 
   act=android.intent.action.SENDTO dat=smsto:%2B**XXXXXXXXXXXX** flg=0x14000000    
   cmp=com.android.mms/.ui.ComposeMessageActivity }

其中 XXXXXXXXXXXX 是电话号码。

【问题讨论】:

  • 尝试阅读android源代码,还有SmsManager。
  • 也可以得到ActivityNotFoundException: No Activity found to handle Intent ("vnd.android-dir/mms-sms")。最好不要使用这种方法。

标签: android android-intent sms


【解决方案1】:

我从一个博客开发了这个功能。您可以通过两种方式发送短信。

  1. 打开原生短信编辑器
  2. 编写您的消息并从您的 Android 应用程序发送

这是第一种方法的代码。

Main.xml

<?xml version="1.0" encoding="utf-8"?>  
    <RelativeLayout  
        android:id="@+id/relativeLayout1"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        xmlns:android="http://schemas.android.com/apk/res/android">  

            <Button  
                android:id="@+id/btnSendSMS"  
               android:layout_height="wrap_content"  
               android:layout_width="wrap_content"  
               android:text="Send SMS"  
               android:layout_centerInParent="true"  
               android:onClick="sendSMS">  
           </Button>  
   </RelativeLayout>

活动

public class SendSMSActivity extends Activity {  
     /** Called when the activity is first created. */  
     @Override  
     public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.main);  
      }  

     public void sendSMS(View v)  
     {  
         String number = "12346556";  // The number on which you want to send SMS  
         startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null)));  
     }  
    /* or 
     public void sendSMS(View v) 
      { 
     Uri uri = Uri.parse("smsto:12346556"); 
         Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
         it.putExtra("sms_body", "Here you can set the SMS text to be sent"); 
         startActivity(it); 
      } */  
 }

注意:- 在此方法中,您不需要 AndroidManifest.xml 文件中的 SEND_SMS 权限。

对于第二种方法,请参阅此BLOG。你会从这里找到一个很好的解释。

希望对你有所帮助...

【讨论】:

  • 还有一件事,为了测试这个应用程序的目的,你可以打开2个模拟器;他们有 5554 和 5555 之类的 id 或类似的东西。您将其用作数字并对其进行测试。
  • 这是从所有设备和安卓版本通过意图发送短信的唯一有效方式。
  • @I-droid:你指的是哪种方法?
  • @MarcoAltran: sendSMS(View v)
  • @Prem 最好包含来自您的来源的内容,然后添加对它的引用。链接迟早会被破坏,然后你的答案会突然不包含足够的信息
【解决方案2】:
Uri uri = Uri.parse("smsto:YOUR_SMS_NUMBER");   
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);   
intent.putExtra("sms_body", "The SMS text");   
startActivity(intent);  

【讨论】:

  • 这不适用于 Android 4.0.3(以及更好的版本?)。我必须改用 Intent.EXTRA_TEXT 。知道为什么吗?
  • 刚刚在几台运行 Android 6.0.1 和 4.4.4 的设备上进行了测试:在所有情况下,"sms_body" 工作正常,Intent.EXTRA_TEXT 没有工作。
【解决方案3】:

像这样创建意图:

Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address","your desired phoneNumber");         
smsIntent.putExtra("sms_body","your desired message");
smsIntent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(smsIntent);

【讨论】:

  • 是的!谢谢 :) 它帮助了我。
  • 谢谢。这就是我一直在寻找的
  • 小心它是 2021,这不再起作用了.. 它没有在“打开方式”选项中显示默认的 SMS 提供程序。特别是谷歌的默认“消息”应用没有出现在选择中
【解决方案4】:

试试这个代码。它会工作

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

希望这会对你有所帮助。

【讨论】:

  • 似乎有问题我收到警告说设置类型将覆盖设置的 URI
  • 2021,这不再起作用了。它不会在“打开方式”选项中显示默认的 SMS 提供程序。特别是谷歌的默认“消息”应用没有出现在选择中
【解决方案5】:

如果你想要某条消息,请使用:

String phoneNo = "";//The phone number you want to text
String sms= "";//The message you want to text to the phone

Intent smsIntent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", phoneNo, null));
smsIntent.putExtra("sms_body",sms);
startActivity(smsIntent);

【讨论】:

    【解决方案6】:
       Uri uriSms = Uri.parse("smsto:1234567899");   
       Intent intentSMS = new Intent(Intent.ACTION_SENDTO, uriSms);   
       intentSMS.putExtra("sms_body", "The SMS text");   
       startActivity(intentSMS); 
    

    【讨论】:

    • it.PutExtra 来自哪里?
    【解决方案7】:

    希望这是工作,这在我的应用程序中工作

    SmsManager.getDefault().sendTextMessage("Phone Number", null, "Message", null, null);
    

    【讨论】:

    • 这种方式需要特别许可吗?
    • 来自文档:使用此方法需要您的应用具有 SEND_SMS 权限。
    • 这也仅适用于消息为 160 个字符或更少的情况。如果超过 160,则必须使用 sendMultipartTextMessage 而不是 sendTextMessage
    • 抱歉投票,此方法需要 SEND SMS 权限且不会被接受,Google 不允许发布该应用,除非它是核心 SMS 应用。这意味着您的应用程序的主要功能必须是 SMS Messenger,很少有例外。但是,大多数应用程序不会被批准,并且会在推出期间被拒绝。
    【解决方案8】:
    /**
     * Intent to Send SMS
     * 
     *
     * Extras:
     *
     * "subject"
     *      A string for the message subject (usually for MMS only).
     * "sms_body"
     *      A string for the text message.
     *  EXTRA_STREAM
     *      A Uri pointing to the image or video to attach.
     *
     *  For More Info:
     *  https://developer.android.com/guide/components/intents-common#SendMessage
     *
     * @param phoneNumber on which SMS to send
     * @param message text Message to send with SMS
     */
    public void startSMSIntent(String phoneNumber, String message) {
        Intent intent = new Intent(Intent.ACTION_SENDTO);
        // This ensures only SMS apps respond
        intent.setData(Uri.parse("smsto:"+phoneNumber));
        intent.putExtra("sms_body", message);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }
    

    【讨论】:

      【解决方案9】:
      1. manifest 权限(可以放在“申请”之后或之前)
       uses-permission android:name="android.permission.SEND_SMS"/>
      
      1. 例如制作一个按钮并编写以下代码(如之前在此线程中由Prem 编写的那样)并将下面的phone_Number 替换为实际号码,它将起作用:
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", "phone_Number", null)));
      

      【讨论】:

      • 我们不需要 SEND_SMS 权限即可使用意图发送短信。
      【解决方案10】:

      添加 try-catch 否则没有 sim 卡的手机会崩溃。

      void sentMessage(String msg) {
          try {
              Intent smsIntent = new Intent(Intent.ACTION_VIEW);
              smsIntent.setType("vnd.android-dir/mms-sms");
              smsIntent.putExtra("sms_body", msg);
              startActivity(smsIntent);
          } catch (Exception e) {
              e.printStackTrace();
              Toast.makeText(this, "No SIM Found", Toast.LENGTH_LONG).show();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多