Notice
Recent Posts
Recent Comments
Link
투케이2K
204. (AndroidStudio/android/java) 노티피케이션 푸시 알림 진동, 소리 발생 커스텀 설정 실시 - notification vibrator sound 본문
Android
204. (AndroidStudio/android/java) 노티피케이션 푸시 알림 진동, 소리 발생 커스텀 설정 실시 - notification vibrator sound
투케이2K 2021. 10. 7. 08:14[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : java
[소스 코드]
/**
[로직 설명]
1. 파이어베이스 푸시 알림 발생 시 >> 모바일 OS 버전 체크
2. 모바일 OS 버전별 알림 표시 처리 >> 오레오 이상 (foreground) >> 오레오 미만 (background)
3. 알림 중요도를 LOW 설정 (알림음 없이 설정, 진동 비활성)
4. 커스텀으로 진동 발생 및 알림음 발생 메소드 생성
5. 사용자 선택에 따라서 분기 처리 및 진동, 알림음 발생 실시
*/
/**
[알림음 중요도 참고]
1. IMPORTANCE_HIGH : 알림음 발생 및 헤드업 알림 표시
2. IMPORTANCE_DEFAULT : 알림음 발생
3. IMPORTANCE_LOW : 알림음 없음
4. IMPORTANCE_MIN : 알림음 없고, 상태 표시줄에 나타나지 않음
*/
//======== [노티피케이션 알림 호출 메소드] ========
//TODO [플래그 값] : 0 = 무음 / 1 = 진동 / 2 = 소리 / 3 = 진동+소리
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //오레오 버전 이상
startForegroundService(0); //오레오 이상 노티피케이션 호출
}
else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
startBackgroundService(0); //오레오 이하 노티피케이션 호출
}
//======== [오레오버전 이상 알림 표시 처리] ========
private void startForegroundService(int flag){
Log.d("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"실행 : 오레오 버전 이상 노티피케이션 적용"+"]");
Log.d("//A_NotiPushSetting//","[플래그] : "+flag+"]");
Log.d("//===========//","================================================");
//TODO [노티피케이션 알림 클릭 시 인텐트 설정 정의]
Intent intent = null;
PendingIntent pendingIntent = null;
try {
intent = new Intent(getApplication(), P_AlertDialog.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags (Intent.FLAG_ACTIVITY_NO_ANIMATION); //시작 할때 애니메이션 없앰
intent.putExtra("tittle", "푸시 메시지 수신 확인");
intent.putExtra("message", String.valueOf(messagae));
pendingIntent = PendingIntent.getActivity(getApplication(), 1, intent,PendingIntent.FLAG_CANCEL_CURRENT);
}
catch (Exception e){
e.printStackTrace();
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ //TODO [오레오 버전 이상 >> 채널 필요]
int importance = NotificationManager.IMPORTANCE_LOW; //TODO [알림 중요도 설정 (알림음 없이 설정 >> 알림바도 내려오지 않음)]
String Noti_Channel_ID = "DefaultNotiSetting"; //TODO [알림 채널 아이디]
String Noti_Channel_Group_ID = "DefaultNoti_Group_Setting"; //TODO [알림 채널 그룹 아이디]
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //TODO [노티피케이션 알림 서비스 객체 생성]
NotificationChannel notificationChannel = new NotificationChannel(Noti_Channel_ID, Noti_Channel_Group_ID, importance); //TODO [알림 채널 설정]
notificationChannel.setVibrationPattern(new long[]{ 0 }); //TODO [알림 진동 발생안함 설정]
notificationChannel.enableVibration(true); //TODO [노티피케이션 진동 설정]
//notificationChannel.setShowBadge(true); //TODO 뱃지 카운트 실시 (디폴트 true)
if(notificationManager.getNotificationChannel(Noti_Channel_ID) != null){ //TODO [이미 만들어진 채널이 존재할 경우]
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"채널 : 채널이 이미 존재합니다"+"]");
Log.d("//===========//","================================================");
Log.d("---","---");
}
else{
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"채널 : 채널이 없어서 만듭니다"+"]");
Log.d("//===========//","================================================");
Log.d("---","---");
notificationManager.createNotificationChannel(notificationChannel); //TODO [알림 채널 생성 실시]
}
notificationManager.createNotificationChannel(notificationChannel);
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), Noti_Channel_ID) //TODO [NotificationCompat.Builder 객체 생성]
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.tk_app_icon)) //TODO [메시지 박스에 아이콘 표시]
.setSmallIcon(R.drawable.ic_logo_white) //TODO [타이틀 창 부분에 화이트 아이콘]
.setColor(ContextCompat.getColor(this, R.color.customColor)) //TODO [화이트 아이콘 색상 지정]
.setWhen(System.currentTimeMillis()) //TODO [알림 표시 시간 설정]
.setShowWhen(true) //TODO [푸시 알림 받은 시간 커스텀 설정 표시]
.setAutoCancel(true) //TODO [알림 클릭 시 삭제 여부]
//.setOngoing(true) //TODO [사용자가 알림 못지우게 설정 >> 클릭해야 메시지 읽음 상태]
.setPriority(NotificationCompat.PRIORITY_LOW) //TODO [알림 중요도 설정]
.setContentTitle(title) //TODO [알림 제목]
//.setNumber(Integer.parseInt(S_Preference.getString(getApplication(), "BadgeCount"))) //TODO [뱃지 카운트 실시 (확인하지 않은 알림 갯수)]
.setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) //TODO [뱃지 아이콘 타입 지정]
.setChannelId(Noti_Channel_ID) //TODO [알림 채널 지정]
.setContentText(messagae); //TODO [알림 내용 지정]
builder.setContentIntent(pendingIntent); //TODO [알림 개별 인텐트 적용]
builder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL; //TODO [노티 알림 삭제 시 자동으로 푸시 뱃지 표시 지움]
notificationManager.notify(1, builder.build()); //TODO [아이디값이 달라야 노티피케이션이 여러개 표시된다]
if(flag == 0){ //TODO 무음
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"무음"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
}
else if(flag == 1){ //TODO 진동
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"진동"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
PushCallVibrator(); //TODO [진동 수행 실시]
}
else if(flag == 2){ //TODO 소리
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"소리"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
PushCallSound(); //TODO [알림음 발생 실시]
}
else if(flag == 3){ //TODO 진동 + 소리
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startForegroundService() 메소드]"+" ["+"진동/소리"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
PushCallVibrator(); //TODO [진동 수행 실시]
PushCallSound(); //TODO [알림음 발생 실시]
}
}
}
//======== [오레오버전 미만 알림 표시 처리] ========
private void startBackgroundService(int flag){
Log.d("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startBackgroundService() 메소드]"+" ["+"실행 : 오레오 버전 이하 노티피케이션 적용"+"]");
Log.d("//A_NotiPushSetting//","[플래그] : "+flag+"]");
Log.d("//===========//","================================================");
//TODO [노티피케이션 알림 클릭 시 인텐트 설정 정의]
Intent intent = null;
PendingIntent pendingIntent = null;
try {
intent = new Intent(getApplication(), P_AlertDialog.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags (Intent.FLAG_ACTIVITY_NO_ANIMATION); //시작 할때 애니메이션 없앰
intent.putExtra("tittle", "푸시 메시지 수신 확인");
intent.putExtra("message", String.valueOf(messagae));
pendingIntent = PendingIntent.getActivity(getApplication(), 1, intent,PendingIntent.FLAG_CANCEL_CURRENT);
}
catch (Exception e){
e.printStackTrace();
}
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O){ //TODO [오레오 버전 이하]
String Noti_Channel_ID = "DefaultNotiSetting"; //TODO [알림 채널 아이디]
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), Noti_Channel_ID) //TODO [NotificationCompat.Builder 객체 생성]
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.tk_app_icon)) //TODO [메시지 박스에 아이콘 표시]
.setSmallIcon(R.drawable.ic_logo_white) //TODO [타이틀 창 부분에 화이트 아이콘]
.setColor(ContextCompat.getColor(this, R.color.customColor)) //TODO [화이트 아이콘 색상 지정]
.setWhen(System.currentTimeMillis()) //TODO [알림 표시 시간 설정]
.setShowWhen(true) //TODO [푸시 알림 받은 시간 커스텀 설정 표시]
.setAutoCancel(true) //TODO [알림 클릭 시 삭제 여부]
//.setOngoing(true) //TODO [사용자가 알림 못지우게 설정 >> 클릭해야 메시지 읽음 상태]
.setPriority(NotificationCompat.PRIORITY_LOW) //TODO [알림 중요도 설정 >> Priority, Vibrator가 있어야 알림바 표시됨]
.setDefaults(Notification.DEFAULT_LIGHTS) //TODO [알림 진동 발생안함 설정]
.setVibrate(new long[]{0L}) //TODO [알림 진동 발생안함 설정]
.setContentTitle(title) //TODO [알림 제목]
//.setNumber(Integer.parseInt(S_Preference.getString(getApplication(), "BadgeCount"))) //TODO [뱃지 카운트 실시 (확인하지 않은 알림 갯수)]
.setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) //TODO [뱃지 카운트 실시]
.setContentText(messagae); //TODO [알림 내용]
builder.setContentIntent(pendingIntent); //TODO [알림 개별 인텐트 적용]
builder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL; //TODO [노티 알림 삭제 시 자동으로 푸시 뱃지 표시 지움]
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build()); //TODO [아이디값이 달라야 노티피케이션이 여러개 표시된다]
if(flag == 0){ //TODO 무음
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startBackgroundService() 메소드]"+" ["+"무음"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
}
else if(flag == 1){ //TODO 진동
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startBackgroundService() 메소드]"+" ["+"진동"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
PushCallVibrator(); //TODO [진동 수행 실시]
}
else if(flag == 2){ //TODO 소리
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startBackgroundService() 메소드]"+" ["+"소리"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
PushCallSound(); //TODO [알림음 발생 실시]
}
else if(flag == 3){ //TODO 진동 + 소리
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("//A_NotiPushSetting//","[startBackgroundService() 메소드]"+" ["+"진동/소리"+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
PushCallDisplay(); //TODO [화면 강제로 깨우기 실시]
PushCallVibrator(); //TODO [진동 수행 실시]
PushCallSound(); //TODO [알림음 발생 실시]
}
}
}
//======== [화면 강제로 기상 실시 메소드] ========
private static final String TAG = A_NotiPushSetting.class.getSimpleName();
public void PushCallDisplay(){
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_NotiPushSetting > PushCallDisplay() 메소드 : 화면 강제 기상 실시]");
Log.d("//===========//","================================================");
Log.d("---","---");
try {
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
//wakelock.acquire(5000);
wakelock.acquire(); //TODO [화면 즉시 켜기]
wakelock.release(); //TODO [WakeLock 해제]
}
catch (Exception e){
e.printStackTrace();
}
}
//======== [모바일 진동 강제 발생 메소드] ========
public void PushCallVibrator(){
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_NotiPushSetting > PushCallVibrator() 메소드 : 진동 발생 실시]");
Log.d("//===========//","================================================");
Log.d("---","---");
try {
/**
* [메시지를 수신받으면 진동 실행]
* 1. 진동 권한을 획득해야한다. AndroidManifest.xml
* 2. Vibrator 객체를 얻어서 진동시킨다
*/
Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000); //TODO [miliSecond, 지정한 시간동안 진동]
}
catch (Exception e){
e.printStackTrace();
}
}
//======== [모바일 알림음 강제 발생 메소드] ========
public void PushCallSound(){
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_NotiPushSetting > PushCallSound() 메소드 : 알림음 재싱 실시]");
Log.d("//===========//","================================================");
Log.d("---","---");
try {
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(),defaultSoundUri);
ringtone.play(); //TODO [사운드 재생]
}
catch (Exception e){
e.printStackTrace();
}
}
//======== [모바일 볼륨 조절 실시 메소드] ========
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//TODO [디바이스의 키 이벤트가 발생했는데, 뒤로가기 이벤트일때]
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_NotiPushSetting > onKeyDown() 메소드 : KEYCODE_BACK : 뒤로 가기 이벤트 실시]");
Log.d("//===========//","================================================");
Log.d("---","---");
// [액티비티 종료 실시]
finish();
overridePendingTransition(0,0);
}
//TODO [디바이스의 볼륨 조절 업 키 이벤트 발생]
if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
// [Ringtone 강제로 볼륨 업 실시]
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mAudioManager.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
}
//TODO [디바이스의 볼륨 조절 다운 키 이벤트 발생]
if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
// [Ringtone 강제로 볼륨 다운 실시]
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mAudioManager.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
}
return true;
}
[결과 출력]
반응형
'Android' 카테고리의 다른 글
Comments