투케이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;
    }

[결과 출력]


 

반응형
Comments