📱

[趣味開発]子供向けの通知アプリの開発 テキスト読み上げ編

2024/11/04に公開

[趣味開発]子供向けの通知アプリの開発 テキスト読み上げ編

はじめに

最近、子供の朝の準備をサポートするアプリを作りたいと思い、趣味でのAndroidアプリ開発を始めました。特に、子供は時間の管理が難しく、準備が遅れがちです。そこで、毎日決まった時刻に通知を送り、必要な準備をリマインドすることで、朝の支度がスムーズになることを目指しました。また、通知の際にテキストを読み上げることで、文字が読めなくても行動しやすくなるように工夫しています。

今回の開発は、ChatGPTにアドバイスをもらいながら進め、アラームの設定やテキスト読み上げ機能の実装に挑戦しました。この過程を通じて、Android開発における新たな学びを得ることができたので、記事にまとめたいと思います。

開発方針

今回はChatGPTを利用して開発を進めました。アプリの仕様が少しずつ変わる中で、各機能の実装方法を教えてもらい、エラーが発生した際も素早く解決できました。特にアラームの繰り返し設定や、TextToSpeechの初期化手順についてサポートを受けたことで、スムーズに機能を追加することができました。

ChatGPTの使い方・工夫した点

  • 一度に多くの内容を尋ねるのではなく、開発の段階ごとに小さなタスクに分割して質問しました。
  • エラーや課題が発生した際には、具体的なエラーメッセージを提示することで、適切なアドバイスを受けやすくしました。
  • 開発中に新たなアイデアが浮かんだ際も、すぐにChatGPTに相談して実装の方向性を確認できたので、効率よく作業を進められました。

作成したアプリ

アプリ概要

このアプリは、毎日設定した時刻に通知を送信し、指定したメッセージを画面に表示して読み上げることで、子供が時間を意識して行動できるようサポートするものです。アラームが設定されている場合、毎日同じ時刻にリマインドが行われます。

フォルダ構成

├── java
│   └── com.example.wakuwakuschedule
│       ├── AlarmAdapter.kt
│       ├── AlarmItem.kt
│       ├── AlarmReceiver.kt
│       ├── MainActivity.kt
│       └── NotificationActivity.kt
└── res
    └── layout
        ├── activity_main.xml
        ├── activity_notification.xml
        └── dialog_add_alarm.xml
  • MainActivity.kt:アプリのメイン画面で、アラームの設定やリスト表示を行います。
  • AlarmReceiver.kt:アラームの受信処理を行い、指定の画面に通知を表示します。
  • NotificationActivity.kt:通知メッセージの画面で、テキストの読み上げを行います。

コードの役割

MainActivity.kt
ユーザーが設定した時刻とメッセージを保存し、毎日繰り返しアラームを設定するコードです。

// MainActivity.kt (コードの一部)
...
private fun scheduleRepeatingAlarm(hour: Int, minute: Int, message: String) {
    val calendar = Calendar.getInstance().apply {
        set(Calendar.HOUR_OF_DAY, hour)
        set(Calendar.MINUTE, minute)
        set(Calendar.SECOND, 0)
    }
    val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    val intent = Intent(this, AlarmReceiver::class.java).apply {
        putExtra("alarm_message", message)
    }
    val pendingIntent = PendingIntent.getBroadcast(
        this, alarmList.size, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
    alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        pendingIntent
    )
}

NotificationActivity.kt
通知時に受信したメッセージを表示し、テキスト読み上げを行います。

// NotificationActivity.kt (コードの一部)
class NotificationActivity : AppCompatActivity(), TextToSpeech.OnInitListener {
    private lateinit var tts: TextToSpeech
    private var alarmMessage: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_notification)
        alarmMessage = intent.getStringExtra("alarm_message")

        // TextToSpeechの初期化
        tts = TextToSpeech(this, this)
    }

    override fun onInit(status: Int) {
        if (status == TextToSpeech.SUCCESS) {
            tts.language = Locale.JAPANESE
            speakOut()
        }
    }

    private fun speakOut() {
        tts.speak(alarmMessage, TextToSpeech.QUEUE_FLUSH, null, null)
    }
}

権限設定で苦労した点

開発中、特に苦労したのがAndroidの「他のアプリの上に表示する」権限の設定でした。この権限は、ユーザーに追加でリクエストする必要があり、正しく設定しないとアラームが意図した通りに動作しないことがわかりました。
具体的には、以下のような工夫を行いながら問題を解決しました:

  • ChatGPTへの相談
     権限が正常にリクエストされない場合の原因や、リクエスト後に動作を再確認する方法について、ChatGPTに詳細なアドバイスを求めました。例えば、エラーメッセージを共有することで、権限周りの設定ミスをすぐに発見でき、アプリの挙動が改善されました。

  • テストの繰り返し
     権限リクエストが確実に機能するまで何度もテストを行い、許可の確認やリクエストの処理フローを最適化しました。これにより、アプリが起動するたびに自動で権限が確認され、不足している場合にのみボタンを表示するように改善できました。

こうした工夫を行うことで、毎日繰り返しアラームが正しく動作し、ユーザーがアプリの使い勝手に違和感を感じないように工夫しています。

コード例:権限確認とリクエストの処理

private fun checkPermissionsStatus() {
    if (!Settings.canDrawOverlays(this)) {
        permissionStatusTextView.text = "他のアプリの上に表示する権限が必要です"
        requestPermissionButton.visibility = Button.VISIBLE
    } else {
        permissionStatusTextView.text = "すべての必要な権限が付与されています"
        requestPermissionButton.visibility = Button.GONE
    }
}

動作

アプリの起動後、右下のプラスボタンから新しいアラームを設定できます。時刻とメッセージを入力し、毎日同じ時刻にアラームがトリガーされるようになります。アラームが鳴った際には、設定したメッセージが画面に表示され、テキストが読み上げられます。


今後の課題とブラッシュアップ予定

現在のアプリは基本的な機能が揃っていますが、まだブラッシュアップの余地があります。今後は、以下の点について改善を行っていく予定です。

  • UIの改良
     子供が直感的に使いやすいデザインに変更し、カスタマイズ性を向上させる。

スクラム的にスプリントレビューで子供の反応を見ながら改善していきたいと思っています

まとめ

今回のアプリ開発を通じて、ChatGPTを活用しながらAndroidアプリの実装方法を学ぶことができました。特に権限

設定や繰り返しアラームの設定といった、普段経験しない技術的な課題にも取り組むことができました。今後はさらに機能を追加し、子供が楽しく時間を管理できるようなアプリに仕上げていきたいと思います。

Discussion