Подтвердить что ты не робот

Android KitKat 4.4 Hangouts не может обрабатывать намерение отправки SMS

Код для отправки sms, который отлично работал до Android 4.3 (Jelly Bean), перестает работать с версии 4.4 (KitKat)

Я просто готовлю текстовое сообщение для пользователя, но ему нужно выбрать номер для отправки на

Используемый мной код:

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

    activity.startActivity(sendIntent);

Так как он прекратил работу, я попробовал также ACTION_SEND и ACTION_SENDTO Оба не работали, я также попробовал sendIntent.setType("vnd.android-dir/mms-sms");, снова ничего не получилось.

Я искал несколько ответов в stackoverflow ответ 1 и ответ 2, но оба ответа не являются имея дело с требованиями, которые у меня есть.

Что я хотел бы сделать:

  • Отправьте sms только с помощью приложения sms, а не всеми приложениями, которые выполняют намерение отправки.
  • Подготовьте текст для пользователя
  • Позвольте пользователю выбрать номер телефона для отправки сообщения

Для модераторов: Это не повторяющиеся вопросы, так как вопросы не задают точно то же самое, необходимо послать sms без номера телефона, и ни один из вопросов и ответов не касался этого.

4b9b3361

Ответ 1

Я прикрепил код, который решает проблему, выполнив следующие действия:

  • Проверьте версию ОС
  • В случае старой версии (до KitKat) используйте старый метод
  • Если новый API, проверьте пакет sms по умолчанию. если он есть, установите его как пакет, в противном случае разрешите пользователю выбрать приложение для совместного использования.

Вот код:

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

Ответ 2

Объединяя предлагаемые решения, ниже приводится предварительный настрой для текста получателя и.

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

Остается только проблема: вы попали в Hangouts (Nexus 5), и вам может потребоваться несколько раз нажать "назад", чтобы эффективно отменить SMS.

Ответ 3

Этот должен работать на всех версиях Android и всех sms-приложениях (включая 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;
}