Отправить SMS программно




Отправить 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 программно, то вам надо доказать компании, что это просто необходимо приложению. Вы заполняете длинную анкету и ждёте решения. Иначе вашу программу просто удалят из магазина приложений.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-28 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: