Руководство Android SMS
View more Tutorials:
В Android, в основном имеется 2 способа, чтобы вы отправили SMS сообщение, это использовать SmsManager и Intent.ACTION_SEND.
SmsManager
SmsManager позволяет вам отправить SMS сообщение напрямую с вашего приложения на любой номер телефона.
Intent.ACTION_SEND
С вашего приложения, вы можете создать неявный Intent (implicit Intent) отправить на систему Android, чтобы запросить систему отправить за вас сообщение. Система откроет лучшее приложение для отправления SMS сообщений, имеющийся наготове в системе, чтобы сделать это и скорее всего он будет использовать приложение Messenger.
Приложение Messenger и есть приложение, отправляющее SMS сообщения, которое имеется на Android который знаком всем пользователям.
Если вы тестируете приложения, отправляющие SMS на Android Emulator (Эмулятор Android), вам нужно знать его номер телефона и вы можете протестировать приложения, отправив SMS на данный номер.
SmsManager это готовый класс в Android, он позволяет вам отправить напрямую SMS на любой номер телефона.
В данном примере я отправлю SMS сообщение на номер телефона тестирующего устройства, поэтому сразу как нажимается кнопка отправить, появится оповещение получения SMS. Просмотрим пример:

Примечание: Если пользователь разрешил приложению отправлять SMS, приложение не будет снова спрашивать пользователя при следующей отправке SMS, поэтому иногда вам нужно удалить разрешение (permission) данное приложению, чтобы полностью протестировать его.
OK, на Androidi Studio создайте project:
- Name: SmsManagerExample
- Package name: org.o7planning.smsmanagerexample
Добавьте XML код ниже в файл AndroidManifest.xml, чтобы разрешить приложению отправить SMS. Примечание: С Android 6.0+ (API Level 23+) ваше приложение должно спрсоить пользователя о разрешении отправления SMS (Смотрите далее в коде примера).
<uses-permission android:name="android.permission.SEND_SMS"/>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.o7planning.smsmanagerexample"> <uses-permission android:name="android.permission.SEND_SMS"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Интерфейс приложения:

activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="20dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:text="Phone Number" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/editText_phoneNumber" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:ems="10" android:hint="Phone Number" android:inputType="phone" android:text="+15555215554" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <TextView android:id="@+id/textView2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:text="Message:" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_phoneNumber" /> <EditText android:id="@+id/editText_message" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:ems="10" android:inputType="text" android:text="Hello, How are you?" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView2" /> <Button android:id="@+id/button_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Send By SmsManager" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_message" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.xml
package org.o7planning.smsmanagerexample; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.telephony.SmsManager; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int MY_PERMISSION_REQUEST_CODE_SEND_SMS = 1; private static final String LOG_TAG = "AndroidExample"; private EditText editTextPhoneNumber; private EditText editTextMessage; private Button buttonSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.editTextPhoneNumber = (EditText) this.findViewById(R.id.editText_phoneNumber); this.editTextMessage = (EditText) this.findViewById(R.id.editText_message); this.buttonSend = (Button) this.findViewById(R.id.button_send); this.buttonSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { askPermissionAndSendSMS(); } }); } private void askPermissionAndSendSMS() { // With Android Level >= 23, you have to ask the user // for permission to send SMS. if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // 23 // Check if we have send SMS permission int sendSmsPermisson = ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS); if (sendSmsPermisson != PackageManager.PERMISSION_GRANTED) { // If don't have permission so prompt the user. this.requestPermissions( new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSION_REQUEST_CODE_SEND_SMS ); return; } } this.sendSMS_by_smsManager(); } private void sendSMS_by_smsManager() { String phoneNumber = this.editTextPhoneNumber.getText().toString(); String message = this.editTextMessage.getText().toString(); try { // Get the default instance of the SmsManager SmsManager smsManager = SmsManager.getDefault(); // Send Message smsManager.sendTextMessage(phoneNumber, null, message, null, null); Log.i( LOG_TAG,"Your sms has successfully sent!"); Toast.makeText(getApplicationContext(),"Your sms has successfully sent!", Toast.LENGTH_LONG).show(); } catch (Exception ex) { Log.e( LOG_TAG,"Your sms has failed...", ex); Toast.makeText(getApplicationContext(),"Your sms has failed... " + ex.getMessage(), Toast.LENGTH_LONG).show(); ex.printStackTrace(); } } // When you have the request results @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // switch (requestCode) { case MY_PERMISSION_REQUEST_CODE_SEND_SMS: { // Note: If request is cancelled, the result arrays are empty. // Permissions granted (SEND_SMS). if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i( LOG_TAG,"Permission granted!"); Toast.makeText(this, "Permission granted!", Toast.LENGTH_LONG).show(); this.sendSMS_by_smsManager(); } // Cancelled or denied. else { Log.i( LOG_TAG,"Permission denied!"); Toast.makeText(this, "Permission denied!", Toast.LENGTH_LONG).show(); } break; } } } // When results returned @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == MY_PERMISSION_REQUEST_CODE_SEND_SMS) { if (resultCode == RESULT_OK) { // Do something with data (Result returned). Toast.makeText(this, "Action OK", Toast.LENGTH_LONG).show(); } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Action canceled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Action Failed", Toast.LENGTH_LONG).show(); } } } }
С вашего приложения, вы можете создать неявный Intent (implicit Intent) отправить на систему Android, чтобы запросить систему отправить для вас сообщение. Система откроет лучшее приложение для отправления SMS имеющийся наготове в системе, чтобы сделать это и скорее всего она будет использовать приложение Messenger.
Приложение Messenger и есть приложение, отправляющее SMS имеющееся на Android, который знаком всем пользователям.
Просмотр примера:

На Android Studio создайте project:
- Name: SMSIntentExample
- Package name: org.o7planning.smsintentexample
Добавьте XML код ниже в файл AndroidManifest.xml, чтобы позволить приложению отправить SMS.
<uses-permission android:name="android.permission.SEND_SMS"/>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.o7planning.smsintentexample"> <uses-permission android:name="android.permission.SEND_SMS"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Интерфейс приложения в примере:

activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="20dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:text="Phone Number" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/editText_phoneNumber" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:ems="10" android:hint="Phone Number" android:inputType="phone" android:text="+15555215554" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <TextView android:id="@+id/textView2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:text="Message:" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_phoneNumber" /> <EditText android:id="@+id/editText_message" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:ems="10" android:inputType="text" android:text="Hello, How are you?" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView2" /> <Button android:id="@+id/button_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Send By Intent.ACTION_SEND" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_message" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.smsintentexample; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final String LOG_TAG = "AndroidExample"; private EditText editTextPhoneNumber; private EditText editTextMessage; private Button buttonSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.editTextPhoneNumber = (EditText) this.findViewById(R.id.editText_phoneNumber); this.editTextMessage = (EditText) this.findViewById(R.id.editText_message); this.buttonSend = (Button) this.findViewById(R.id.button_send); this.buttonSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendSMS_by_Intent_ACTION_SEND(); } }); } private void sendSMS_by_Intent_ACTION_SEND() { String phoneNumber = this.editTextPhoneNumber.getText().toString(); String message = this.editTextMessage.getText().toString(); // Add the phone number in the data Uri uri = Uri.parse("smsto:" + phoneNumber); Intent smsIntent = new Intent(Intent.ACTION_SENDTO, uri); // Add the message at the sms_body extra field smsIntent.putExtra("sms_body", message); try { startActivity(smsIntent); } catch (Exception ex) { Log.e(LOG_TAG, "Your sms has failed... " + ex.getMessage(), ex); Toast.makeText(MainActivity.this, "Your sms has failed... " + ex.getMessage(), Toast.LENGTH_LONG).show(); ex.printStackTrace(); } } }