запустить приложение смс с намерением


144

У меня есть вопрос о намерении ... Я пытаюсь запустить приложение смс ...

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);

Я пытался, но когда я пишу именно то, что вы даете, консоль eclipse возвращает (при компиляции) "Нет активности Launcher найдено!"
— Olivier69

хорошо, у вас есть действие со следующими атрибутами в его фильтре намерений в вашем манифесте? <action android: name = "android.intent.action.MAIN" /> <категория android: name = "android.intent.category.LAUNCHER" />
— jqpubliq

на самом деле, запуск происходит из приложения. Perh'aps отсюда, я помещаю то, что вы сделали, в манифест, и ничего не происходит ... Я проверил мою кнопку с другой функцией, и эта не хочет идти !!
— Olivier69

22
чтобы автоматически включить номер телефона в поле «to», измените строку кода setData на sendIntent.setData(Uri.parse("sms:" + phoneNumber));(спасибо jqpubliq и jaydeepw)
— tmr

2
Мне нужно проверить, отправлено SMS или нет, когда пользователь отправит смс из моего приложения через Intent tms, как я могу это сделать?
— пользователь

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 по умолчанию.

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. Я хочу установить номер получателя в поле Кому. Как я могу установить это?
— Картикеян Ве

3
@KarthikeyanVe, пожалуйста, вы можете попробовать? Intent sendIntent = new Intent (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ( "smsto: PhoneNumber"));
— android_developer

Я попытался. Работает нормально. Но когда я нажимаю кнопку «Назад» в приложении сообщений, оно также закрывает мое приложение. Если я снова нажал из приложения сообщений, он должен вернуться в мое приложение, где я оставил.
— Картикеян Ве

2
Отличный ответ. Используйте, если вы хотите перейти непосредственно к приложению SMS по умолчанию, работает как шарм. Если вы хотите, чтобы chooser видел другие ответы здесь.
— Неманья Ковачевич

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, он открывает вид списка для смс. это то что мне нужно !!!
— 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-сообщениях, поэтому будьте осторожны.


приложение закрывается, когда оно запускает намерение сообщения или когда я нажимаю клавишу возврата, приложение закрывается
— Мухаммед Юнас

Прежде всего, скажите мне, когда вы выполняете этот код, затем он открывает функцию записи SMS-сообщений. Если приложение закрывается после нажатия кнопки «Назад», то в вашем коде могут возникнуть проблемы, особенно в такой публичной функции void BackPressed () {}, как это
— Pir Фахим Шах

я не перезаписывал BackPresed Functionn
— Мухаммед Юнас

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
как я могу прикрепить картинку к этому сообщению?
— unresolved_external

У меня 1 вопрос по этому поводу, если мы видим код структуры, setType () делает данные как null, а setData () делает тип как null. Так как же тип будет сохраняться в этом случае?
— 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
}

Лучший способ сделать это.


Только этот код работает для меня ... Однако, как избежать выбора нескольких приложений смс ... только по умолчанию начнется ..
— Махбубур Рахман Хан

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. видеовстречу и 2. приложение сообщений по умолчанию. Я хочу принудительно открыть приложение сообщений Android. Как мы можем заархивировать это?
— Милинд Мевада

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 intent = new Intent("android.intent.action.VIEW");
        /** creates an sms uri */
        Uri data = Uri.parse("sms:");
        intent.setData(data);

0

Составить СМС:

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

Либо вы можете использовать это, оба работают нормально на Android выше 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.