본문 바로가기
코딩과 알고리즘

크레이의 앱개발 도전기 #8. 크리스마스 배경음악 앱

※ 이 게시글은 크레이의 IT개발 관련 성장기를 다루고 있습니다. 관련지식이 약간 있어야 이해되실 수 있습니다. 가벼운 마음으로 읽어보시면서 흥미가 생기고 의욕이 생긴다면? 개발자의 자질이 있으신 겁니다 :)

 

https://edu.goorm.io/learn/lecture/15564/현직개발자가-알려주는-안드로이드-앱-개발/lesson/727138/16-dialog-팝업창 

https://edu.goorm.io/learn/lecture/15564/현직개발자가-알려주는-안드로이드-앱-개발/lesson/727139/17-service-백그라운드-음악 

오늘은 좀 공을 들여서 홍드로이드님의 강좌 두 편을 참조해 앱을 만들어 보았습니다!

'다이얼로그'와 '배경음악 재생 서비스'에 대한 부분인데요.
크리스마스가 곧 다가오니, 예수님의 탄생기념일을 축하하는 의미도 있구요 ㅎㅎ

기술적 부분은 홍드님 강좌를 참조하시구요.
대략적인 앱의 설명과 크레이가 특별히 다르게 적용한 부분에 대한 경험을 공유드릴께요.

참고로 무료 이미지로 유명한 픽사베이에서 저작권 문제가 없는 무료 음악도 공개하더라구요.
오늘 배경음악은 아래에서 가져왔습니다. 신나는 음악도 많아요~
https://pixabay.com/ko/music/

그럼 렛츠 고우~

 


앱 설명

사실 조작법은 쉬워서 설명 드릴 부분이 없습니다.
1)번을 누르면 음악을 선택할 수 있는데요.

선택 후 확인 버튼을 누르면 바로 재생이 됩니다.
하지만 취소 버튼을 누르면 아무 변화가 없고요.

2)번을 누르면 현재 선택한 음악재생이 시작되고
3)번을 누르면 현재 선택한 음악재생이 중지됩니다.

그런데 서비스 방식의 음악 재생이기 때문에 앱을 끄고 홈화면으로 나가도 계속 재생이 됩니다.
다만, 화면 잠금 상태가 되면 음악이 중지되는데요.
아마도 화면 잠금 상태에서도 재생하려면 특별한 기술이 필요한 것 같습니다.


강좌 외에 알아낸 기술

스크롤 뷰 적용

화면을 가로 회전해보았더니 아랫 부분이 잘리는 문제가 있었는데요.
리니어 레이아웃(LinearLayout) 만 가지고는 잘리는 부분을 볼 수가 없더라구요.


그래서 구글링 전법을 발휘, 방법을 알아내어 스크롤뷰(Scroll View)를 적용해보았습니다.
리니어를 스크롤로 감싸면 간단히 해결되더라구요.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:app="http://schemas.android.com/apk/res-auto"
   
xmlns:tools="http://schemas.android.com/tools"
   
android:layout_width="match_parent"
   
android:layout_height="match_parent"
   
android:orientation="vertical"
   
tools:context=".MainActivity">

    <
LinearLayout
       
android:layout_width="match_parent"
       
android:layout_height="match_parent"
       
android:orientation="vertical">
          :
    </
LinearLayout>
</
ScrollView>

라디오 선택상자

사실 이 부분은 좀 헤멨습니다.
음악을 선택하는 라디오 버튼의 코드를 구글링해서 넣어보았는데, 이상하게 도무지 나오질 않는 것이었습니다
.


결국 알아낸 것은 ad.setMessage 라인 때문인데요. 2개를 동시에 사용할 수 없는 제약이 있는 것 같더라구요.
그래서 ad.setMessage 를 사용하지 않도록 하니 해결되었습니다.
지금 깊게 찾아보기 보다는 연습하다 보면 자연스레 알아내게 될 것 같아서 넘어가기로 했습니다.

btn_dialog.setOnClickListener(new View.OnClickListener() {
 
@Override
 
public void onClick(View view) {
 
AlertDialog.Builder ad =
  
new AlertDialog.Builder(MainActivity.this);
 
ad.setIcon(R.mipmap.ic_launcher);
 
ad.setTitle("음악을 선택하세요");
 
// ad.setMessage("음악을 선택하세요."); <-- ad.setSingleChoiceItems 외 동시 사용 불가

 
TmpIndex = SelectIndex;
 
ad.setSingleChoiceItems(
  
R.array.musiclist,
  
SelectIndex,
  
new DialogInterface.OnClickListener() {
  
@Override
  
public void onClick(DialogInterface dialogInterface, int i) {
   
TmpIndex = i;
   }
  });

선택한 음악 재생

사실 이 부분은 좀 아쉬웠는데요. 약간 주먹구구식으로 짰습니다.
음악 목록을 XML 로 정의한 것은 좋았는데

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <
string-array name="musiclist">
        <
item>angelofgodfromheaven.mp3</item>
        <
item>awayinamangerchristmas.mp3</item>
        <
item>happychristmas.mp3</item>
    </
string-array>
</
resources>

이 명칭을 음악 리소스에 이름과 매칭하는 법을 몰라서,
아래와 같이 하나씩 if 문으로 처리했습니다.
R.raw.어쩌고 하는 음악 리소스는 안드로이드가 자동으로 배정하는 숫자값이거든요.
이 부분을 어떻게 자동으로 매칭할지는 딱히 아직은 모르겠더라구요.

// 선택한 목록을 음악리스트에서 받아옴
String item = getResources()
 .getStringArray(
R.array.musiclist)[SelectIndex];

// 선택한 음악을 임시변수에 보관
Integer MusicResource = 0;

if(item.equals("angelofgodfromheaven.mp3"))
 MusicResource =
R.raw.angelofgodfromheaven;
else if(item.equals("awayinamangerchristmas.mp3"))
 MusicResource =
R.raw.awayinamangerchristmas;
else if(item.equals("happychristmas.mp3"))
 MusicResource =
R.raw.happychristmas;

그리고 선택한 음악을 서비스에 넘겨주기 위해,  putExtra 메소드를 사용했는데,
홍드님의 이전 강좌에서 본 것 같습니다.

// Music 서비스 호출 준비!
Intent intent = new Intent(
 getApplicationContext(),
 
MusicService.class);

// 넘겨울 파라미터를 설정 : 음악은 이걸로 부탁~해요
intent.putExtra("music", MusicResource.toString());

// 서비스 시작!
startService(intent);

음악 서비스에서는 이 변수를 받아서 처리해야 하기 때문에,
onStartCommand 메소드에서 파라미터를 받아 배경음악을 설정하고, 재생하였습니다.
재생 시작을 두 번 연이어 하면 음악도 두번 연이어 나오는 문제가 있어 예외 처리도 하였지요.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
 
// 음악 리소스 값
 
String result = intent.getStringExtra("music");

 
// 원래 음악이 재생중이면 중지
 
if(mediaPlayer!=null && mediaPlayer.isPlaying())
 
mediaPlayer.stop();

 
// 음악 리소스 설정
 
mediaPlayer = MediaPlayer.create(
 
this,
 
Integer.parseInt(result) );

 
// 반복 재생 설정
 
mediaPlayer.setLooping(true);

 
// 음악을 켜!
 
mediaPlayer.start();

 
return super.onStartCommand(intent, flags, startId);
}

그 외에는 뭐.. 화면을 좀 예쁘게 꾸며보려고 이미지를 넣은게 전부일까요? :)


깃 허브 & 소스코드 공개

오늘 처음으로 '깃허브(GITHUB)'란걸 써보았습니다.
'깃(GIT)'이야 뭐 업무적으로 매일 매일 사용하고 있지만 '깃허브'는 써본적은 없었습니다.

처음 사용해본거라 약간 아리송하긴 한데 안드로이드 스튜디오에서 직접 올릴수 있어서 매우 편리하더라구요.

음악, 폰트, 이미지 등의 리소스도 함께 올릴수 있어서
앞으로는 전체 소스를 본문에 첨부하기 보다는
깃허브에 올려 공개하는 방향으로 진행학겠습니다.
( 용량제한은 없으려나.. )

오늘의 소스는 아래 깃허브에 올렸으니 필요하신 분은 참조해 주셔도 좋을것 같습니다.

https://github.com/drlee7-cray/android-practice

참고로 깃허브에 올라간 파일을 내려받아 안드로이드 스튜디오에서 여는 방법은
홍드로이드님의 아래 강좌를 참조하시면 딱 좋을것 같습니다.
설명을 너무 잘 해주세요~

https://edu.goorm.io/learn/lecture/15564/현직개발자가-알려주는-안드로이드-앱-개발/lesson/727143/21-로딩화면-만들기-feat-github 


오늘도 방문해주신 모든 분들께 감사드립니다.
'구독'과 '좋아요'는 사랑입니다 :)