запустити sms-додаток із наміром


144

У мене питання про наміри ... Я намагаюся запустити додаток sms ...

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setType("vnd.android-dir/mms-sms");
int flags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |
    Intent.FLAG_ACTIVITY_CLEAR_TOP;
intent.setFlags(flags);
intent.setData(Uri.parse("content://sms/inbox"));
context.startActivity(intent);

тож ви бачите, що я занадто багато речей вкладав у свої наміри, але це тому, що я не знаю, як мені це зробити ... Дякую


1
Оформити замовлення gist.github.com/gelldur/9c199654c91b13478979 Ви можете поділитися за допомогою SMS-програми
Давід Дрозд

Відповіді:


238

Для початку запуску sms-діяльності все, що вам потрібно, це:

Intent sendIntent = new Intent(Intent.ACTION_VIEW);         
sendIntent.setData(Uri.parse("sms:"));

Ви можете додати додаткових даних, щоб заповнити своє власне повідомлення тощо

sendIntent.putExtra("sms_body", x); 

тоді просто запустіть активність із наміром.

startActivity(sendIntent);

Я спробував, але коли я пишу саме те, що ви даєте, поверніть консоль затемнення (при компілюванні) "Не знайдено жодної запускової активності!"
Олів'є6969

Гаразд, чи є у вас маніфест активність із такими атрибутами в його фільтрі намірів? <дія android: name = "android.intent.action.MAIN" /> <категорія android: name = "android.intent.category.LAUNCHER" />
jqpubliq

насправді, запуск походить від appwidgetactivity. Перхаупс це відбувається звідси, я поміщаю те, що ви зробили в маніфесті, і нічого не відбувається ... Я перевіряю свою кнопку з іншою функцією, і ця ця не хоче йти !!
Олів’є6969

22
щоб автоматично включити номер телефону у поле "до", змінити рядок коду setData на sendIntent.setData(Uri.parse("sms:" + phoneNumber));(дякую jqpubliq та jaydeepw)
tmr

2
мені потрібно перевірити, надсилається чи ні SMS, коли користувач надсилатиме SMS-повідомлення з мого додатку через наміри ти sms, як я можу це зробити?
користувач

139
Intent smsIntent = new Intent(Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address", "12125551212");
smsIntent.putExtra("sms_body","Body of Message");
startActivity(smsIntent);

4
Найкраще рішення! Дякую!
Нік

20
Будьте в курсі, це не працюватиме для Android 4.4 і, ймовірно, вгору ... "vnd.android-dir / mms-sms" більше не підтримується
Max Ch

2
Щойно тестований на Android 4.4.2 і він працює. Чи можете ви, будь ласка, зв’язати мене з цим оголошенням? @MaxCh
theknut

3
Якщо номер телефону не додано, як у моєму випадку, просто додайте:intent.setData(Uri.parse("smsto:" + phoneNumber));
Утопія

4
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
Нгуен Мінь Бінь

49

Якщо версія для Android є Kitkat або вище, користувачі можуть змінити програму sms за замовчуванням. Цей метод отримає програму sms за замовчуванням та запустить програму sms за замовчуванням.

private void sendSMS() {    
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) // At least KitKat
      {
         String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(this); // Need to change the build to API 19

         Intent sendIntent = new Intent(Intent.ACTION_SEND);
         sendIntent.setType("text/plain");
         sendIntent.putExtra(Intent.EXTRA_TEXT, "text");

         if (defaultSmsPackageName != null)// Can be null in case that there is no default, then the user would be able to choose
         // any app that support this intent.
         {
            sendIntent.setPackage(defaultSmsPackageName);
         }
         startActivity(sendIntent);

      }
      else // For early versions, do what worked for you before.
      {
         Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
         smsIntent.setType("vnd.android-dir/mms-sms");
         smsIntent.putExtra("address","phoneNumber");         
         smsIntent.putExtra("sms_body","message");
         startActivity(smsIntent);
      }
   }

2
Я використовую версію KitKat. Я хочу встановити номер приймача в полі To. Як я можу це встановити?
Karthikeyan Ve

3
@KarthikeyanVe, будь ласка, ви можете спробувати? Намір sendIntent = новий намір (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ("smsto: номер телефону"));
android_developer

Я намагався. Його добре працює. Але коли я натискаю кнопку "Назад" у додатку для повідомлення, це також закриває мою програму. Якщо я знову натиснув додаток для повідомлення, він повинен повернутися до мого додатка, де я поїхав.
Karthikeyan Ve

2
Чудова відповідь. Використовуйте, якщо ви хочете перейти безпосередньо до програми за замовчуванням SMS, працює як шарм. Якщо ви хочете, щоб вибрати, дивіться інші відповіді тут.
Неманя Ковачевич

1
чому програма закривається, коли я повертаюся з повідомлення
Мухаммед Юнас

31
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

Це все, що вам потрібно.


код працює на Android 4.2.2, він відкриває перегляд списку для sms. ось що мені потрібно !!!
VISHAL VIRADIA

22

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

Uri sms_uri = Uri.parse("smsto:+92xxxxxxxx"); 
Intent sms_intent = new Intent(Intent.ACTION_SENDTO, sms_uri); 
sms_intent.putExtra("sms_body", "Good Morning ! how r U ?"); 
startActivity(sms_intent); 

Примітка: тут клавіші " sms_bodyі" smsto:є для розпізнавання тексту та номера телефону під час створення SMS-повідомлень, тому будьте уважні тут.


додаток закрито, коли воно починає намір повідомлення або коли я натискаю клавішу назад, додаток закрито
Muhammad Younas

Перш за все, скажіть мені, коли ви виконуєте цей код, тоді він відкриває функцію запису sms. Якщо програма закриється після натискання кнопки "назад", то у вашому коді виникне якась проблема, особливо в публічній недійсності функція BackPress () {} як ця
Pir Фахім Шах

я не перезаписав функцію BackPresed
Мухаммед Юнас

17

Ось код, який відкриє активність SMS, попередньо заповнену номером телефону, на який потрібно надіслати SMS. Це чудово працює як на емуляторі, так і на пристрої .

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.setData(Uri.parse("sms:" + phoneNumber));
startActivity(smsIntent);

1
як я можу долучити зображення до цього повідомлення?
невирішений

У мене є запитання щодо цього, якщо ми бачимо рамковий код, setType () робить дані як null, а setData () робить тип нульовим. Тож як буде зберігатися тип у цьому випадку?
AndroidGuy

як ми можемо змінити шрифт тексту в смс
jyomin

5

Використовуйте

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.android.mms", "com.android.mms.ui.ConversationList");

1
Це працює для мене з фондовим додатком, наприклад, на емуляторі, але це, мабуть, не працює на Galaxy S3, наприклад.
Г. Ломбард

1
@ G.Lombard Lombard Так, цей код не працює на s3. будь-яке рішення для s3?
Вівек Кумар Срівастава

4

Я використовую:

Intent sendIntent = new Intent(Intent.ACTION_MAIN);
sendIntent.putExtra("sms_body", "text");
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

4
Intent eventIntentMessage =getPackageManager()
 .getLaunchIntentForPackage(Telephony.Sms.getDefaultSmsPackage(getApplicationContext));
startActivity(eventIntentMessage);

Для SDK_INT> = 19 (де ця api доступна) вона працює. Насправді це єдине робоче рішення в моєму Nexus 6 з Nougat, якщо ви хочете відкрити додаток sms із переліком повідомлень
lujop

3
try {
    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setData(Uri.parse("smsto:" + Uri.encode(number)));
    smsIntent.putExtra("address", number);
    smsIntent.putExtra("sms_body", message);

    PackageManager pm = activity.getPackageManager();
    List<ResolveInfo> resInfo = pm.queryIntentActivities(smsIntent, 0);

    for (int i = 0; i < resInfo.size(); i++) {
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;

        if (packageName.contains("sms")) {
            //Log.d("TAG", packageName + " : " + ri.activityInfo.name);
            smsIntent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
        }
    }
    activity.startActivity(smsIntent);
} catch (Exception e) {
    // Handle Error
}

Найкращий спосіб зробити це.


Тільки цей код працює для мене ... Однак як уникнути вибору декількох SMS-програм ... почнеться лише за замовчуванням ..
Махбубур Рахман Хан

3

Ви можете відкрити програму sms за замовчуванням та передати деталі, як показано нижче:
Примітка. Якщо ви хочете надіслати багато номерів, розділіть кожне число ";" всередині рядка

String mblNumVar = "9876543210;9123456789";
Intent smsMsgAppVar = new Intent(Intent.ACTION_VIEW);
smsMsgAppVar.setData(Uri.parse("sms:" +  mblNumVar));
smsMsgAppVar.putExtra("sms_body", "Hello Msg Tst Txt");
startActivity(smsMsgAppVar);

| Або | Використовуйте цю функцію:

void openSmsMsgAppFnc(String mblNumVar, String smsMsgVar)
{
    Intent smsMsgAppVar = new Intent(Intent.ACTION_VIEW);
    smsMsgAppVar.setData(Uri.parse("sms:" +  mblNumVar));
    smsMsgAppVar.putExtra("sms_body", smsMsgVar);
    startActivity(smsMsgAppVar); 
}

Тут відображаються два варіанти: 1. програма Hangouts і 2. Програма повідомлень за замовчуванням. Я хочу насильно відкрити додаток для повідомлень Android. Як ми можемо це архівувати?
Milind Mevada

3

У kotlin це легко реалізувати наступним чином:

/**
 * If android version is Kitkat or above, users can change default sms application.
 * This method will get default sms app and start default sms app.
 */
private fun openSMS() {
    val message = "message here"
    val phone = "255754......." //255 Tanzania code.

    val uri = Uri.parse("smsto:+$phone")
    val intent = Intent(Intent.ACTION_SENDTO, uri)

    with(intent) {
        putExtra("address", "+$phone")
        putExtra("sms_body", message)
    }

    when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> {
            //Getting the default sms app.
            val defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(context)

            // Can be null in case that there is no default, then the user would be able to choose
            // any app that support this intent.
            if (defaultSmsPackageName != null) intent.setPackage(defaultSmsPackageName)

            startActivity(intent)
        }
        else -> startActivity(intent)
    }
}

Це модифікована відповідь @mustafasevgi


2
Intent sendIntent = new Intent(Intent.ACTION_SEND); 
//CHANGE YOUR MESSAGING ACTIVITY HERE IF REQUIRED 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("sms_body",msgbody); 
sendIntent.putExtra("address",phonenumber);
//FOR MMS
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/mms.png"));
sendIntent.setType("image/png");
startActivity(sendIntent);

2

Найкращий код, який працює з програмою SMS за замовчуванням, - це.

Uri SMS_URI = Uri.parse("smsto:+92324502****"); //Replace the phone number
Intent sms = new Intent(Intent.ACTION_VIEW,SMS_URI);    
sms.putExtra("sms_body","This is test message"); //Replace the message witha a vairable 
startActivity(sms);

1

Наведений нижче код працює на android 6.0.
Це відкриє пошукову діяльність у програмі обміну повідомленнями за замовчуванням із розмовами, що стосуються конкретної рядки.

Intent smsIntent = new Intent(Intent.ACTION_MAIN);
        smsIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        smsIntent.setClassName("com.android.mms", "com.android.mms.ui.SearchActivity");
        smsIntent.putExtra("intent_extra_data_key", "string_to_search_for");
        startActivity(smsIntent);  

Ви можете розпочати пошукову діяльність з наміром. Це відкриє пошукову діяльність програми за обмін повідомленнями за замовчуванням. Тепер, щоб показати список конкретних розмов у пошуковій діяльності, ви можете надати рядок пошуку як додатковий рядок із клавішею як

"intent_extra_data_key"

як показано в onCreate цього класу

String searchStringParameter = getIntent().getStringExtra(SearchManager.QUERY);
    if (searchStringParameter == null) {
        searchStringParameter = getIntent().getStringExtra("intent_extra_data_key" /*SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA*/);
    }
    final String searchString = searchStringParameter != null ? searchStringParameter.trim() : searchStringParameter;

Ви також можете передати SENDER_ADDRESS sms як додатковий рядок, в якому будуть перераховані всі розмови з певною адресою відправника.

Перевірте com.android.mms.ui.SearchActivity для отримання додаткової інформації

Ви також можете перевірити цю відповідь


0

на емуляторі ця робота для мене

Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null));
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("sms_body", remindingReason);

                startActivity(i);

0

Наміри sms:

Intent intent = new Intent("android.intent.action.VIEW");
        /** creates an sms uri */
        Uri data = Uri.parse("sms:");
        intent.setData(data);

0

Написати SMS:

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

0

Або ви можете скористатися цим, і обидва працюють добре на андроїді вище 4,4

    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setType("vnd.android-dir/mms-sms");
    smsIntent.putExtra("address","9212107320");
    smsIntent.putExtra("sms_body","Body of Message");
    startActivity(smsIntent);

або

    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.putExtra("sms_body","Body of Message");
    smsIntent.setData(Uri.parse("sms:9212107320"));
    startActivity(smsIntent);

0

Ви можете використовувати такий фрагмент коду для досягнення своєї мети:

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+model.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.putExtra("sms_body","Hello this is dummy text");
startActivity(smsIntent);

Якщо ви не хочете жодного тексту, видаліть ключ sms_body.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.