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.