web-dev-qa-db-ja.com

Android KitKat 4.4ハングアウトは送信を処理できませんSMSインテント

Android 4.3(Jelly bean)4.4(KitKat)以降動作を停止するまで完全に機能したSMSを送信するためのコード

ユーザー用のテキストメッセージを準備していますが、送信する番号を選択する必要があります

私が使用したコードは次のとおりです。

_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 answer 1 および answer 2 でいくつかの答えを探しましたが、両方の答えが私が持っている要件を処理していません。

私がやりたいこと:

  • 送信インテントを提供するすべてのアプリではなく、SMSアプリのみでSMSを送信します
  • ユーザー向けのテキストを準備する
  • ユーザーがメッセージを送信する電話番号を選択できるようにします

モデレーターの場合:質問はまったく同じことを尋ねないため、重複した質問ではありません。ここで必要なのは、電話番号のないsmsを送信することです。

32
nheimann1

以下を実行して問題を解決するコードを添付しました。

  • OSバージョンを確認する
  • 古いバージョン(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);
    }
78
nheimann1

これは、すべてのAndroidバージョンとすべてのSMSアプリ(ハングアウトを含む)で動作するはずです。

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.

提案されたソリューションを組み合わせて、以下は受信者の事前設定を提供しますおよびテキスト。

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

残る唯一の問題は、ハングアウト(Nexus 5)になってしまうことです。SMSを効果的にキャンセルするには、「戻る」を複数回押す必要があります。

17
johsin18