Пока я использую следующий код для отправки SMS на другой телефон через свое приложение.

Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "sms:" + srcNumber)); 
                    intent.putExtra( "sms_body", message ); 
                    startActivity(intent);

Однако это открывает собственное приложение для обмена сообщениями, тем самым переводя активность моего приложения в фоновый режим. Можно ли отправить SMS напрямую без открытия собственного приложения для обмена сообщениями? Если да, то как?

79
SoulRayder 11 Окт 2014 в 08:58
Проверьте это
 – 
MysticMagicϡ
11 Окт 2014 в 09:00
О, gr8 downvoter, скажите мне, пожалуйста, почему? :)
 – 
SoulRayder
11 Окт 2014 в 09:16
Возможный дубликат Отправить SMS в android
 – 
Shabbir Dhangot
11 Окт 2014 в 09:20
1
Здесь явно не упоминается основная проблема открытия собственного приложения для обмена сообщениями, хотя я согласен, что упоминаются оба решения. Это может быть полезным материалом для тех, кому нужен прямой подход к отправке SMS, поскольку я явно выделил различия в результатах, полученных с использованием этих двух подходов.
 – 
SoulRayder
11 Окт 2014 в 09:23

6 ответов

Лучший ответ

Вы можете отправлять сообщения из своего приложения через это:

public void sendSMS(String phoneNo, String msg) {
    try {      
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, msg, null, null);    
        Toast.makeText(getApplicationContext(), "Message Sent",
                Toast.LENGTH_LONG).show();
    } catch (Exception ex) {
        Toast.makeText(getApplicationContext(),ex.getMessage().toString(),
                Toast.LENGTH_LONG).show();
        ex.printStackTrace();
    } 
}

Кроме того, вам необходимо предоставить разрешение SEND_SMS в AndroidManifest.xml для отправки сообщения.

<uses-permission android:name="android.permission.SEND_SMS" />

132
Anuj Raghuvanshi 14 Янв 2022 в 22:00
9
Это работает только для сборок, в которых цель API старше 23. Для более новых сборок вам нужно перепрыгнуть через больше препятствий, поскольку Google изменил способ работы разрешений для «опасных» разрешений, таких как SEND_SMS. Вздох.
 – 
SMBiggs
16 Июн 2016 в 18:12
5
Обратите внимание: если вы публикуете свое приложение в Google Play, это является нарушением Политики и в конечном итоге ваше приложение будет приостановлено.
 – 
MIKE PERETZ
21 Май 2018 в 14:24
2
Верно, см. это play.google.com/about/privacy-security -обман/разрешения. Я получил письмо за использование разрешений, связанных с SMS, в приложении.
 – 
praveenb
20 Ноя 2018 в 14:24
5
Это старый ответ, и в настоящее время он нарушает политику Google Play, поэтому, пожалуйста, не используйте приведенный выше код.
 – 
Himanshu Agarwal
20 Ноя 2018 в 19:42
4
На данный момент доступ к журналу вызовов или sms считается нарушением политики без запроса пользователя о том, чтобы сделать ваше приложение обработчиком sms / журнала вызовов по умолчанию.
 – 
MIKE PERETZ
20 Ноя 2018 в 22:03
public void sendLongSMS() {
    String phoneNumber = "0123456789";
    String message = "Hello World! Now we are going to demonstrate " + 
        "how to send a message with more than 160 characters from your Android application.";
    SmsManager smsManager = SmsManager.getDefault();
    ArrayList<String> parts = smsManager.divideMessage(message); 
    smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null);
}

И не забудьте добавить

<uses-permission android:name="android.permission.SEND_SMS"/>
21
A. Badakhshan 25 Окт 2016 в 10:48

Отправка смс с запросом разрешения:

Добавить в манифест:

<uses-permission android:name="android.permission.SEND_SMS" />

Добавить функцию Java:

void sendSmsMsgFnc(String mblNumVar, String smsMsgVar)
{
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED)
    {
        try
        {
            SmsManager smsMgrVar = SmsManager.getDefault();
            smsMgrVar.sendTextMessage(mblNumVar, null, smsMsgVar, null, null);
            Toast.makeText(getApplicationContext(), "Message Sent",
                    Toast.LENGTH_LONG).show();
        }
        catch (Exception ErrVar)
        {
            Toast.makeText(getApplicationContext(),ErrVar.getMessage().toString(),
                    Toast.LENGTH_LONG).show();
            ErrVar.printStackTrace();
        }
    }
    else
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            requestPermissions(new String[]{Manifest.permission.SEND_SMS}, 10);
        }
    }

}
12
Sujay U N 18 Июл 2017 в 22:16
Это будет игнорировать первое сообщение до тех пор, пока пользователь не предоставит разрешение (или многие сообщения будут игнорироваться до тех пор, пока не будет предоставлено разрешение)
 – 
FindOutIslamNow
22 Авг 2021 в 06:59

Да, нашел ответ на свой вопрос :)

Используйте следующий код для того же:

 SmsManager sms = SmsManager.getDefault();
                     sms.sendTextMessage(srcNumber, null, message, null, null);

Для этого требуется, чтобы в XML-манифесте Android было объявлено следующее разрешение.

  <uses-permission android:name="android.permission.SEND_SMS"/>
7
SoulRayder 11 Окт 2014 в 09:05

Полноценная функция отправки смс с отчетом о доставке.

//sent sms
private void sendSMS(String phoneNumber, String message) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

    // ---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {

            switch (getResultCode()) {

                case Activity.RESULT_OK:

                    Toast.makeText(getBaseContext(), "SMS sent",
                            Toast.LENGTH_SHORT).show();
                    break;

                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:

                    Toast.makeText(getBaseContext(), "Generic failure",
                            Toast.LENGTH_SHORT).show();
                    break;

                case SmsManager.RESULT_ERROR_NO_SERVICE:

                    Toast.makeText(getBaseContext(), "No service",
                            Toast.LENGTH_SHORT).show();
                    break;

                case SmsManager.RESULT_ERROR_NULL_PDU:

                    Toast.makeText(getBaseContext(), "Null PDU",
                            Toast.LENGTH_SHORT).show();
                    break;

                case SmsManager.RESULT_ERROR_RADIO_OFF:

                    Toast.makeText(getBaseContext(), "Radio off",
                            Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(SENT));

    // ---when the SMS has been delivered---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {

            switch (getResultCode()) {

                case Activity.RESULT_OK:

                    Toast.makeText(getBaseContext(), "SMS delivered",
                            Toast.LENGTH_SHORT).show();
                    break;

                case Activity.RESULT_CANCELED:

                    Toast.makeText(getBaseContext(), "SMS not delivered",
                            Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(DELIVERED));

    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
6
Atiar Talukdar 12 Июн 2020 в 00:07
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, sms, null, null);
3
Himanshu Agarwal 11 Окт 2014 в 09:09