web-dev-qa-db-fra.com

Android KitKat 4.4 Hangouts ne peut pas gérer l'envoi SMS intention

Code d'envoi de sms qui fonctionnait parfaitement jusqu'à Android 4.3 (Jelly bean) et a cessé de fonctionner depuis 4.4 (KitKat)

Je prépare simplement le message texte pour l'utilisateur, mais il doit choisir le numéro auquel envoyer.

Le code que j'ai utilisé est:

Intent sendIntent = new Intent(Intent.ACTION_VIEW);         
    sendIntent.setData(Uri.parse("sms:"));
    sendIntent.putExtra("sms_body", smsText);

    activity.startActivity(sendIntent);

Depuis qu'il a cessé de fonctionner, j'ai également essayé les ACTION_SEND Et ACTION_SENDTO Aucun n'a fonctionné, j'ai également essayé la sendIntent.setType("vnd.Android-dir/mms-sms");, mais encore une fois rien n'a fonctionné.

J'ai regardé plusieurs réponses sur Stack Overflow réponse 1 et réponse 2 , mais les deux réponses ne traitent pas des exigences que j'ai.

Ce que j'aimerais faire:

  • Envoyer des SMS avec l'application SMS uniquement, pas par toutes les applications qui répondent à l'intention d'envoi
  • Préparez le texte pour l'utilisateur
  • Laisser l'utilisateur choisir le numéro de téléphone auquel envoyer le message

Pour les modérateurs: Ce ne sont pas des questions en double, car les questions ne demandent pas exactement la même chose, la nécessité ici est d'envoyer des sms sans numéro de téléphone, et aucune des questions et réponses n'a traité de cela.

32
nheimann1

J'ai joint un code qui résout le problème en procédant comme suit:

  • Vérifiez la version du système d'exploitation
  • Dans le cas où cette ancienne version (avant KitKat), utilisez l'ancienne méthode
  • Si nouvelle API, vérifiez le package sms par défaut. s'il y en a, définissez-le comme package, sinon, laissez l'utilisateur choisir l'application de partage.

Voici le code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) //At least KitKat
    {
        String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(activity); //Need to change the build to API 19

        Intent sendIntent = new Intent(Intent.ACTION_SEND);
        sendIntent.setType("text/plain");
        sendIntent.putExtra(Intent.EXTRA_TEXT, smsText);

        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);
        }
        activity.startActivity(sendIntent);

    }
    else //For early versions, do what worked for you before.
    {
        Intent sendIntent = new Intent(Intent.ACTION_VIEW);
        sendIntent.setData(Uri.parse("sms:"));
        sendIntent.putExtra("sms_body", smsText);
        activity.startActivity(sendIntent);
    }
78
nheimann1

Celui-ci devrait fonctionner sur toutes les versions Android Android et toutes les applications sms (y compris Hangouts).

public static boolean sendSms(Context context, String text, String number) {
    return sendSms(context, text, Collections.singletonList(number));
}

public static boolean sendSms(Context context, String text, List<String> numbers) {

    String numbersStr = TextUtils.join(",", numbers);

    Uri uri = Uri.parse("sms:" + numbersStr);

    Intent intent = new Intent();
    intent.setData(uri);
    intent.putExtra(Intent.EXTRA_TEXT, text);
    intent.putExtra("sms_body", text);
    intent.putExtra("address", numbersStr);

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
        intent.setAction(Intent.ACTION_SENDTO);
        String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(context);
        if(defaultSmsPackageName != null) {
            intent.setPackage(defaultSmsPackageName);
        }
    } else {
        intent.setAction(Intent.ACTION_VIEW);
        intent.setType("vnd.Android-dir/mms-sms");
    }

    try {
        context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}
19
Roberto B.

En combinant les solutions proposées, ce qui suit fournit le préréglage du destinataire et le texte.

Intent intent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) // Android 4.4 and up
{
    String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(activity);

    intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + Uri.encode(toContact.toString())));
    intent.putExtra("sms_body", 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 supports this intent.
    {
        intent.setPackage(defaultSmsPackageName);
    }
}
else
{
    intent = new Intent(Intent.ACTION_VIEW);
    intent.setType("vnd.Android-dir/mms-sms");
    intent.putExtra("address", toContact.toString());
    intent.putExtra("sms_body", text);
}
activity.startActivity(intent);

Le seul problème qui reste est que vous vous retrouvez dans Hangouts (Nexus 5), et vous devrez peut-être appuyer plusieurs fois sur "Retour" pour annuler efficacement le SMS.

17
johsin18