오늘은 진동과 효과음을 재생하는 프로그램을 작성해 보려 한다.
세 개의 버튼을 눌렀을 때, 각각의 버튼에 등록되어 있는 진동과 효과음을 재생하는 형태로 구현해 보자.

◼︎ 진동 울리기

앱의 상황을 알리기 위해 진동과 소리가 사용되며, 그 중 진동을 울리기 위해서는 퍼미션(Permission)이 설정되어 있어야 한다. 앱에 퍼미션을 설정하지 않으면 진동이 울리는 순간 오류가 발생하고 앱이 자동으로 종료된다.

퍼미션은 앱의 메인 환경파일인 AndroidManifest.xml 파일에서 설정한다.

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

퍼미션을 설정했다면 이제 진동을 울리는 코드를 작성한다. 진동을 위한 Vibrator라는 SystemService가 제공되어 간단하게 작성이 가능하다.

Vibrator 객체를 획득하여 vibrate() 함수 호출로 진동을 울릴 수 있다.

Vibrator vib=(Vibrator)getSystemService(VIBRATOR_SERVICE);
vib.vibrate(1000);

vibrate() 함수의 매개변수는 진동이 울리는 시간이다.
1000은 1초 동안 진동을 울리는데, 여러 번 반복하여 진동을 울려야 할 때는

vibrate(long[] pattern, int repeat)

함수를 이용한다.

진동이 계속 울리게 하려면, 첫 번째 매개변수가 long 형 배열이야 한다.
배열 값은 홀수 번째 값이 대기시간, 짝수 번째 값이 진동시간이다.
두 번째 매개변수는 몇 번 반복할 것인가의 설정으로 값을 0으로 주면 코드에서 취소할 때까지 무한반복 되며, -1로 주면 한 번만 패턴대로 진동이 울린다.

►예시

Vibrator vib=(Vibrator)getSystemService(VIBRATOR_SERVICE);
vib.vibrate(new long[]{500, 1000, 500, 1000}, -1);

위의 예시는 진동이 처음 0.5초 대기 후 1초 진동이 울리고, 다시 0.5초 대기 후 1초간 진동이 울린다. 그리고 이 패턴의 반복 여부가 -1로 설정되었으므로 반복하지 않는다.

◼︎ 소리 울리기

■ 시스템 효과음
안드로이드 스마트폰에 내장된 기본 효과음을 앱에서 많이 사용한다.
이를 이용하는 방법에 대해 알아보자.

Uri notification = RingtonrManager.getDefaultUri(RingtoneManaget.TYPE_NOTIFICATION);
Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
ringtonr.play();

안드로이드 시스템에는 간단한 알림, 알람, 전화 수신음 등 여러 가지 효과음이 등록되어 있다. 이 중 울리고자 하는 효과음의 식별자를 Uri 타입으로 획득해야 한다.

효과음은 RingtoneManager의 getDefaultUri() 함수를 이용하여 획득하는데, ALARM, NOTIFICATION, RINGTONE 등이 있다. Uri 값으로 식별되는 효과음을 재생할 수 있는 Ringtone을 얻어 play() 함수로 재생한다.

■ 개발자 임의의 효과음
안드로이드 시스템에 등록된 효과음이 아닌 직접 녹음한 효과음을 이용할 때, 녹음한 효과음을 리소스로 만들어 이용한다. 효과음을 리소스로 만들 때는 res 하위의 raw 폴더를 이용하는데, 등록한 효과음을 MediaPlayer를 이용해 간단하게 재생할 수 있다.

MediaPlayer player=MediaPlayer.create(this, R.raw.fallbackring);
player.start();

이제 위의 화면을 구현해 보자.

짧은 효과음을 직접 녹음해 리소스로 만들어 사용해보자.

[res → Android resource directory] 메뉴를 선택한다.

리소스 폴더명은 지정되어 있으므로 개발자가 직접 입력할 필요 없이 raw 타입을 선택하명 폴더명이 자동으로 "raw"가 된다. 이렇게 만들어진 raw 폴더에 준비한 음원 파일을 복사하면 된다.

진동을 울리기 위해서 AndroidManifest.xml 파일에 퍼미션을 설정한다.

레이아웃 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Vibrate_sound"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Vibrator"
        android:id="@+id/btn_vibrator"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="system beep"
        android:id="@+id/btn_system_beep"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="custom sound"
        android:id="@+id/btn_custom_sound"/>

</LinearLayout>

자바 코드

public class Vibrate_sound extends AppCompatActivity implements View.OnClickListener {

    Button vibrationBtn;
    Button systemBeepBtn;
    Button customBeepBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vibrate_sound);

        vibrationBtn = findViewById(R.id.btn_vibrator);
        systemBeepBtn = findViewById(R.id.btn_system_beep);
        customBeepBtn = findViewById(R.id.btn_custom_sound);

        vibrationBtn.setOnClickListener(this);
        systemBeepBtn.setOnClickListener(this);
        customBeepBtn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        if (v == vibrationBtn){
            Vibrator vib = (Vibrator) getSystemService(VIBRATOR_SERVICE);
            vib.vibrate(1000);
        }else if (v == systemBeepBtn){
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone ringtone =
                    RingtoneManager.getRingtone(getApplicationContext(), notification);
            ringtone.play();
        }
    }
}

✏️ 일 끝나고선 하는건 역시나 너무 힘들지만.. 나중에 보면 매우 뿌듯할 듯 하다. 알람 앱을 만들면 소리와 진동은 필수적으로 필요한 부분이라 유익하게 쓸 수 있었다. 진동에 퍼미션 설정해야 하는 걸 까먹고 있었는데.. 화면이 꺼지는 이유를 다시 알았다 ㅋㅋ 휴 오늘도 두 개 채우도록 해야지..

profile
찌끄레기 코딩

0개의 댓글