기타개발

안드로이드에서 톤제너레이터(ToneGenerator)사용할때 크래시해결(kotlin)

rkrkrr0101 2022. 10. 27. 20:58

원인:안드로이드의 오디오 메모리 용량은 1mb라서 oom크래시나는거(라고 스택오버플로우에서 말함)

 

해결:

싱글톤처럼 한개만 유지하면서,완료되면 추가

 

 

함수밖에(귀찮아서 파일 내 전역으로(임포트 바로밑)에 선언했음)

private var toneGenerator:ToneGenerator?=null

선언후

fun beep( mediaFileRawId: Int,i : Int) {

    try {
        if (toneGenerator == null) {
            toneGenerator = ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100)
        }
        toneGenerator!!.stopTone();
        toneGenerator!!.startTone(mediaFileRawId, 200)
        val handler = Handler(Looper.getMainLooper())
        handler.postDelayed(Runnable {
            if (toneGenerator != null) {
                

                toneGenerator!!.release()
                toneGenerator = null
            }
        }, 200)
    } catch (e: Exception) {

    }
}

i는 볼륨조절한다고 넣어둔건데 빼도됨,아마 stopTone도 뺴도될거같은데,안돼서 막넣어보다가 넣어둔건데 빼기귀찮아서 제거안함

사용시엔

beep(ToneGenerator.TONE_CDMA_ALERT_AUTOREDIAL_LITE,300)

 

핸들러는

import android.os.Handler
import android.os.Looper