Android(安卓)发送短信

在 Android 中,您可以使用 SmsManager API 或设备内置的 SMS 应用程序发送 SMS。

在本教程中,我们向您展示了发送短信的两个基本实例:

  • SmsManager API
  • 内置 SMS 应用程序

当然,两者都需要 SEND_SMS 权限。除了上述方法, SmsManager 类中几乎没有其他重要函数可用。以下列出了这些方法:

编号方法 & 描述
1

ArrayList<String> divideMessage(String text)

此方法将消息文本分成几个片段,每个片段都不超过最大 SMS 消息大小。

2

static SmsManager getDefault()

此方法用于获取 SmsManager 的默认实例

3

void sendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent)

此方法用于向特定应用程序端口发送基于数据的 SMS。

4

void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)

发送多部分文本短信。

5

void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)

发送基于文本的短信。


实例

下面的实例实际演示了如何使用 SmsManager 对象向给定的手机号码发送 SMS。

为了实验这个例子,您需要实际的移动设备配备最新的 Android 操作系统,否则您使用模拟器可能会出现问题。

步骤描述
1您将使用 Android Studio IDE 创建一个 Android 应用程序,并将其命名为 com.example.demo 包下的 "My Application"。
2修改 src/MainActivity.java 文件并添加所需代码以处理发送短信。
3修改布局文件 res/layout/activity_main.xml 添加需要的 GUI 组件。我们添加了一个简单的 GUI,用于接收手机号码和发送短信的短信,以及一个发送短信的简单按钮。
4无需在 res/values/strings.xml 中定义默认字符串常量Android工作室负责处理默认常量。
5修改 AndroidManifest.xml
6运行应用程序以启动 Android 模拟器并验证应用程序中所做更改的结果。

以下是修改后的主活动文件的内容 src/com.example.deomo/MainActivity.java

  1. package com.example.demo;
  2. import android.Manifest;
  3. import android.content.pm.PackageManager;
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.support.v4.app.ActivityCompat;
  7. import android.support.v4.content.ContextCompat;
  8. import android.telephony.SmsManager;
  9. import android.util.Log;
  10. import android.view.Menu;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.Toast;
  15. public class MainActivity extends Activity {
  16. private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ;
  17. Button sendBtn;
  18. EditText txtphoneNo;
  19. EditText txtMessage;
  20. String phoneNo;
  21. String message;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. sendBtn = (Button) findViewById(R.id.btnSendSMS);
  27. txtphoneNo = (EditText) findViewById(R.id.editText);
  28. txtMessage = (EditText) findViewById(R.id.editText2);
  29. sendBtn.setOnClickListener(new View.OnClickListener() {
  30. public void onClick(View view) {
  31. sendSMSMessage();
  32. }
  33. });
  34. }
  35. protected void sendSMSMessage() {
  36. phoneNo = txtphoneNo.getText().toString();
  37. message = txtMessage.getText().toString();
  38. if (ContextCompat.checkSelfPermission(this,
  39. Manifest.permission.SEND_SMS)
  40. != PackageManager.PERMISSION_GRANTED) {
  41. if (ActivityCompat.shouldShowRequestPermissionRationale(this,
  42. Manifest.permission.SEND_SMS)) {
  43. } else {
  44. ActivityCompat.requestPermissions(this,
  45. new String[]{Manifest.permission.SEND_SMS},
  46. MY_PERMISSIONS_REQUEST_SEND_SMS);
  47. }
  48. }
  49. }
  50. @Override
  51. public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
  52. switch (requestCode) {
  53. case MY_PERMISSIONS_REQUEST_SEND_SMS: {
  54. if (grantResults.length > 0
  55. &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  56. SmsManager smsManager = SmsManager.getDefault();
  57. smsManager.sendTextMessage(phoneNo, null, message, null, null);
  58. Toast.makeText(getApplicationContext(), "SMS sent.",
  59. Toast.LENGTH_LONG).show();
  60. } else {
  61. Toast.makeText(getApplicationContext(),
  62. "SMS faild, please try again.", Toast.LENGTH_LONG).show();
  63. return;
  64. }
  65. }
  66. }
  67. }
  68. }

下面是 res/layout/activity_main.xml 文件的内容:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context="MainActivity">
  11. <TextView
  12. android:id="@+id/textView1"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="Sending SMS Example"
  16. android:layout_alignParentTop="true"
  17. android:layout_centerHorizontal="true"
  18. android:textSize="30dp" />
  19. <TextView
  20. android:id="@+id/textView2"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:text="My Application "
  24. android:textColor="#ff87ff09"
  25. android:textSize="30dp"
  26. android:layout_below="@+id/textView1"
  27. android:layout_alignRight="@+id/imageButton"
  28. android:layout_alignEnd="@+id/imageButton" />
  29. <ImageButton
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:id="@+id/imageButton"
  33. android:src="@drawable/abc"
  34. android:layout_below="@+id/textView2"
  35. android:layout_centerHorizontal="true" />
  36. <EditText
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:id="@+id/editText"
  40. android:hint="Enter Phone Number"
  41. android:phoneNumber="true"
  42. android:textColorHint="@color/abc_primary_text_material_dark"
  43. android:layout_below="@+id/imageButton"
  44. android:layout_centerHorizontal="true" />
  45. <EditText
  46. android:layout_width="wrap_content"
  47. android:layout_height="wrap_content"
  48. android:id="@+id/editText2"
  49. android:layout_below="@+id/editText"
  50. android:layout_alignLeft="@+id/editText"
  51. android:layout_alignStart="@+id/editText"
  52. android:textColorHint="@color/abc_primary_text_material_dark"
  53. android:layout_alignRight="@+id/imageButton"
  54. android:layout_alignEnd="@+id/imageButton"
  55. android:hint="Enter SMS" />
  56. <Button
  57. android:layout_width="wrap_content"
  58. android:layout_height="wrap_content"
  59. android:text="Send Sms"
  60. android:id="@+id/btnSendSMS"
  61. android:layout_below="@+id/editText2"
  62. android:layout_centerHorizontal="true"
  63. android:layout_marginTop="48dp" />
  64. </RelativeLayout>

下面是 res/values/strings.xml 的内容,定义了常量:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="app_name">myapplication</string>
  4. </resources>

下面是 AndroidManifest.xml 的内容:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.demo" >
  4. <uses-permission android:name="android.permission.SEND_SMS" />
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@drawable/ic_launcher"
  8. android:label="@string/app_name"
  9. android:theme="@style/AppTheme" >
  10. <activity
  11. android:name="com.example.demo.MainActivity"
  12. android:label="@string/app_name" >
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. </application>
  19. </manifest>

让我们尝试运行 My Application 应用程序。假设您已经将实际的 Android 移动设备与计算机连接。要从 Android Studio 运行应用程序,请打开项目的 activity 文件之一,然后单击工具栏上的运行 Eclipse Eclipse Run Icon 图标。在启动应用程序之前,Android studio 安装程序将显示以下窗口,以选择要运行 Android 应用程序的选项。选择您的移动设备作为选项,然后检查将显示以下屏幕的移动设备:

现在,您可以输入所需的手机号码并在该号码上发送短信。最后,单击 Send SMS 按钮发送短信。确保您的 GSM/CDMA 连接正常,可以将短信发送给收件人。

你可以用逗号分隔一个短信号码,然后在你的程序中你必须将它们解析成一个数组字符串,最后你可以使用一个循环向所有给定的号码发送消息。这就是你如何编写自己的短信客户端。下一节将向您展示如何使用现有的 SMS 客户端发送 SMS。


使用内置 Intent 发送短信

您可以使用 Android Intent 通过调用 Android 的内置短信功能来发送短信。以下部分解释了发送 SMS 所需的 Intent 对象的不同部分。


Intent 对象 - 发送 SMS 的行为

您将使用 ACTION_VIEW 操作启动安装在 Android 设备上的 SMS 客户端。以下是使用 ACTION_VIEW 操作创建 Intent 意图的简单语法。

  1. Intent smsIntent = new Intent(Intent.ACTION_VIEW);

Intent 对象 - 发送短信的数据/类型

要发送 SMS,您需要使用 setData() 方法将 smsto: 指定为 URI,使用 setType() 方法指定数据类型将为 vnd.android-dir/mms-sms,如下所示:

  1. smsIntent.setData(Uri.parse("smsto:"));
  2. smsIntent.setType("vnd.android-dir/mms-sms");

Intent 对象 - 附加数据发送短信

Android 内置支持添加电话号码和短信发送短信,如下所示:

  1. smsIntent.putExtra("address" , new String("0123456789;3393993300"));
  2. smsIntent.putExtra("sms_body" , "Test SMS to Angilla");

这里,addresssms_body 区分大小写,只能用小写字符指定。您可以在单个字符串中指定多个数字,但用分号(;)分隔。


实例

下面的实例向您实际演示了如何使用 Intent 对象启动 SMS 客户端向给定的收件人发送 SMS。

为了实验这个例子,您需要实际的移动设备配备最新的 Android 操作系统,否则使用模拟器可能会出问题。

步骤描述
1您将使用Android studio IDE创建一个Android应用程序,并将其命名为 com.example.demo 包下的 My Application
2修改 src/MainActivity.java 文件并添加所需代码以处理发送短信。
3修改布局文件 res/layout/activity_main.xml 添加 GUI 组件。我们添加了一个简单的按钮来启动 SMS 客户端。
4无需定义默认常量。Android Studio 处理默认常量。
5修改 AndroidManifest.xml
6运行应用程序以启动 Android 模拟器并验证应用程序中所做更改的结果。

以下是修改后的主活动文件的内容 src/com.example.demo/MainActivity.java

  1. package com.example.demo;
  2. import android.net.Uri;
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.util.Log;
  7. import android.view.Menu;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.Toast;
  11. public class MainActivity extends Activity {
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. Button startBtn = (Button) findViewById(R.id.button);
  17. startBtn.setOnClickListener(new View.OnClickListener() {
  18. public void onClick(View view) {
  19. sendSMS();
  20. }
  21. });
  22. }
  23. protected void sendSMS() {
  24. Log.i("Send SMS", "");
  25. Intent smsIntent = new Intent(Intent.ACTION_VIEW);
  26. smsIntent.setData(Uri.parse("smsto:"));
  27. smsIntent.setType("vnd.android-dir/mms-sms");
  28. smsIntent.putExtra("address" , new String ("01234"));
  29. smsIntent.putExtra("sms_body" , "Test ");
  30. try {
  31. startActivity(smsIntent);
  32. finish();
  33. Log.i("Finished sending SMS...", "");
  34. } catch (android.content.ActivityNotFoundException ex) {
  35. Toast.makeText(MainActivity.this,
  36. "SMS faild, please try again later.", Toast.LENGTH_SHORT).show();
  37. }
  38. }
  39. @Override
  40. public boolean onCreateOptionsMenu(Menu menu) {
  41. // Inflate the menu; this adds items to the action bar if it is present.
  42. getMenuInflater().inflate(R.menu.main, menu);
  43. return true;
  44. }
  45. }

下面是 res/layout/activity_main.xml 文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. android:paddingBottom="@dimen/activity_vertical_margin"
  10. tools:context=".MainActivity">
  11. <TextView
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="Drag and Drop Example"
  15. android:id="@+id/textView"
  16. android:layout_alignParentTop="true"
  17. android:layout_centerHorizontal="true"
  18. android:textSize="30dp" />
  19. <TextView
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="My Application "
  23. android:id="@+id/textView2"
  24. android:layout_below="@+id/textView"
  25. android:layout_centerHorizontal="true"
  26. android:textSize="30dp"
  27. android:textColor="#ff14be3c" />
  28. <ImageView
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:id="@+id/imageView"
  32. android:src="@drawable/abc"
  33. android:layout_marginTop="48dp"
  34. android:layout_below="@+id/textView2"
  35. android:layout_centerHorizontal="true" />
  36. <Button
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:text="Compose SMS"
  40. android:id="@+id/button"
  41. android:layout_below="@+id/imageView"
  42. android:layout_alignRight="@+id/textView2"
  43. android:layout_alignEnd="@+id/textView2"
  44. android:layout_marginTop="54dp"
  45. android:layout_alignLeft="@+id/imageView"
  46. android:layout_alignStart="@+id/imageView" />
  47. </RelativeLayout>

下面是 res/values/strings.xml 文件定义了常量:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="app_name">myapplication</string>
  4. </resources>

下面是默认的 AndroidManifest.xml 文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.demo" >
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@drawable/ic_launcher"
  7. android:label="@string/app_name"
  8. android:theme="@style/AppTheme" >
  9. <activity
  10. android:name="com.example.demo.MainActivity"
  11. android:label="@string/app_name" >
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. </manifest>

让我们尝试运行 My Application 应用程序。假设您已经将实际的 Android 移动设备与计算机连接。要从 Android Studio 运行应用程序,请打开项目的 activity 文件之一,然后单击工具栏上的运行 Eclipse Eclipse Run Icon 图标。在启动应用程序之前,Android studio 安装程序将显示以下窗口,以选择要运行 Android 应用程序的选项。选择您的移动设备作为选项,然后检查将显示以下屏幕的移动设备:

选择您的移动设备作为选项,然后检查将显示以下屏幕的移动设备:

使用 Compose SMS 按钮启动 Android 内置短信客户端,如下所示:

您可以修改任何一个给定的默认字段,最后使用发送短信按钮将短信发送给所提到的收件人。