質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

kotlinのandroid開発でアプリが落ちる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 247

score 7

前提・実現したいこと

seekbarとedittextでバイブレーションの振動の強さと振動の継続時間を調整した後、startボタンを押したらバイブレーションが実行されるアプリを作ろうとしています。
start.setOnClickListenerのループで一定時間振動させた後、一定時間静止させる。さらにそれを繰り返すということを行いたいです。
repeat文の使い方が間違っているのかと思うのですが改善方法がわかりません。

発生している問題・エラーメッセージ

startボタンを押してバイブレーションが実行されるまではいいのですがその後アプリが落ちてしまいます。
あとおそらく静止させる部分のループがうまく作動していません。

該当のソースコード

import android.content.Context
import android.os.Build
import android.os.Bundle
import android.os.VibrationEffect
import android.os.Vibrator
import android.view.KeyEvent
import android.view.View
import android.widget.EditText
import android.widget.SeekBar
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), Runnable, TextView.OnEditorActionListener, View.OnFocusChangeListener, SeekBar.OnSeekBarChangeListener {

    var gTime:Double = 0.5
    var gHz = 100
    var eTime: EditText? = null
    var eHz: EditText? = null
    var sTime: SeekBar? = null
    var sHz: SeekBar? = null

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        eTime = this.findViewById(R.id.eTime) as EditText?
        sTime = this.findViewById(R.id.sTime) as SeekBar?
        eTime!!.setOnEditorActionListener(this)
        eTime!!.onFocusChangeListener = this
        sTime!!.setOnSeekBarChangeListener(this)
        eHz = this.findViewById(R.id.eHz) as EditText?
        sHz = this.findViewById(R.id.sHz) as SeekBar?
        eHz!!.setOnEditorActionListener(this)
        eHz!!.onFocusChangeListener = this
        sHz!!.setOnSeekBarChangeListener(this)

        setupSeekBart()
        setupSeekBarh()

        start.setOnClickListener {
            val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
            repeat(100) {//ここから
                repeat(10) {
                    val vibrationEffect = VibrationEffect.createOneShot(gTime.toLong(), gHz)
                    vibrator.vibrate(vibrationEffect)
                }
                repeat(10){
                    val vibrationEffect = VibrationEffect.createOneShot(gTime.toLong(), 0)
                    vibrator.vibrate(vibrationEffect)
                }
            }//ここまで
        }
    }

    override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?): Boolean {
        try {
            var value = v.text.toString().toInt()
            value = 0.coerceAtLeast(100000.coerceAtMost(value))
            when (v.id) {
                R.id.eTime -> sTime!!.progress = value
                R.id.eHz -> sHz!!.progress = value
                else -> return false
            }
        } catch (e: Exception) {
        }
        return false
    }

    override fun onFocusChange(v: View, hasFocus: Boolean) {
        try {
            var value = (v as TextView).text.toString().toInt()
            value = 0.coerceAtLeast(10000.coerceAtMost(value))
            when (v.getId()) {
                R.id.eTime -> sTime!!.progress = value
                R.id.eHz -> sHz!!.progress = value
                else -> return
            }
        } catch (e: Exception) {
        }
    }

    override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
    }
    override fun onStartTrackingTouch(seekBar: SeekBar) {
    }
    override fun onStopTrackingTouch(seekBar: SeekBar) {
    }

    private fun setupSeekBart()
    {
        sTime?.setOnSeekBarChangeListener(
                object : SeekBar.OnSeekBarChangeListener {
                    override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                        when (seekBar.id) {
                            R.id.sTime -> eTime!!.setText(String.format("%1\$d", progress))
                            else -> return
                        }
                        gTime = eTime!!.text.toString().toDouble()
                        gTime/=1000
                    }

                    override fun onStartTrackingTouch(seekBar: SeekBar) {
                    }

                    override fun onStopTrackingTouch(seekBar: SeekBar) {
                    }
                })
    }



    private fun setupSeekBarh()
    {
        sHz?.setOnSeekBarChangeListener(
                object : SeekBar.OnSeekBarChangeListener {
                    override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                        when (seekBar.id) {
                            R.id.sHz -> eHz!!.setText(String.format("%1\$d", progress))
                            else -> return
                        }
                        gHz = eHz!!.text.toString().toInt()
                    }

                    override fun onStartTrackingTouch(seekBar: SeekBar) {
                    }

                    override fun onStopTrackingTouch(seekBar: SeekBar) {
                    }
                })
    }

    override fun run() {
        TODO("Not yet implemented")
    }
}

試したこと

ここからここまでと書いてあるところを
val vibrationEffect = VibrationEffect.createOneShot(gTime.toLong(), gHz)
vibrator.vibrate(vibrationEffect)
に変えた場合はアプリが落ちませんでした。
落ちた原因はわからなくて困っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 1T2R3M4

    2021/01/16 16:59

    落ちる原因とか調べたことを追記していただけませんか。

    キャンセル

回答 1

check解決した方法

0

Stopボタンを追加してここからここまでと書いてある部分を次のように変更して手を打ちました。

start.setOnClickListener {
            val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
            val vibrationEffect = VibrationEffect.createWaveform(longArrayOf(gTime.toLong(), gTime.toLong()), intArrayOf(gHz, 0), 0)
            vibrator.vibrate(vibrationEffect)
        }
        stop.setOnClickListener{
            val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
            vibrator.cancel()
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る