uruchom aplikację sms z zamiarem


144

Mam pytanie dotyczące zamiaru ... Próbuję uruchomić aplikację smsową ...

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

więc widzisz, że włożyłem zbyt wiele rzeczy w swoje zamiary, ale to dlatego, że nie wiem, jak mogę to zrobić ... Dziękuję


1
Do kasy gist.github.com/gelldur/9c199654c91b13478979 Możesz udostępniać przez aplikację SMS
— Dawid Drozd

Odpowiedzi:


238

Aby rozpocząć aktywność smsową, wystarczy:

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

Możesz dodać dodatki, aby wypełnić własną wiadomość i tym podobne

sendIntent.putExtra("sms_body", x); 

następnie po prostu rozpocznij Aktywność z zamiarem.

startActivity(sendIntent);

Próbowałem, ale kiedy napiszę dokładnie to, co dajesz, konsola eclipse zwraca (podczas kompilacji) "Nie znaleziono aktywności Launchera!"
— Olivier69

OK, czy masz aktywność z następującymi atrybutami w filtrze intencji w swoim manifeście? <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" />
— jqpubliq

w rzeczywistości uruchomienie pochodzi z aktywności aplikacji. Może to pochodzi stąd, umieściłem to, co zrobiłeś w manifeście i nic się nie dzieje ... Przetestowałem mój przycisk z inną funkcją, a ten nie chce iść !!
— Olivier69

22
aby automatycznie dołączyć numer telefonu w polu „do”, zmień wiersz kodu setData na sendIntent.setData(Uri.parse("sms:" + phoneNumber));(dziękuję jqpubliq i jaydeepw)
— tmr

2
Muszę sprawdzić, czy SMS został wysłany, czy nie, kiedy użytkownik wyśle ​​SMS-a z mojej aplikacji za pośrednictwem Intent ti sms, jak mogę to zrobić?
— użytkownik

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
Najlepszym rozwiązaniem! Dzięki!
— Nick

20
Należy pamiętać, że to nie zadziała na Androidzie 4.4 i prawdopodobnie w górę ... „vnd.android-dir / mms-sms” nie jest już obsługiwany
— Max Ch

2
Właśnie przetestowany na Androidzie 4.4.2 i działa. Czy możesz połączyć mnie z tym ogłoszeniem? @MaxCh
— theknut

3
Jeśli numer telefonu nie zostanie dodany tak jak w moim przypadku, po prostu dodaj:intent.setData(Uri.parse("smsto:" + phoneNumber));
— Utopia

4
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
— Nguyen Minh Binh

49

Jeśli wersja Androida to KitKat lub nowsza, użytkownicy mogą zmienić domyślną aplikację sms. Ta metoda spowoduje pobranie domyślnej aplikacji sms i uruchomienie domyślnej aplikacji 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
Używam wersji KitKat. Chcę ustawić numer odbiorcy w polu Do. Jak mogę to ustawić?
— Karthikeyan Ve

3
@KarthikeyanVe, czy możesz spróbować? Zamiar sendIntent = nowy zamiar (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ("smsto: phonenumber"));
— android_developer

Próbowałem. Działa dobrze. Ale kiedy klikam przycisk Wstecz w aplikacji wiadomości, zamyka ona również moją aplikację. Jeśli wrócę z aplikacji wiadomości, powinien wrócić do mojej aplikacji, w której wyszedłem.
— Karthikeyan Ve

2
Świetna odpowiedź. Użyj, jeśli chcesz przejść bezpośrednio do domyślnej aplikacji do SMS-ów, działa jak urok. Jeśli chcesz wybrać, zobacz inne odpowiedzi tutaj.
— Nemanja Kovacevic

1
dlaczego aplikacja się zamyka, kiedy wracam z wiadomości
— Muhammad Younas

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

To wszystko, czego potrzebujesz.


kod działa na Androidzie 4.2.2, otwiera widok listy dla smsów. to jest to, czego potrzebuję !!!
— VISHAL VIRADIA

22

Jeśli chcesz uruchomić tworzenie SMS-ów z innej aktywności, a także musisz podać numer telefonu i treść SMS-a, użyj tego kodu:

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

Uwaga: tutaj sms_bodyi smsto:są klawiszami do rozpoznawania tekstu i numeru telefonu podczas tworzenia wiadomości SMS, więc bądź tutaj ostrożny.


aplikacja jest zamknięta, gdy zaczyna intencję wiadomości lub gdy naciskam klawisz wstecz, aplikacja jest zamknięta
— Muhammad Younas

Przede wszystkim powiedz mi, kiedy wykonujesz ten kod, a następnie czy otworzy funkcję zapisu sms, Jeśli aplikacja zamknie się po naciśnięciu przycisku Wstecz, wystąpiłby problem w twoim kodzie, szczególnie w funkcji public void BackPressed () {}, takiej jak ta
— Pir Fahim Shah

nie nadpisałem BackPresed Functionn
— Muhammad Younas

17

Oto kod, który otworzy aktywność SMS wstępnie wypełnioną numerem telefonu, na który ma zostać wysłana wiadomość SMS. Działa to dobrze na emulatorze, a także na urządzeniu .

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
jak mogę załączyć zdjęcie do tej wiadomości?
— unresolved_external

Mam pytanie w związku z tym, jeśli widzimy kod frameworka, setType () sprawia, że ​​dane są null i setData () sprawia, że ​​typ jest null. Jak więc typ będzie się utrzymywał w tym przypadku?
— AndroidGuy

jak możemy zmienić czcionkę tekstu w sms
— jyomin

5

Posługiwać się

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

1
Działa to dla mnie z aplikacją stockową, np. Na emulatorze, ale prawdopodobnie nie działa na przykład na Galaxy S3.
— G. Lombard

1
@ G.Lombard Lombard Tak, ten kod nie działa na s3. jakieś rozwiązanie dla S3?
— Vivek Kumar Srivastava

4

Używam:

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

Dla SDK_INT> = 19 (gdzie ten interfejs jest dostępny) działa. W rzeczywistości jest to jedyne działające rozwiązanie w moim Nexusie 6 z Nougatem, jeśli chcesz otworzyć aplikację
— smsową

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
}

Najlepszy sposób na zrobienie tego.


Tylko ten kod działa dla mnie ... Jednak jak uniknąć wybierania wielu aplikacji sms ... rozpocznie się tylko domyślny ..
— Mahbubur Rahman Khan

3

Możesz otworzyć domyślną aplikację sms i podać szczegóły jak poniżej:
Uwaga: jeśli chcesz wysłać wiadomość na wiele numerów, oddziel każdy numer znakiem „;” wewnątrz ciągu

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

| Lub | Użyj tej funkcji:

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

To pokazuje dwie opcje, 1. spotkanie i 2. domyślną aplikację do obsługi wiadomości. Chcę na siłę otworzyć aplikację wiadomości na Androida. Jak możemy to zarchiwizować?
— Milind Mevada,

3

W kotlin można to łatwo zaimplementować w następujący sposób:

/**
 * 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)
    }
}

To jest zmodyfikowana odpowiedź @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

Najlepszy kod, który działa z domyślną aplikacją SMS to.

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

Poniższy kod działa na Androidzie 6.0.
Otworzy aktywność wyszukiwania w domyślnej aplikacji do przesyłania wiadomości z konwersacjami związanymi z określonym podanym ciągiem.

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

Możesz rozpocząć wyszukiwanie z zamiarem. Otworzy się aktywność wyszukiwania w domyślnej aplikacji do przesyłania wiadomości. Teraz, aby wyświetlić listę określonych rozmów w działaniu wyszukiwania, możesz podać wyszukiwany ciąg jako dodatkowy ciąg z kluczem jako

„intent_extra_data_key”

jak pokazano w onCreate tej klasy

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;

Możesz również przekazać SENDER_ADDRESS sms-a jako dodatkowy ciąg znaków, który będzie zawierał listę wszystkich rozmów z tym określonym adresem nadawcy.

Aby uzyskać więcej informacji, sprawdź com.android.mms.ui.SearchActivity

Możesz również sprawdzić tę odpowiedź


0

na emulatorze to działa u mnie

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

Zamiar SMS:

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

0

Utwórz SMS-a:

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

Albo możesz tego użyć, oba działają dobrze na Androidzie powyżej 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);

lub

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

0

Aby osiągnąć swój cel, możesz użyć następującego fragmentu kodu:

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

Jeśli nie chcesz żadnego tekstu, usuń klucz sms_body.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.