개발새발 - IT 기술블로그
article thumbnail

안녕하세요. 이번 포스팅에서는 특정 이벤트가 발생한 것을 사용자에게 인지시켜주는 방법 중 하나인 진동을 구현해보도록 하겠습니다.

아래의 TODO TASK의 순서대로 진행하는 예제입니다.

 

 

TODO TASK

1. 진동을 사용하기 위한 권한 추가

2. VibratorManager를 이용한 진동발생 클래스 구현

3. 버튼을 클릭하였을 때 SnackBar와 함께 진동 구현

4. 진동 List를 만들어 여러번 울리는 진동 구현

5. <P.S> Coroutine으로 비동기 처리

 


본문👀

 

진동을 사용하기 위한 권한 추가

<AndroidManifest.xml>

<uses-permission android:name="android.permission.VIBRATE" />

 

 

VibratorManager를 이용한 진동발생 클래스 구현

 

안드로이드 SDK 버전 31부터 VIBRATOR_SERVICEdeprecated 되어 버전별 대응을 해줍니다.

import android.content.Context
import android.content.Context.VIBRATOR_SERVICE
import android.os.Build
import android.os.VibrationEffect
import android.os.Vibrator
import android.os.VibratorManager

class MakeVibrator {
    private lateinit var vib: Vibrator

    fun init(context: Context) {
        vib = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            val vibratorManager =
                context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
            vibratorManager.defaultVibrator
        } else {
            @Suppress("DEPRECATION")
            context.getSystemService(VIBRATOR_SERVICE) as Vibrator
        }
    }

    fun make(time: Long) {
        vib.vibrate(
            VibrationEffect.createOneShot(
                time,
                VibrationEffect.DEFAULT_AMPLITUDE,
            )
        )
    }
}

 

 

 

버튼을 클릭하였을 때 SnackBar와 함께 진동 구현

// 진동을 한번 울림
private fun vibrateSingle() {
    MakeVibrator().run {
        init(this@MainActivity)
        make(200)
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val btn: Button = findViewById(R.id.btn)
    val layout: ConstraintLayout = findViewById(R.id.layout_main)

    btn.setOnClickListener {
        vibrateSingle()
        Snackbar.make(this, layout, "완료 메시지", Snackbar.LENGTH_SHORT).show()
    }
}

 

진동 List를 만들어 여러번 울리는 진동 구현

// 진동을 설정한 배열의 수와 길이만큼 울림
private fun vibrateArray() {
    MakeVibrator().run {
        init(this@MainActivity)
        longArrayOf(100, 100, 100).forEach {
            make(it)
            Thread.sleep(100)
        }
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val btn: Button = findViewById(R.id.btn)
    val layout: ConstraintLayout = findViewById(R.id.layout_main)

    btn.setOnClickListener {
        vibrateArray()
        Snackbar.make(this, layout, "완료 메시지", Snackbar.LENGTH_SHORT).show()
    }
}

 

<P.S> Coroutine으로 비동기 처리

 

실행해보면 진동이 모두 울린 에 Snackbar가 생성됩니다. Thread.sleep(100) 이부분이 해당 스레드를 일시정지 시켜 메인 스레드를 점유하는 현상이 발생하기 때문입니다.  따라서 비동기 처리를 해주어 Snackbar와 별개의 스레드에서 동시에 작업을 완료 할 수도 있습니다. 저는 Coroutine을 이용하였습니다. 참고만 해주시면 되겠습니다.

// 진동을 설정한 배열의 수와 길이만큼 울림
private fun vibrateArray() {
    CoroutineScope(Dispatchers.Default).launch {

        MakeVibrator().run {
            init(this@MainActivity)

            longArrayOf(100, 100, 100).forEach {
                make(it)
                delay(100)
            }
        }
    }
}

 

이렇게 안드로이드 스튜디오에서 진동을 구현하는 방법에대해 알아보았습니다. 다른 궁금한 점이나 더 좋은 방법이 있다면 댓글 부탁드립니다. 감사합니다.

 

 

 

소스코드

 

https://github.com/tekken5953/VibratorExam/tree/master

 

GitHub - tekken5953/VibratorExam

Contribute to tekken5953/VibratorExam development by creating an account on GitHub.

github.com