Notification texts go here Contact Us

Aplikasi Pemutar Musik Android: Membangun Aplikasi dari Awal dengan Kotlin

membahas cara membangun aplikasi pemutar musik sederhana untuk Android menggunakan bahasa pemrograman Kotlin. Langkah demi langkah, kita akan menjelas

 1. AndroidManifest.xml:

[<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Mengizinkan aplikasi untuk membaca penyimpanan eksternal -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- Mengizinkan aplikasi untuk merekam audio -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="Music App"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MusicPlayerApp_Java">
        <!-- Aktivitas utama yang diluncurkan saat aplikasi dimulai -->
        <activity
            android:name=".PlayerActivity"
            android:label="Now playing..."
            android:parentActivityName=".MainActivity"
            android:exported="false" />
        <!-- Aktivitas utama yang menunjukkan ikon aplikasi di layar utama -->
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>]

2. build.gradle:

[plugins {
    id 'com.android.application'
}
apply plugin: 'kotlin-android'

android {
    compileSdk 34

    defaultConfig {
        applicationId "uz.context.musicplayerapp_java"
        minSdk 21
        targetSdk 31
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    
    // Menentukan versi kompatibilitas Java
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
    // Menentukan namespace aplikasi
    namespace 'uz.context.musicplayerapp_java'
}

dependencies {
    // Implementasi dependensi untuk kompatibilitas versi AndroidX
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    
    // Implementasi dependensi untuk pengujian
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    
    // Implementasi dependensi untuk mengelola izin
    implementation 'com.karumi:dexter:6.2.2'
    
    // Implementasi dependensi untuk Kotlin
    implementation "androidx.core:core-ktx:+"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.22"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22"
    
    // Implementasi dependensi untuk visualizer audio
    implementation "com.gauravk.audiovisualizer:audiovisualizer:0.9.2"
}]

3. CustomAdapter.kt:

[// Kelas adapter untuk RecyclerView
class CustomAdapter(private val context: Context, private val list: Array<String>, private val listener: ItemClickListener) :
    RecyclerView.Adapter<CustomAdapter.CustomViewHolder>() {

    // ViewHolder untuk menyimpan referensi tampilan
    class CustomViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textName: TextView = view.findViewById(R.id.txt_song_name)
        val relativeLayout: RelativeLayout = view.findViewById(R.id.relative_layout)
    }

    // Metode yang dipanggil saat ViewHolder dibuat
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
        return CustomViewHolder(view)
    }

    // Metode yang dipanggil untuk menetapkan data pada tampilan
    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
        holder.textName.text = list[position]
        holder.relativeLayout.setOnClickListener {
            listener.itemClick(list[position], position)
        }
    }

    // Metode yang mengembalikan jumlah item dalam daftar
    override fun getItemCount(): Int {
        return list.size
    }
}]

4. ItemClickListener.kt:

[// Antarmuka untuk menangani klik item dalam daftar
interface ItemClickListener {
    fun itemClick(song: String, pos: Int)
}]

5. MainActivity.kt:

[// Aktivitas utama
class MainActivity : AppCompatActivity() {

    private lateinit var items: Array<String>
    private lateinit var customAdapter: CustomAdapter
    private lateinit var recyclerView: RecyclerView
    private lateinit var mySongs: ArrayList<File>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Meminta izin runtime
        runtimePermission()
    }

    // Metode untuk meminta izin runtime
    private fun runtimePermission() {
        Dexter.withContext(this)
            .withPermissions(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.RECORD_AUDIO
            )
            .withListener(object : MultiplePermissionsListener {
                override fun onPermissionsChecked(report: MultiplePermissionsReport) {
                    // Izin diberikan, tampilkan lagu
                    displaySongs()
                }

                override fun onPermissionRationaleShouldBeShown(
                    permissions: List<PermissionRequest>,
                    token: PermissionToken
                ) {
                    token.continuePermissionRequest()
                }
            }).check()
    }

    // Metode untuk menemukan lagu-lagu di penyimpanan eksternal
    private fun findSong(file: File): ArrayList<File> {
        val arrayList = ArrayList<File>()
        val files = file.listFiles()
        if (files != null) {
            for (singleFile in files) {
                if (singleFile.isDirectory && !singleFile.isHidden) {
                    arrayList.addAll(findSong(singleFile))
                } else {
                    if (singleFile.name.endsWith(".wav") || singleFile.name.endsWith(".mp3")) {
                        arrayList.add(singleFile)
                    }
                }
            }
        }
        return arrayList
    }

    // Metode untuk menampilkan lagu-lagu dalam RecyclerView
    private fun displaySongs() {
        mySongs = findSong(Environment.getExternalStorageDirectory())
        items = Array(mySongs.size) { index -> mySongs[index].name.replace(".mp3", "").replace(".wav", "") }
        recyclerView = findViewById(R.id.recyclerview)
        recyclerView.layoutManager = LinearLayoutManager(this)
        customAdapter = CustomAdapter(this, items, itemClickListener)
        recyclerView.adapter = customAdapter
    }

    // Listener untuk menangani klik item dalam daftar
    private val itemClickListener = object : ItemClickListener {
        override fun itemClick(song: String, pos: Int) {
            val intent = Intent(this@MainActivity, PlayerActivity::class.java)
            intent.putExtra("songs", mySongs)
            intent.putExtra("songname", song)
            intent.putExtra("pos", pos)
            startActivity(intent)
        }
    }
}]

Catatan:

  • Silakan buat file list_item.xml di folder res/layout dengan struktur tampilan yang sesuai.
  • Pastikan file activity_main.xml, activity_player.xml, dan file layout lainnya sesuai dengan kebutuhan aplikasi Anda.
  • Jika Anda ingin menambahkan atau mengubah fitur tertentu, pastikan untuk memahami logika di setiap kelas dan metode.

Android, Kotlin, Music Player, MusicApp

Posting Komentar

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.