KWEYT
@KWEYT

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Kotlinを使ってAndroidでSMS送信時に、getSystemServiceがNULLになります

解決したいこと

作成中のアプリはシンプルで、Kotlinを使ってボタンが押されたらメッセージをSMSに送信する機能です。
Kotlinを使ってAndroidでSMS送信時に、getSystemServiceがNULLになりどうしてもうまくいきません。
Android OS 11の環境で実行しています。

以下のサイトを参考にしました。

発生している問題・エラー

getSystemService(…) must not be null

Build.VERSION.SDK_INT>=23の部分を通っていることは確認しました。
smsManager = this.getSystemService(SmsManager::class.java) の部分でエラーになります。

該当するソースコード

■マニフェスト > AndroidManifest.xml に、以下の権限を追加しました。

■MainActivity.ktファイル ※numberの部分には実際の番号をいれてテストしています。

//@Composable
fun onClickMailButton(view:View) {
    val number = "080????????"  // 送信先電話番号

    try {
        val smsManager:SmsManager
        if (Build.VERSION.SDK_INT>=23) {
            //if SDK is greater that or equal to 23 then
            //this is how we will initialize the SmsManager
            smsManager = this.getSystemService(SmsManager::class.java)
        }
        else{
            //if user's SDK is less than 23 then
            //SmsManager will be initialized like this
            smsManager = SmsManager.getDefault()
        }
        smsManager.sendTextMessage(number, null, "メッセージ", null, null)
        // on below line we are displaying a toast message for message send,
        Toast.makeText(applicationContext, "Message Sent", Toast.LENGTH_LONG).show()

    } catch (e: Exception) {
        // on catch block we are displaying toast message for error.
        Toast.makeText(applicationContext, "Please enter all the  data.."+e.message.toString(), Toast.LENGTH_LONG)
            .show()
    }
}

ご教授いただければ幸いです。
宜しくお願い致します。

0

2Answer

追加し忘れだと思いますがマニフェストファイルがないけど参考サイト通りでいいのかな?

で実行すると this.getSystemService(SmsManager::class.java)の返り値がnullになるということでいいのかな?

それならそのデバッグ用のスマホにSMS機能がないということが考えられます
スマホと言うよりスマホに刺したSIMの問題
あと当たり前ですがエミュレータでは動きません

SMSで送信する方法が日本独自の進化なのとこの機能で自動送信されると問題があるので
送信出来たとしても制限が厳しめになっていると思います

1Like

Comments

  1. @KWEYT

    Questioner

    有難うございます。
    マニフェスト記述漏れていました。
    参考サイト通りに設定しました。

    エニュミレータが重たすぎて動作しないため、実機でテストしておりましたが、社内で制御されている端末でテストしているため、SMS機能はある端末なのですが、何らか制限がかかっているのかもしれません。

    >SMSで送信する方法が日本独自の進化なのとこの機能で自動送信されると問題があるので
    送信出来たとしても制限が厳しめになっていると思います

    有難うございます。大変参考になりました。

  2. This comment has been deleted for violation of our Terms of Service.

Android の公式リファレンスで SmsManager.getDefault の説明を見ると、「これは API level 31 (Android 12) で非推奨になったから代わりに Context.getSystemService(SmsManager.class) を使え」と書いてあります。したがって、

  • Build.VERSION.SDK_INT < 31 ならば SmsManager.getDefault() を使う
  • それ以外(API Level 31 以降)ならば getSystemService(SmsManager::class.java) を使う

というのが正しい気がします。

実機が手元にないので確認はしていません。

非公式の記事は情報が古かったり不正確だったりするので、期待通りに動かないことがあったら公式リファレンスを調べるのをおすすめします。

1Like

Comments

  1. @KWEYT

    Questioner

    情報有難うございました。
    Build.VERSION.SDK_INT < 31の場合、SmsManager.getDefault()を使うようにしたら上記エラーは解決致しました。

    ソースの以下の部分で別のエラーが発生するようになりました。
    smsManager.sendTextMessage(number, null, "メッセージ", null, null)

    <エラー内容>
    Sending SMS message:uid 10369 does not have android.permission.SEND_SMS.

    マニュフェストには、以下を追加してあります。
    android.permission.SEND_SMS
    API レベル 23 を超えると、マニュフェストにアプリの実行時にユーザーに権限を求める必要ありとありましたので、そのあたりが原因かもしれません。

    引継ぎ調べてみます。

  2. 権限については以下のページが参考になると思います。権限のリクエストや取り消しの方法、テストデバイスにすべての権限を付与するコマンドなどが書いてあります。

  3. @KWEYT

    Questioner

    @uasi さん
    情報有難うございます。
    参考にさせていただきます。

Your answer might help someone💌