Отправить SMS через намерение ACTION_VIEW
Код не отправляет SMS-сообщение, а только запускает программу для отправки SMS с заданным текстом. Вам остаётся только указать получателя. Отдельных разрешений не требуется.
IntentsmsIntent = newIntent(Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("sms_body", "Some SMS text");
startActivity(smsIntent);
Можно указать и номер адресата
Uri smsNumber = Uri.parse("sms:14155551858");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(smsNumber);
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
startActivity(intent);
Отправить SMS черезнамерение ACTION_SENDTO
При помощи ACTION_SENDTO можно не только подготовить заранее текст сообщения, но и указать номер телефона получателя. В качестве данных для намерения укажите номер адресата, используя схему sms:. С помощью дополнительного параметра sms_body задайте текст сообщения.
Добавим на форму два текстовых поля для номера телефона и текста сообщения. Далеесамкод:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditTextphoneNumberEditText = (EditText) findViewById(R.id.editTextPhoneNumber);
final EditTextsmsTextEditText = (EditText) findViewById(R.id.editTextSmsText);
final Button sendButton = (Button) findViewById(R.id.buttonSms);
sendButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) {
String smsNumber = phoneNumberEditText.getText().toString();
String smsText = smsTextEditText.getText().toString();
Uri uri = Uri.parse("sms:" + smsNumber);
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, uri);
smsIntent.putExtra("sms_body", smsText);
startActivity(smsIntent);
}
});
}
При запуске примера, показанного в листинге, пользователю, вероятно, будет предложено выбрать одно из нескольких приложений, способных выполнять запросы подобного рода, включая Gmail, клиент для работы с e-mail и программу для отправки SMS.
В старых примерах использовался протокол smsto:, но сейчас используют новый способ. Я не заметил, когда произошла замена.
Отправить SMS программно
Итак, мы можем запустить системное приложение и отправить сообщение стандартным способом. Теперь рассмотрим пример отправки SMS напрямую из своей программы. В Android для этих целей есть специальный класс android.telephony.SmsManager. Чтобы получить доступ к объекту, нужно вызвать статический метод SmsManager.getDefault().
Не забывайте прописывать в манифесте разрешение для отправки сообщений:
<uses-permission android:name="android.permission.SEND_SMS"/>
Добавим два текстовых поля для телефонного номера и текста сообщений, а также кнопку для отправки SMS. Код для отправки:
importandroid.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class SMSActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditTextedittextSmsNumber = (EditText) findViewById(R.id.smsnumber);
final EditTextedittextSmsText = (EditText) findViewById(R.id.smstext);
Button buttonSendSms = (Button) findViewById(R.id.sendsms);
buttonSendSms.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
SmsManagersmsManager = SmsManager.getDefault();
String smsNumber = edittextSmsNumber.getText().toString();
String smsText = edittextSmsText.getText().toString();
// отправляемсообщение
smsManager
.sendTextMessage(smsNumber, null, smsText, null, null);
}
});
}
}
В методе sendTextMessage() обычно указывают первый и третий параметры. Первый параметр задаёт номер телефона получателя, второй параметр позволяет указать номер SMS-центра (если используется null, то берется из настроек телефона), третий параметр содержит сам текст, четвёртый параметр отслеживает факт отправки, а пятый параметр - факт доставки сообщения.
В Android 6.0 код перестанет работать, так как изменилась система регистрации разрешений. Недостаточно просто указать в манифесте нужное разрешение, следует также запросить разрешение у пользователя программно. Перепишемпример.
import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SmsManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 1;
Button callButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT>= 23) {
if (checkPermission()) {
Log.e("permission", "Permission already granted.");
} else {
//If the app doesn’t have the SEND_SMS permission, request it//
requestPermission();
}
}
}
public void onClick(View view) {
final EditTextphoneNumber = findViewById(R.id.edit_phone);
final EditTextsmsMessage = findViewById(R.id.edit_sms);
String phoneNum = phoneNumber.getText().toString();
String sms = smsMessage.getText().toString();
if (!TextUtils.isEmpty(phoneNum) &&!TextUtils.isEmpty(sms)) {
if (checkPermission()) {
SmsManagersmsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNum, null, sms, null, null);
} else {
Toast.makeText(MainActivity.this, "Permission denied", Toast.LENGTH_SHORT).show();
}
}
}
public booleancheckPermission() {
int smsPermissionResult = ContextCompat.checkSelfPermission(getApplicationContext(),
Manifest.permission.SEND_SMS);
return smsPermissionResult == PackageManager.PERMISSION_GRANTED;
}
private void requestPermission() {
ActivityCompat.requestPermissions(MainActivity.this, new String[]
{
Manifest.permission.SEND_SMS
}, PERMISSION_REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
callButton = findViewById(R.id.button_call);
if (grantResults.length> 0) {
booleansmsPermission = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (smsPermission) {
Toast.makeText(MainActivity.this,
"Permission accepted", Toast.LENGTH_LONG).show();
//If the permission is denied…
} else {
Toast.makeText(MainActivity.this,
"Permission denied", Toast.LENGTH_LONG).show();
// disable the call button.//
callButton.setEnabled(false);
}
break;
}
}
}
}
В Android Pie требования ужесточились. Если вы используете SMS программно, то вам надо доказать компании, что это просто необходимо приложению. Вы заполняете длинную анкету и ждёте решения. Иначе вашу программу просто удалят из магазина приложений.