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 34defaultConfig {applicationId "uz.context.musicplayerapp_java"minSdk 21targetSdk 31versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}// Menentukan versi kompatibilitas JavacompileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}// Menentukan namespace aplikasinamespace 'uz.context.musicplayerapp_java'}dependencies {// Implementasi dependensi untuk kompatibilitas versi AndroidXimplementation '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 pengujiantestImplementation '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 izinimplementation 'com.karumi:dexter:6.2.2'// Implementasi dependensi untuk Kotlinimplementation "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 audioimplementation "com.gauravk.audiovisualizer:audiovisualizer:0.9.2"}]
3. CustomAdapter.kt:
[// Kelas adapter untuk RecyclerViewclass CustomAdapter(private val context: Context, private val list: Array<String>, private val listener: ItemClickListener) :RecyclerView.Adapter<CustomAdapter.CustomViewHolder>() {// ViewHolder untuk menyimpan referensi tampilanclass 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 dibuatoverride 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 tampilanoverride 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 daftaroverride fun getItemCount(): Int {return list.size}}]
4. ItemClickListener.kt:
[// Antarmuka untuk menangani klik item dalam daftarinterface ItemClickListener {fun itemClick(song: String, pos: Int)}]
5. MainActivity.kt:
[// Aktivitas utamaclass MainActivity : AppCompatActivity() {private lateinit var items: Array<String>private lateinit var customAdapter: CustomAdapterprivate lateinit var recyclerView: RecyclerViewprivate lateinit var mySongs: ArrayList<File>override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// Meminta izin runtimeruntimePermission()}// Metode untuk meminta izin runtimeprivate 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 lagudisplaySongs()}override fun onPermissionRationaleShouldBeShown(permissions: List<PermissionRequest>,token: PermissionToken) {token.continuePermissionRequest()}}).check()}// Metode untuk menemukan lagu-lagu di penyimpanan eksternalprivate 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 RecyclerViewprivate 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 daftarprivate 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.