Надішліть SMS за наміром


75

Я хочу надіслати SMS за наміром, але коли я використовую цей код, він перенаправляє мене на неправильний контакт:

Intent intentt = new Intent(Intent.ACTION_VIEW);         
intentt.setData(Uri.parse("sms:"));
intentt.setType("vnd.android-dir/mms-sms");
intentt.putExtra(Intent.EXTRA_TEXT, "");
intentt.putExtra("address",  phone number);
context.startActivity(intentt);

Чому?

Крім того, я знаю спосіб стежити за відправленням SMS, але не знаю, як це кодується:

Starting activity: Intent { 
   act=android.intent.action.SENDTO dat=smsto:%2B**XXXXXXXXXXXX** flg=0x14000000    
   cmp=com.android.mms/.ui.ComposeMessageActivity }

де XXXXXXXXXXXX - це номер телефону.


Спробуйте прочитати вихідний код android, також SmsManager.
JoxTraex

1
Можна також отримати ActivityNotFoundException: No Activity found to handle Intent ("vnd.android-dir/mms-sms"). Краще не використовувати цей метод.
uniruddh

Відповіді:


88

Я розробив цю функціональність з одного блогу. Є два способи відправити SMS.

  1. Відкрити власний SMS-композитор
  2. напишіть своє повідомлення та надішліть із програми Android

Це код 1-го методу.

Main.xml

<?xml version="1.0" encoding="utf-8"?>  
    <RelativeLayout  
        android:id="@+id/relativeLayout1"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        xmlns:android="http://schemas.android.com/apk/res/android">  

            <Button  
                android:id="@+id/btnSendSMS"  
               android:layout_height="wrap_content"  
               android:layout_width="wrap_content"  
               android:text="Send SMS"  
               android:layout_centerInParent="true"  
               android:onClick="sendSMS">  
           </Button>  
   </RelativeLayout>

Діяльність

public class SendSMSActivity extends Activity {  
     /** Called when the activity is first created. */  
     @Override  
     public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.main);  
      }  

     public void sendSMS(View v)  
     {  
         String number = "12346556";  // The number on which you want to send SMS  
         startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null)));  
     }  
    /* or 
     public void sendSMS(View v) 
      { 
     Uri uri = Uri.parse("smsto:12346556"); 
         Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
         it.putExtra("sms_body", "Here you can set the SMS text to be sent"); 
         startActivity(it); 
      } */  
 }

ПРИМІТКА. - У цьому методі вам не потрібен дозвіл SEND_SMS у файлі AndroidManifest.xml.

Для другого способу зверніться до цього БЛОГУ . Тут ви знайдете гарне пояснення.

Сподіваюся, це допоможе вам ...


3
Ще одна річ, для тестування цієї програми ви можете відкрити 2 емулятори; вони мають ідентифікатори типу 5554 і 5555 або щось подібне. Ви використовуєте це як число і тестуєте.
Прем,

Це єдиний робочий спосіб надсилання смс за наміром з усіх пристроїв та версій Android.
uniruddh

@ I-droid: до якого методу ви маєте на увазі?
Marco Altran

@MarcoAltran:sendSMS(View v)
uniruddh

@Prem Найкраще включити вміст із вашого джерела, а потім просто додати посилання на нього. Посилання можуть бути розірвані рано чи пізно, і тоді раптом ваша відповідь не буде містити адекватної інформації
Фарзан

55
Uri uri = Uri.parse("smsto:YOUR_SMS_NUMBER");   
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);   
intent.putExtra("sms_body", "The SMS text");   
startActivity(intent);  

2
Це не працює на Android 4.0.3 (а краще?). Натомість я повинен використовувати Intent.EXTRA_TEXT. Будь-яка ідея чому?
wojciii

1
Щойно перевірив це на декількох пристроях під управлінням Android 6.0.1 та 4.4.4: у всіх випадках "sms_body"працював нормально, Intent.EXTRA_TEXTне працював.
Джонік

35

Створіть намір таким чином:

Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address","your desired phoneNumber");         
smsIntent.putExtra("sms_body","your desired message");
smsIntent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(smsIntent);

Так! Дякую :) Мені це допомогло.
1111161171159459134

Дякую. це те, що я шукав
Сем

6

Спробуйте цей код. Це спрацює

Uri smsUri = Uri.parse("tel:123456");
Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
intent.putExtra("sms_body", "sms text");
intent.setType("vnd.android-dir/mms-sms"); 
startActivity(intent);

Сподіваюся, це допоможе вам.


Здається, щось не так. Я отримую попередження, що встановлення типу перезапише встановлений URI
Janusz

3

Якщо ви хочете отримати певне повідомлення, скористайтеся цим:

String phoneNo = "";//The phone number you want to text
String sms= "";//The message you want to text to the phone

Intent smsIntent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", phoneNo, null));
smsIntent.putExtra("sms_body",sms);
startActivity(smsIntent);

2

Створіть намір таким чином:

   Uri uriSms = Uri.parse("smsto:1234567899");   
   Intent intentSMS = new Intent(Intent.ACTION_SENDTO, uriSms);   
   intentSMS.putExtra("sms_body", "The SMS text");   
   startActivity(intentSMS); 

Звідки it.PutExtraбереться?
Ніксон

1

Сподіваюся, це робота, це працює в моєму додатку

SmsManager.getDefault().sendTextMessage("Phone Number", null, "Message", null, null);

1
Чи потрібен для цього спеціальний дозвіл?
Radon8472

З документації: Використання цього методу вимагає, щоб ваш додаток мав дозвіл SEND_SMS.
shkschneider

Це також працює, лише якщо повідомлення має довжину не більше 160 символів. Якщо це більше 160, ви повинні використовувати sendMultipartTextMessageзамість цьогоsendTextMessage
Ренді

1
Вибачте за голосування, цей метод вимагає дозволів на НАДІСЛАТИ SMS і не буде прийнятий, Google не дозволить публікувати додаток, якщо це не основне SMS-повідомлення. Це означає, що основною функціональністю вашого додатку повинен бути месенджер SMS, є кілька винятків. Однак більшість додатків не буде схвалено і буде відхилено під час розгортання.
MG Developer

1
/**
 * Intent to Send SMS
 * 
 *
 * Extras:
 *
 * "subject"
 *      A string for the message subject (usually for MMS only).
 * "sms_body"
 *      A string for the text message.
 *  EXTRA_STREAM
 *      A Uri pointing to the image or video to attach.
 *
 *  For More Info:
 *  https://developer.android.com/guide/components/intents-common#SendMessage
 *
 * @param phoneNumber on which SMS to send
 * @param message text Message to send with SMS
 */
public void startSMSIntent(String phoneNumber, String message) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    // This ensures only SMS apps respond
    intent.setData(Uri.parse("smsto:"+phoneNumber));
    intent.putExtra("sms_body", message);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

0
  1. Дозвіл маніфесту (ви можете поставити його після або перед "заявкою")
 uses-permission android:name="android.permission.SEND_SMS"/>
  1. наприклад, зробіть кнопку і напишіть код нижче (як написано раніше Premв цій темі) і замініть номер телефону нижче на фактичний номер, він буде працювати:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", "phone_Number", null)));

Нам не потрібен дозвіл SEND_SMS для надсилання sms-повідомлення з наміром.
Swapnil

0

Додайте try-catch, інакше телефони без SIM-версії не вийдуть з ладу.

void sentMessage(String msg) {
    try {
        Intent smsIntent = new Intent(Intent.ACTION_VIEW);
        smsIntent.setType("vnd.android-dir/mms-sms");
        smsIntent.putExtra("sms_body", msg);
        startActivity(smsIntent);
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "No SIM Found", Toast.LENGTH_LONG).show();
    }
}

-1

Це ще одне рішення за допомогою SMSManager:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("PhoneNumber-example:+989147375410", null, "SMS Message Body", null, null);

1
Це рішення більше не прийматиметься, якщо це лише основний додаток для обміну SMS-повідомленнями.
MG Developer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.