Notification Sound on Android 8.0

도입

Android 8.0 에 오면서부터 Notification Channel 라는 개념이 도입되면서, 알림을 각각 ‘채널’ 로 분류하여 각 채널마다 중요도를 설정, 표시하는 기능이다.

평소대로 ID 를 만들어 채널을 설정하고 알림을 띄웠지만, NotificationCompat.setSound 에 소리를 설정해도 기본 알림 소리만 나왔다. 약 30분 동안 삽질한 결과, NotificationChannel 클래스 자체에 setSound 라는 메서드가 있었다.

해결 방법

Uri soundUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.noti_sound);

if (Build.VERSION.SDK_INT >= 26) {
    CharSequence name = getString(R.string.app_name);
    String description = getString(R.string.app_name);
    int importance = NotificationManager.IMPORTANCE_HIGH;

    NotificationChannel mChannel = new NotificationChannel(id, name, importance);
    mChannel.setDescription(description);

    mChannel.enableVibration(true);
    AudioAttributes audioAttributes = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            .build();

    mChannel.setSound(soundUri, audioAttributes);

    manager.createNotificationChannel(mChannel);
}

단 주의할 점은 생성된 알림 채널은 앱을 지우지 않는 이상 지워지지 않는다는 것이다. 즉, 채널 id를 새로 생성하는 수 밖에 없다.

connect Firebase Project in CircleCI

도입

RxSocialLogin 의 업데이트를 준비하다가, Demo 앱에 google-services.json 을 추가할 일이 생겼다. 해당 파일은 민감한 정보를 담고 있기에 레포, 특히 공개 레포에는 올리면 안 되는 정보로 .gitignore 에 추가하고 푸시를 진행했다.

그리고 몇 분 후, CircleCI 에서 빌드 오류 메일이 오게 되는데 내용은 google-services.json 가 누락되어 작업을 진행할 수 없다는 내용이었다.

이미 CircleCI docs 페이지 내 관련 내용이 있었지만 문서가 완전하지는 않아 여기에 정리해두려 한다.

과정

먼저, google-services.json 을 gitignore에 추가하여 Git에 올라가지 않게 한다.

그 다음, 터미널에서 google-services.json 이 있는 폴더까지 가서 openssl base64 -in google-services.json -out google-services-encrypted를 실행한다.

해당 커맨드를 실행하여 나온 google-service-encrypted 파일 내용을 복사한다.

그리고 CircleCI 내 프로젝트 설정에 들어가 Environment Variables에 들어간다. 그 다음, ‘Add Variable’를 누르고 Name 로는 GOOGLE_SERVICES_JSON, Value 로는 3번에서 복사한 base64를 붙여넣고 ‘Add Variable’를 누른다.

환경변수를 추가하였으면 프로젝트로 돌아가 CircleCI의 설정 파일인 config.yml 에 아래 내용을 추가한다. (적용된 전체 파일은 https://github.com/WindSekirun/RxSocialLogin/blob/1.0.0-dev/.circleci/config.yml 를 참고하면 된다.)

- run :
name: decrypt google-service.json for CI process
command: echo $GOOGLE_SERVICES_JSON | base64 --decode --ignore-garbage > ${HOME}/${CIRCLE_PROJECT_REPONAME}/app/google-services.json

반영된 내용을 푸시하면 빌드가 성공한다.

마무리

참고로, ${HOME}${CIRCLE_PROJECT_REPONAME}는 CircleCI 내부에 정의된 환경변수로 각각 /home/ubuntu, 프로젝트의 이름을 나타낸다.