avvia l'applicazione sms con un intento


144

Ho una domanda su un intento ... Cerco di avviare l'app 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);

quindi, puoi vedere che ho messo troppe cose nel mio intento, ma è perché non so come posso fare ... Grazie


1
Acquista gist.github.com/gelldur/9c199654c91b13478979 Puoi condividere tramite app SMS
Dawid Drozd,

Risposte:


238

Per iniziare a lanciare l'attività sms tutto ciò che serve è questo:

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

È possibile aggiungere extra per popolare il proprio messaggio e simili

sendIntent.putExtra("sms_body", x); 

quindi basta avviareAttività con l'intento.

startActivity(sendIntent);

Ho provato, ma quando scrivo esattamente quello che dai, eclipse console restituisce (durante la compilazione) "Nessuna attività di avvio trovata!"
Olivier69,

okay, hai un'attività con i seguenti attributi nel suo filtro di intenti nel tuo manifest? <action android: name = "android.intent.action.MAIN" /> <categoria android: name = "android.intent.category.LAUNCHER" />
jqpubliq

in effetti, il lancio proviene da una appwidgetactivity. Però viene da qui, ho messo quello che hai fatto nel manifest e non succede nulla ... Ho testato il mio pulsante con un'altra funzione e questa non vuole andare !!
Olivier69

22
per includere automaticamente il numero di telefono nella casella "a", cambia setData line of code in sendIntent.setData(Uri.parse("sms:" + phoneNumber));(grazie jqpubliq e jaydeepw)
tmr

2
devo controllare se gli SMS vengono inviati o meno quando l'utente invierà sms dalla mia app tramite Intent ti sms come posso fare?
utente

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
La migliore soluzione! Grazie!
Nick,

20
Attenzione, questo non funzionerà per Android 4.4 e probabilmente su ... "vnd.android-dir / mms-sms" non è più supportato
Max Ch

2
Appena testato su Android 4.4.2 e funziona. Potete per favore collegarmi a quell'annuncio? @MaxCh
theknut

3
Se il numero di telefono non viene aggiunto come nel mio caso, basta aggiungere: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

Se la versione Android è Kitkat o superiore, gli utenti possono modificare l'applicazione sms predefinita. Questo metodo otterrà l'app sms predefinita e avvierà l'app sms predefinita.

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
Sto usando la versione di KitKat. Voglio impostare il numero del ricevitore nel campo A. Come posso impostarlo?
Karthikeyan Ve

3
@KarthikeyanVe, per favore, puoi provare? Intento sendIntent = new Intent (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ( "smsto: phonenumber"));
android_developer

Provai. Funziona benissimo. Ma quando faccio clic sul pulsante Indietro dall'app del messaggio, si chiude anche la mia app. Se torno indietro dall'app per i messaggi, dovrebbe tornare alla mia app da dove ho lasciato.
Karthikeyan Ve

2
Bella risposta. Utilizzare se si desidera andare direttamente all'app SMS predefinita, funziona come un fascino. Se vuoi un selettore vedi altre risposte qui.
Nemanja Kovacevic,

1
perché l'app si chiude quando torno dal messaggio
Muhammad Younas il

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

Questo è tutto ciò di cui hai bisogno.


il codice funziona su Android 4.2.2, apre la visualizzazione elenco per gli sms. quello è ciò di cui ho bisogno !!!
VISHAL VIRADIA,

22

Se vuoi avviare l'attività di composizione SMS da alcune delle tue altre attività e devi anche passare un numero di telefono e un testo SMS, allora usa questo codice:

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

Nota: qui i tasti sms_bodye smsto:sono per riconoscere il testo e il numero di telefono all'attività di composizione di SMS, quindi fai attenzione qui.


l'app è chiusa quando si avvia l'intento del messaggio o quando si preme indietro l'app chiave è chiusa
Muhammad Younas,

Prima di tutto dimmi quando esegui questo codice, quindi apre la funzione di scrittura di sms, Se l'app si chiude dopo aver premuto il pulsante Indietro, ci sarebbe qualche problema nel tuo codice, soprattutto nel vuoto pubblico BackPressed () {} funzione come questa
Pir Fahim Shah,

non ho sovrascritto BackPresed Functionn
Muhammad Younas il

17

Ecco il codice che aprirà l'attività SMS prepopolata con il numero di telefono a cui deve essere inviato l'SMS. Funziona bene sull'emulatore e sul dispositivo .

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
come posso allegare un'immagine a questo messaggio?
unresolved_external

Ho 1 domanda riguardo a questo, se vediamo il codice del framework, setType () rende i dati come null e setData () rende il tipo come null. Quindi in che modo il tipo persiste in questo caso?
Android Acquista il

come possiamo cambiare il carattere del testo in sms
jyomin

5

Uso

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

1
Questo funziona per me con l'app stock, ad esempio sull'emulatore, ma probabilmente non funziona su Galaxy S3 per esempio.
G. Lombard,

1
@ G.Lombard Lombard Sì, questo codice non funziona su s3. qualche soluzione per s3?
Vivek Kumar Srivastava,

4

Io uso:

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

Per SDK_INT> = 19 (dove questa API è disponibile) funziona. In realtà è l'unica soluzione funzionante nel mio Nexus 6 con Nougat se vuoi aprire l'app sms con un elenco di messaggi
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
}

Il modo migliore per farlo.


Solo questo codice funziona per me ... Tuttavia, come evitare la selezione di più app sms ... inizierà solo il default ..
Mahbubur Rahman Khan

3

È possibile aprire l'app sms predefinita e passare i dettagli come di seguito:
Nota: se si desidera inviare a più numeri, separare ciascun numero con ";" stringa interna

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

| O | Usa questa funzione:

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

Questo mostra due opzioni: 1. Hangout e 2. app per messaggi predefinita. Voglio aprire forzatamente l'app per i messaggi Android. Come possiamo archiviarlo?
Milind Mevada,

3

In kotlin questo può essere implementato facilmente come segue:

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

Questa è la risposta modificata di @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

Il miglior codice che funziona con l'app SMS predefinita è.

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

Il codice seguente funziona su Android 6.0.
Si aprirà l'attività di ricerca nell'applicazione di messaggistica predefinita con le conversazioni relative alla stringa specifica fornita.

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

È possibile avviare l'attività di ricerca con un intento. Questo aprirà l'attività di ricerca dell'applicazione di messaggistica predefinita. Ora, per mostrare un elenco di conversazioni specifiche nell'attività di ricerca, puoi fornire la stringa di ricerca come ulteriore stringa con la chiave come

"Intent_extra_data_key"

come mostrato in onCreate di questa classe

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;

Puoi anche passare SENDER_ADDRESS dell'sms come extra di stringa, che elencherà tutte le conversazioni con quello specifico indirizzo del mittente.

Controlla com.android.mms.ui.SearchActivity per ulteriori informazioni

Puoi anche controllare questa risposta


0

sull'emulatore questo lavoro per me

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

Intento SMS:

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

0

Scrivi 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

O puoi usarlo, entrambi funzionano bene su Android sopra 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);

o

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

0

Puoi utilizzare il seguente frammento di codice per raggiungere il tuo obiettivo:

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

Se non si desidera alcun testo, rimuovere la chiave sms_body.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.