iniciar o aplicativo sms com uma intenção


144

Eu tenho uma pergunta sobre uma intenção ... Eu tento iniciar o aplicativo 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);

então você pode ver que eu coloco muitas coisas na minha intenção, mas é porque eu não sei como posso fazer ...


1
Checkout gist.github.com/gelldur/9c199654c91b13478979 Você pode compartilhar pelo aplicativo SMS
Dawid Drozd

Respostas:


238

Para começar a iniciar a atividade sms, tudo o que você precisa é este:

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

Você pode adicionar extras para preencher sua própria mensagem e coisas assim

sendIntent.putExtra("sms_body", x); 

então apenas startActivity com a intenção.

startActivity(sendIntent);

Tentei, mas quando escrevo exatamente o que você fornece, o eclipse retorna ao console (ao compilar) "Nenhuma atividade do Launcher encontrada!"
precisa saber é o seguinte

ok, você tem uma atividade com os seguintes atributos no filtro de intenção no seu manifesto? <ação android: name = "android.intent.action.MAIN" /> <categoria android: name = "android.intent.category.LAUNCHER" />
jqpubliq

de fato, o lançamento vem de uma atividade de aplicativo. Ora vem daqui, eu coloquei o que você fez no manifesto e nada acontece ... Eu testei meu botão com outra função e essa não quer ir !!
precisa saber é o seguinte

22
para incluir automaticamente o número de telefone na caixa 'para', altere a linha de código setData para sendIntent.setData(Uri.parse("sms:" + phoneNumber));(obrigado jqpubliq e jaydeepw)
tmr

2
preciso verificar se o SMS foi enviado ou não quando o usuário enviará sms do meu aplicativo por meio do Intent ti sms como posso fazer isso?
usuário

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
A melhor solução! Obrigado!
Nick

20
Esteja ciente, isso não vai funcionar para o Android 4.4 e provavelmente até ... "vnd.android-dir / mms-sms" não é mais suportada
Max Ch

2
Acabei de testar no Android 4.4.2 e está funcionando. Você pode me vincular a esse anúncio? @MaxCh
theknut

3
Se o número de telefone não for adicionado como no meu caso, basta adicionar: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 a versão do Android for Kitkat ou superior, os usuários poderão alterar o aplicativo sms padrão. Este método obterá o aplicativo sms padrão e iniciará o aplicativo sms padrão.

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
Estou usando a versão KitKat. Quero definir o número do receptor no campo Para. Como posso definir isso?
precisa

3
@KarthikeyanVe, por favor, você pode tentar? Intenção sendIntent = new Intent (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ("smsto: phonenumber"));
Android_developer 12/03/2015

Eu tentei. Está funcionando bem. Mas quando clico no botão Voltar do aplicativo de mensagens, ele também fecha o aplicativo. Se eu pressionar novamente a partir do aplicativo de mensagens, ele deverá retornar ao meu aplicativo de onde saí.
precisa

2
Ótima resposta. Use se você deseja ir diretamente para o aplicativo SMS padrão, funciona como um encanto. Se você deseja escolher, consulte outras respostas aqui.
Nemanja Kovacevic

1
por aplicativo perto quando eu voltar de mensagem
Muhammad Younas

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

É tudo o que você precisa.


código está funcionando no Android 4.2.2, ele abre a exibição de lista para sms. isso é o que eu preciso !!!
VISHAL VIRADIA

22

Se você deseja iniciar a atividade de composição de SMS a partir de outras atividades e também precisar passar um número de telefone e um texto SMS, 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: aqui as teclas sms_bodye smsto:são para reconhecer o número de telefone e texto na atividade de composição do SMS, portanto, tenha cuidado aqui.


aplicativo está perto quando ele começar a mensagem de intenção ou quando eu aperto de volta aplicativo chave é fechada
Muhammad Younas

Antes de tudo, diga-me quando você executa esse código, em seguida, ele abre a função write sms. Se o aplicativo fechar após pressionar o botão Voltar, haveria algum problema no seu código, especialmente na função pública anulada BackPressed () {} como esta
Pir Fahim Shah

eu não substitui o BackPresed Functionn
Muhammad Younas

17

Aqui está o código que abrirá a atividade do SMS pré-preenchida com o número de telefone para o qual o SMS deve ser enviado. Isso funciona bem no emulador e no 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
como posso anexar uma imagem a esta mensagem?
Unresolved_external

Tenho uma pergunta sobre isso, se virmos o código da estrutura, setType () torna os dados como nulos e setData () torna o tipo como nulo. Então, como o tipo persiste nesse caso?
AndroidGuy

Como podemos mudar a fonte do texto da mensagem SMS
jyomin

5

Usar

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

1
Isso funciona para mim com o aplicativo de ações, por exemplo, no emulador, mas provavelmente não funciona no Galaxy S3, por exemplo.
G. Lombard

1
@ G.Lombard Lombard Sim, este código não está funcionando no s3. alguma solução para s3?
Vivek Kumar Srivastava

4

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

Para SDK_INT> = 19 (onde esta API está disponível), ela funciona. Na verdade é a única solução trabalhando no meu Nexus 6 com Nougat se você quiser aplicativo sms aberto com lista de mensagens
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
}

Melhor maneira de fazer isso.


Somente este código funciona para mim ... No entanto, como evitar a seleção de vários aplicativos sms ... somente o padrão será iniciado ..
Mahbubur Rahman Khan 12/03

3

Você pode abrir o aplicativo sms padrão e passar os detalhes conforme abaixo:
Nota: Se você quiser enviar para muitos números, separe cada número com ";" corda 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);

Ou Use esta função:

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

Isso mostra duas opções: 1. hangout e 2. aplicativo de mensagem padrão. Quero abrir com força o aplicativo de mensagens do Android. Como podemos arquivar isso?
Milind Mevada

3

No kotlin, isso pode ser implementado facilmente da seguinte maneira:

/**
 * 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 é uma resposta 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

O melhor código que funciona com o aplicativo SMS padrão é.

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

O código abaixo funciona no Android 6.0.
Ele abrirá a atividade de pesquisa no aplicativo de mensagens padrão com as conversas relacionadas à sequência específica fornecida.

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

Você pode iniciar a atividade de pesquisa com uma intenção. Isso abrirá a atividade de pesquisa do aplicativo de mensagens padrão. Agora, para mostrar uma lista de conversas específicas na atividade de pesquisa, você pode fornecer a string de pesquisa como string extra com a tecla

"intent_extra_data_key"

como é mostrado no onCreate desta 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;

Você também pode passar o SENDER_ADDRESS do sms como uma string extra, que listará todas as conversas com esse endereço de remetente específico.

Verifique com.android.mms.ui.SearchActivity para obter mais informações

Você também pode verificar esta resposta


0

no emulador este trabalho para mim

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

Intenção de SMS:

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

0

Redigir 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

Ou você pode usar isso, ambos estão funcionando bem no android acima 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);

ou

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

0

Você pode usar o seguinte snippet de código para atingir sua meta:

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 você não deseja nenhum texto, remova a chave sms_body.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.