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

Olivier69
fuente
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);
jqpubliq
fuente
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);
Pratik Sharma
fuente
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);
      }
   }
desarrollador de Android
fuente
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.

skyisle
fuente
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í.

Pir Fahim Shah
fuente
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);
JaydeepW
fuente
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");
Harinder
fuente
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);
Delgado
fuente
4
Intent eventIntentMessage =getPackageManager()
 .getLaunchIntentForPackage(Telephony.Sms.getDefaultSmsPackage(getApplicationContext));
startActivity(eventIntentMessage);
Vinayak V Naik
fuente
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.

BuffMcBigHuge
fuente
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); 
}
Sujay UN
fuente
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

Nux
fuente
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);
Reetpreet Brar
fuente
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);
Junaid Khan
fuente
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

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

fuente
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);
Mitul Goti
fuente
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);

fuente
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);
Deepak Verma
fuente
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);
Vishv Shroff
fuente