通过意图发送短信


75

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

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

1
一个也可以得到ActivityNotFoundException: No Activity found to handle Intent ("vnd.android-dir/mms-sms")。最好不要使用此方法。
uniruddh 2014年

Answers:


88

我已经从一个Blog开发了此功能。您可以通过2种方式发送短信。

  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。您会在这里找到很好的解释。

希望对你有帮助...


3
还有一件事,为了测试该应用程序,您可以打开2个模拟器;他们的ID是5554和5555之类的。您将其用作数字并对其进行测试。
2012年

这是通过intent从所有设备和android版本发送短信的唯一工作方式。
uniruddh 2014年

@ I-droid:您指的是哪种方法?
Marco Altran 2014年

@MarcoAltran:sendSMS(View v)
uniruddh,2014年

@Prem最好包含您来源中的内容,然后仅添加对其的引用。链接可能早晚断开,然后突然您的答案将无法包含足够的信息
Farzan

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

2
这在Android 4.0.3(或更高版本)上不起作用。我必须改用Intent.EXTRA_TEXT。知道为什么吗?
wojciii

1
刚刚在运行Android 6.0.1和4.4.4的几台设备上进行了测试:在所有情况下都可以"sms_body"正常运行,Intent.EXTRA_TEXT但无法正常工作。
约尼克,2013年

34

像这样创建意图:

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

是! 谢谢:)它帮助了我。
1111161171159459134

谢谢。那就是我一直在寻找的东西
山姆

6

试试这个代码。会工作的

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
Janusz

3

如果您想要特定的消息,请使用以下命令:

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

2

像这样创建意图:

   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来的?
尼克松·科斯基

1

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

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

1
这样需要特别许可吗?
Radon8472 2015年

来自文档:使用此方法要求您的应用具有SEND_SMS权限。
shkschneider

仅当消息的长度不超过160个字符时,这也才有效。如果是超过160,你必须使用sendMultipartTextMessage,而不是sendTextMessage
兰迪

1
抱歉,此方法需要SEND SMS权限,并且不会被接受,除非该应用是核心SMS应用,否则Google将不允许发布该应用。这意味着您的应用程序的主要功能必须是SMS Messenger,几乎没有例外。但是,大多数应用不会被批准,并且在推出期间将被拒绝。
MG开发人员

1
/**
 * 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);
    }
}

0
  1. 清单权限(您可以将其放在“应用程序”之后或之前)
 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许可即可使用意图发送短信。
Swapnil

0

添加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();
    }
}

-1

这是使用SMSManager的另一种解决方案:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("PhoneNumber-example:+989147375410", null, "SMS Message Body", null, null);

1
除非它是核心的SMS Messenger应用程序,否则将不再接受该解决方案。
MG开发人员
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.