32

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_SENDACTION_SENDTOどちらも機能しませんでした。 も試しましたsendIntent.setType("vnd.android-dir/mms-sms");が、何も機能しませんでした。

Stack Overflow answer 1answer 2でいくつかの回答を見ましたが、どちらの回答も私が持っている要件を扱っていません。

私がしたいこと:

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

モデレーター向け: 重複した質問ではありません。質問はまったく同じことを尋ねているわけではありません。ここで必要なのは、電話番号なしで SMS を送信することであり、質問と回答のいずれもそれを扱っていません。

4

4 に答える 4

80

次のようにして問題を解決するコードを添付しました。

  • 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);
    }
于 2013-11-19T18:19:18.000 に答える
17

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

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 を効果的にキャンセルするには、「戻る」を複数回押す必要がある場合があります。

于 2014-01-06T15:14:29.307 に答える