이 글은 이것이 안드로이드다 with 코틀린(개정판)을 참고하여 작성하였습니다.
작성자 : 홍수정
개발환경은 Windows, Android Studio입니다.
(세션 발표하는 주 라서 블로그 포스팅이 늦었습니다. 죄송합니다)
Andriod 뮤직 플레이어 만들기
1. 음원 다운로드
웹 브라우저를 열어 "free mp3 downloads last.fm"으로 검색
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. 결과화면
'GDSC HUFS 3기 > Android with Kotlin Team 5' 카테고리의 다른 글
[5팀] 코틀린 안드로이드 기초강의_51 | Android 구글 맵 사용하기 (0) | 2021.12.10 |
---|---|
[5팀] 코틀린 안드로이드 기초강의_50 | Android AsyncTask의 구조와 제작 사항 (0) | 2021.12.10 |
[5팀] 코틀린 안드로이드 기초강의_46~48 | 코루틴으로 이미지 불러오기, 서비스, 포그라운드 (0) | 2021.11.30 |
[5팀] 코틀린 안드로이드 기초강의_43,44,45 | 카메라 원본 이미지, 갤러리, 쓰레드 타이머 (0) | 2021.11.30 |
[5팀]코틀린 안드로이드 기초강의_41,42 | SQLite, Room (0) | 2021.11.23 |