GDSC HUFS 3기/Android with Kotlin Team 5

[5팀] 코틀린 안드로이드 기초강의_49 | Android 뮤직 플레이어 만들기

나쵸 소스 2021. 12. 5. 16:46

이 글은 이것이 안드로이드다 with 코틀린(개정판)을 참고하여 작성하였습니다.

작성자 : 홍수정

개발환경은 Windows, Android Studio입니다. 

 

(세션 발표하는 주 라서 블로그 포스팅이 늦었습니다. 죄송합니다)

Andriod 뮤직 플레이어 만들기


 

1. 음원 다운로드

웹 브라우저를 열어 "free mp3 downloads last.fm"으로 검색

다운을 받은 후 Play Music 앱을 실행한 화면

 

 

 

2. 음원 목록을 화면에 나타내기 위한 코드

 

외부 저장소가 있기 위해서는 manifests에 권한 추가를 해주어야함

 

<manifests>

<user-permission andriod:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

<MainActivity>

val permissions=arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) // 권한체크

if (isPermitted()){
startProcess() // 앱 진행
}
else{
ActivityCompat.requestPermission(this,arrayOf(permission),REQ_READ)
}

fun startProcess(){
//뒤에 코드를 추가작성할 예정
}

fun isPermitted():Boolean{
//책에는 checkPermission
if (ContextCompat.checkSelfPermission(this,permission)!=PackageManager.PERMISSION_GRANTED){
return false
}
return true
}

override fun OnRequestPermissionResult(
requestCode:Int,
permissions:Array<out String>,
grantResults:IntArray
){if (requestCode==REQ_READ){
if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
startProcess()
}else{
Toast.makeText(this, "권한 요청을 승인해야지만 앱을 실행할 수 있습니다.",Toast.LENGTH_LONG).show()
finish()
}
}
}

 

 

 

3. xml 화면 구성

 

RecyclerView를 생성한다. (이 때, 전에 배웠던 RecyclerView의 흐름을 기억하고 가면 좋다. )

음원 목록을 보여줄 이미지와 가수 이름, 노래 제목을 넣어준다. 

 

 

 

4. Class 코드 작성

(1) 앞에 Item레이아웃에 있었던 노래 제목 등의 데이터를 넣을 수 있는 클래스

class Music(id:String, title:String?, artist:STring?, albumId:String?, duration:Long?) { 
	var id:String = "" 
    var title:String? = "" 
    var atrist:String? = ""
    var albumId:String? = "" 
    var duration:Long? = 0 
    //관련 데이터들
} 
	init {
    	this.id = id 
        this.title = title
        this.artist = artist
        this.albunId = albumId
        this.duration = duration
	}
    //생성자
    
    fun getMusicUri(): Uri { 
    	return Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_COMTENT_URI, id)
    } 
    //음원 URL 호출
	fun getAlbumUri(): Uri { 
    	return Uri.parse( uriString: "content://content://media/external/audio/albumart/$albunId")
    }
    //앨범 이미지 URL

 

 

(2) 어댑터 클래스 생성

class MusicAdapter : RecyclerView.Adapter<Holder>() {
	val musicList = mutableListOf<Mustic>()
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    	val view = LayoutInflater.from(parent.content) 
 			.inflate(R.layout.item_layout, parent, attatchToRoot: false)
        return Holder(view) 
 	}
    override fun getItemCount(): Int{
    	return musicList.size
 	}
   	override fun onBindViewHolder(holder: Holder, position: Int) {
    	val music = musicList[position]	
        holder.setMusic(music)
    } 
}
class Holer(itemView: View) :RecyclerView.ViewHolder(itemView) {
	var musicUri:Uri? = null 
	fun setMusic(music:Music) {
    	musicUri = music.getMusicUri()
    	itemView.imageAlbum.setImageURI(music.getAlbumUri())
        itemView.textArtist.text = music.artist
        itemView.textTitle.text = music.title
        val sdf = SimpleDateFormat( pattern: "mm:ss" )
        itemView.textDuration.text = sdf.format(music.duration)
    }  
}

 

 

 

5. MainActivtiy에서 음원을 불러오는 코드 작성

 

fun startProcess() {
    val adapter = MusicAdapter()
    adapter.musicList.addAll(getMusicList())
    
    recyclerView.adapter = adapter 
    recyclerView.layoutManager = LinearLayoutManager( context: this)
 }
fun getMusicList():List<Music> { 
    val musicListUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 
    val proj = arrayOf(
    	MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.TITLE,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.ALBUM_ID,
        MediaStore.Audio.Media._DURATION
    )
    val cursor = contentResolver.query(musicListUri, proj, selection: null, selectionArgs: null, setOrder: null)
    val musicList = mutableListOf<Music>()
    while(cursor?.moveToNext() ?: false) { 
    	val id = cursor!!.getString( columnlndex: 0)
        val title = cursor!!.getString( columnlndex: 1)
        val artist = cursor!!.getString( columnlndex: 2)
        val albumId = cursor!!.getString( columnlndex: 3)
        val duration = cursor!!.getLong( columnlndex: 4)  
        val music = Music(id, title, artist, albumId, duration)
        musicList.add(music)
    }
	return musicList
}

 

 

 

 

6. 결과화면

해당 목록의 노래를 하나 클릭하면 음원 재생이 됨