#11 안드로이드 스튜디오로 안드로이드 앱 만들기 - 다양한 사용자 알림 효과 : 진동과 소리

2018. 1. 29. 13:02안드로이드

반응형

안드로이드 스튜디오로 안드로이드 앱 만들기 - 개발 환경 구축

#2 안드로이드 스튜디오로 안드로이드 앱 만들기 - 개발 디렉토리와 파일 구조

#3 안드로이드 스튜디오로 안드로이드 앱 만들기 - 액티비티(Activity) 뷰(View) 구조

#4 안드로이드 스튜디오로 안드로이드 앱 만들기 - UI 작성 방법 : 자바코드 VS 레이아웃 XML

#5 안드로이드 스튜디오로 안드로이드 앱 만들기 - 뷰(View)의 기초 속성

#6 안드로이드 스튜디오로 안드로이드 앱 만들기 - 뷰(View)의 계층구조

#7 안드로이드 스튜디오로 안드로이드 앱 만들기 - 레이아웃(Layout)을 활용한 다양한 뷰(View) 배치 : LinearLayout편

#8 안드로이드 스튜디오로 안드로이드 앱 만들기 - 레이아웃(Layout)을 활용한 다양한 뷰(View) 배치 : RelativeLayout편

#9 안드로이드 스튜디오로 안드로이드 앱 만들기 - 레이아웃(Layout)을 활용한 다양한 뷰(View) 배치 : 탭 화면 구현 - TabHost

#10 안드로이드 스튜디오로 안드로이드 앱 만들기 - 레이아웃(Layout)을 활용한 다양한 뷰(View) 배치 : ConstraintLayout





대부분의 앱에서 사용자가 스마트폰 화면을 보고 있지 않을 때 진동이나 소리를 울려서 앱의 상황을 알린다.


진동울리기

안드로이드에서 진동이 울리게 하려면 퍼미션(Permission)이 설정되어 있어야한다. 앱에 퍼미션을 설정하지 않으면 진동이 울리는 순간 오류가 발생하고 앱이 자동으로 종료된다.


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

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


퍼미션이 설정되었다면 이제 진동을 울리는 코드를 작성해야 하는데, 이 코드는 2줄 정도로 작성할 수있다. 이렇게 간단한 이유는 진동을 위한 Vibrator라는 SystemService가 제공되기 때문이다. Vibrator 객체를 획득하여 vibrate() 함수 호출로 간단하게 진동을 울릴 수 있다.

1
2
Vibrator vib = (Vibrator)getSystemService(VIBRATOR_SERVICE);
vib.vibrate(1000);
cs


vibrate() 함수의 매개변수는 진동이 울리는 시간이다. 1000으로 설정하면 1초 동안 진동이 울린다. 그런데 진동을 여러번 반복해서 울려야 하는 때가 있다. 이럴 때는 다음 함수를 사용한다.

1
vibrate(long[] pattern, int repeat);
cs


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

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

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





소리울리기

진동 못지않게 많이 사용하는 사용자 알림 방법이 소리(beep) 울리기이다. 또는 진동과 소리를 같이 울리기도 한다.


■ 시스템 효과음

안드로이드 시스템에는 여러 가지 효과음이 등록되어 있다. 여기에는 간단한 알림, 알람, 전화수신음 등이 있다. 이 중 울리고자 하는 효과음을 선택해야 한다. 스마트폰에 등록된 효과음의 식별자를 Uri 타입으로 획득해야 한다. 효과음은 RingtonManager의 getDefaultUri() 함수를 이용하여 획득한다. ALARM, NOTIFICATION, RINGTON 등이 있다. Uri 값으로 식별되는 효과음을 재생할 수 있는 Ringtone을 얻어 play() 함수로 재생한다.

1
2
3
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
ringtone.play();
cs


■ 개발자 임의의 효과음

안드로이드 시스템에 등록된 효과음을 이용하는 경우가 대부분이지만, 직접 녹음한 효과음을 이용하는 경우도 있다. 이럴 때는 녹음한 효과음을 리소스로 만들어서 사용해야하는데 효과음을 리소스로 만들때는 res 하위의 raw 폴더를 이용한다. 

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




간단하게 진동와 효과음을 재생하는 프로그램을 만들어보자


퍼미션 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.part2_5">
 
    <uses-permission android:name="android.permission.VIBRATE" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Lab5_2Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
cs


레이아웃 XML 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <Button
        android:id="@+id/btn_vbiration"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Vibration"/>
 
    <Button
        android:id="@+id/btn_system_beep"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="system beep"/>
 
    <Button
        android:id="@+id/btn_custom_sound"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="custom sound"/>
 
</LinearLayout>
 
cs


JAVA 코드 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.example.part2_5;
 
import android.media.MediaPlayer;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
 
    Button vibrationBtn;
    Button systemBeepBtn;
    Button customBeepBtn;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        vibrationBtn = (Button)findViewById(R.id.btn_vbiration);
        systemBeepBtn = (Button)findViewById(R.id.btn_system_beep);
        customBeepBtn = (Button)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(new long[]{500,1000,500,1000}, -1);
 
 
        }else if(v==systemBeepBtn){
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
            ringtone.play();
 
        }else if(v==customBeepBtn){
            MediaPlayer player = MediaPlayer.create(this, R.raw.fallbackring);
            player.start();
 
        }
 
    }
}
 
cs



완성.




개발자 임의의 효과음을 위해서는 raw 폴더를 생성해야 한다.


res 폴더를 마우스 오른쪽으로 선택하여 [new - Android resource directory] 메뉴 선택



리소스 폴더명은 지정되어 있으므로 개발자가 직접 입력할 필요 없이 [Resource type]를 선택하기만 하면된다.


그리고 준비된 음원 파일을 생성된 raw 폴더에 넣는다.






반응형