lanzar la aplicación sms con una intención


144

Tengo una pregunta sobre una intención ... Intento iniciar la aplicación 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);

así que puedes ver que pongo demasiadas cosas en mi intento, pero eso es porque no sé cómo puedo hacerlo ... Gracias


1
Checkout gist.github.com/gelldur/9c199654c91b13478979 Puede compartir por aplicación de SMS
Dawid Drozd

Respuestas:


238

Para comenzar a lanzar la actividad de sms, todo lo que necesita es esto:

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

Puede agregar extras para completar su propio mensaje y cosas así.

sendIntent.putExtra("sms_body", x); 

entonces solo iniciaActivity con la intención.

startActivity(sendIntent);

Lo intenté, pero cuando escribo exactamente lo que das, eclipse devuelve la consola (al compilar) "¡No se encontró actividad del iniciador!"
Olivier69

bien, ¿tienes una actividad con los siguientes atributos en su filtro de intención en tu manifiesto? <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" />
jqpubliq

de hecho, el lanzamiento proviene de una appwidgetactivity. Perh'aps viene de aquí, pongo lo que has hecho en el manifiesto y no pasa nada ... ¡He probado mi botón con otra función y esta no quiero ir!
Olivier69

22
para incluir automáticamente el número de teléfono en el cuadro 'a', cambie la línea de código setData a sendIntent.setData(Uri.parse("sms:" + phoneNumber));(gracias jqpubliq y jaydeepw)
tmr

2
necesito verificar si se envían SMS o no cuando el usuario enviará sms desde mi aplicación a través de Intent ti sms, ¿cómo puedo hacer esto?
usuario

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

44
¡La mejor solucion! ¡Gracias!
Nick

20
Tenga en cuenta que esto no funcionará para Android 4.4 y probablemente hasta ... "vnd.android-dir / mms-sms" ya no es compatible
Max Ch

2
Acabo de probar en Android 4.4.2 y está funcionando. ¿Puedes por favor vincularme a ese anuncio? @MaxCh
theknut

3
Si el número de teléfono no se agrega como en mi caso, simplemente agregue:intent.setData(Uri.parse("smsto:" + phoneNumber));
Utopía

44
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

Si la versión de Android es Kitkat o superior, los usuarios pueden cambiar la aplicación de SMS predeterminada. Este método obtendrá la aplicación sms predeterminada e iniciará la aplicación sms predeterminada.

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
Estoy usando la versión KitKat. Quiero establecer el número del receptor en el campo Para. ¿Cómo puedo configurar eso?
Karthikeyan Ve

3
@KarthikeyanVe por favor, ¿puedes intentarlo? Intención sendIntent = nueva intención (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ("smsto: phonenumber"));
android_developer

Lo intenté. Está funcionando bien. Pero cuando hago clic en el botón Atrás de la aplicación de mensajes, también cierra mi aplicación. Si presioné de nuevo desde la aplicación de mensajes, debería volver a mi aplicación donde la dejé.
Karthikeyan Ve

2
Gran respuesta. Úselo si desea ir directamente a la aplicación de SMS predeterminada, funciona de maravilla. Si quieres elegir, mira otras respuestas aquí.
Nemanja Kovacevic

1
por qué la aplicación se cierra cuando vuelvo del mensaje
Muhammad Younas

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

Eso es todo lo que necesitas.


el código funciona en Android 4.2.2, abre la vista de lista para sms. eso es lo que necesito !!!
VISHAL VIRADIA

22

Si desea iniciar la actividad de composición de SMS desde alguna de sus otras actividades y también tiene que pasar un número de teléfono y un mensaje de texto, use este código:

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: aquí el sms_bodyy smsto:es claves para reconocer el texto y teléfono en la actividad de escribir SMS, así que ten cuidado aquí.


la aplicación está cerrada cuando comienza la intención del mensaje o cuando presiono la tecla de retroceso la aplicación está cerrada
Muhammad Younas

En primer lugar, dígame cuando ejecute este código y luego abra la función de escritura de SMS. Si la aplicación se cierra después de presionar el botón Atrás, entonces habría algún problema en su código, especialmente en público vacío. Función BackPressed () {} como esta
Pir Fahim Shah

no sobrescribí la función BackPresed
Muhammad Younas

17

Aquí está el código que abrirá la actividad de SMS rellenada previamente con el número de teléfono al que debe enviarse el SMS. Esto funciona bien tanto en el emulador como en el 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
¿Cómo puedo adjuntar una imagen a este mensaje?
unresolved_external

Tengo 1 pregunta con respecto a esto, si vemos el código marco, setType () hace que los datos sean nulos y setData () hace que el tipo sea nulo. Entonces, ¿cómo persistirá el tipo en este caso?
AndroidGuy

¿Cómo podemos cambiar la fuente del texto en el sms
jyomin

5

Utilizar

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

1
Esto funciona para mí con la aplicación estándar, por ejemplo, en el emulador, pero probablemente no funciona en Galaxy S3, por ejemplo.
G. Lombard

1
@ G.Lombard Lombard Sí, este código no funciona en s3. alguna solución para s3?
Vivek Kumar Srivastava

4

Yo suelo:

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

Para SDK_INT> = 19 (donde esta API está disponible) funciona. De hecho, es la única solución que funciona en mi Nexus 6 con Nougat si desea abrir la aplicación de SMS con la lista de mensajes
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
}

La mejor manera de hacer esto.


Solo este código funciona para mí ... Sin embargo, cómo evitar la selección de múltiples aplicaciones de SMS ... solo comenzará el predeterminado ...
Mahbubur Rahman Khan

3

Puede abrir la aplicación sms predeterminada y pasar los detalles de la siguiente manera:
Nota: si desea enviar a muchos números, separe cada número con ";" cadena interior

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 | Utiliza esta función:

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

Esto muestra dos opciones, 1. Hangout y 2. Aplicación de mensajes predeterminada. Quiero abrir con fuerza la aplicación de mensajes de Android. ¿Cómo podemos archivar eso?
Milind Mevada

3

En kotlin esto se puede implementar fácilmente de la siguiente manera:

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

Esta es la respuesta modificada de @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

El mejor código que funciona con la aplicación de SMS predeterminada es.

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

El siguiente código funciona en Android 6.0.
Se abrirá la actividad de búsqueda en la aplicación de mensajería predeterminada con las conversaciones relacionadas con la cadena específica proporcionada.

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

Puede comenzar la actividad de búsqueda con una intención. Esto abrirá la actividad de búsqueda de la aplicación de mensajería predeterminada. Ahora, para mostrar una lista de conversaciones específicas en la actividad de búsqueda, puede proporcionar la cadena de búsqueda como cadena adicional con la clave como

"intent_extra_data_key"

como se muestra en el onCreate de esta clase

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;

También puede pasar el SENDER_ADDRESS de los sms como cadena adicional, que enumerará todas las conversaciones con esa dirección de remitente específica.

Consulte com.android.mms.ui.SearchActivity para obtener más información.

También puedes consultar esta respuesta


0

en emulador este trabajo para mí

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

Intención de SMS:

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

0

Redactar 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

Puede usar esto, ambos funcionan bien en Android por encima de 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

Puede usar el siguiente fragmento de código para lograr su objetivo:

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

Si no desea ningún texto, elimine la clave sms_body.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.