오늘도 삽질중

[android] oreo notification 간단 예제 본문

안드로이드

[android] oreo notification 간단 예제

Choi3950 2018. 8. 30. 04:35
반응형

며칠전에 핸드폰을 노트8로 바꾸면서 API가 Oreo로 변경이 되었습니다.


Oreo로 바뀌면서 기존핸드폰 API 버전인 Nougat 에서 잘 동작하던 Notifiaction이 작동하지 않았습니다.


검색해보면 여러 블로그에 친절한 설명도 있지만 저는 잘 작동하는 예제가 필요했습니다.


그래서 제가 간단하게 테스트를 해보면서 이상없이 동작되는 소스를 공유합니다.


버전을 체크하고 각 버전에 맞게끔 노티가 띄워지는 부분만 테스트를 완료하였습니다.


추가적으로 필요하신 부분은 자료가 많으니 추가해서 사용하시면 되겠습니다.


코드 간간히 주석으로 설명이 되어있는 부분을 참고하시고 , 코드에 주석처리가 되어있는 부분은 지우고 사용하셔도 됩니다.


*** 본 테스트는 갤럭시 노트8(API 26 Oreo) , 갤럭시 A6(API 24 Nougat) , 녹스 가상디바이스(API 22 Lollipop) 에서 정상작동하는것을 확인했습니다. ***



xml 파일에는 단순히 버튼하나만 놓고 버튼을 클릭하면 노티를 받는 구조로 진행했습니다.


MainActivity.java


import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

Button btn1;

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

btn1 = findViewById(R.id.button1);


btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1){
/**
* 누가버전 이하 노티처리
*/
Toast.makeText(getApplicationContext(),"누가버전이하",Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

BitmapDrawable bitmapDrawable = (BitmapDrawable)getResources().getDrawable(R.mipmap.ic_launcher);
Bitmap bitmap = bitmapDrawable.getBitmap();

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()).
setLargeIcon(bitmap)
.setSmallIcon(R.mipmap.ic_launcher)
.setWhen(System.currentTimeMillis()).
setShowWhen(true).
setAutoCancel(true).setPriority(NotificationCompat.PRIORITY_MAX)
.setContentTitle("노티테스트!!")
.setDefaults(Notification.DEFAULT_VIBRATE)
.setFullScreenIntent(pendingIntent,true)
.setContentIntent(pendingIntent);

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0,builder.build());

}
else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
Toast.makeText(getApplicationContext(),"오레오이상",Toast.LENGTH_SHORT).show();
/**
* 오레오 이상 노티처리
*/
// BitmapDrawable bitmapDrawable = (BitmapDrawable)getResources().getDrawable(R.mipmap.ic_launcher);
// Bitmap bitmap = bitmapDrawable.getBitmap();
/**
* 오레오 버전부터 노티를 처리하려면 채널이 존재해야합니다.
*/

int importance = NotificationManager.IMPORTANCE_HIGH;
String Noti_Channel_ID = "Noti";
String Noti_Channel_Group_ID = "Noti_Group";

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel notificationChannel = new NotificationChannel(Noti_Channel_ID,Noti_Channel_Group_ID,importance);

// notificationManager.deleteNotificationChannel("testid"); 채널삭제

/**
* 채널이 있는지 체크해서 없을경우 만들고 있으면 채널을 재사용합니다.
*/
if(notificationManager.getNotificationChannel(Noti_Channel_ID) != null){
Toast.makeText(getApplicationContext(),"채널이 이미 존재합니다.",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(getApplicationContext(),"채널이 없어서 만듭니다.",Toast.LENGTH_SHORT).show();
notificationManager.createNotificationChannel(notificationChannel);
}

notificationManager.createNotificationChannel(notificationChannel);
// Log.e("로그확인","===="+notificationManager.getNotificationChannel("testid1"));
// notificationManager.getNotificationChannel("testid");


NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(),Noti_Channel_ID)
.setLargeIcon(null).setSmallIcon(R.mipmap.ic_launcher)
.setWhen(System.currentTimeMillis()).setShowWhen(true).
setAutoCancel(true).setPriority(NotificationCompat.PRIORITY_MAX)
.setContentTitle("노티테스트!!");
// .setContentIntent(pendingIntent);

// NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0,builder.build());

}
}
});
}
}



누가버전 이하






오레오 이상





반응형
Comments