Multimedia &
Akses
Hardware (Izin) 🎵
Mari buat aplikasimu bersuara! Belajar menggunakan MediaPlayer untuk memutar musik, dan memahami aturan ketat Android Runtime Permissions untuk mengakses hardware atau file di HP user.
1. MediaPlayer & Lokasi File
Untuk memutar file audio atau musik di Android, kita menggunakan class bawaan bernama
MediaPlayer. Ada 3 fungsi utama yang wajib kamu kuasai: start(),
pause(), dan stop().
Folder: res/raw
Jika kamu punya file MP3 (misal:
lagu tema) yang menyatu permanen dengan aplikasimu, simpan file tersebut di
folder res/raw.
File External (Storage)
Jika kamu ingin memutar lagu MP3
milik user dari galeri/penyimpanan HP mereka, kamu harus menggunakan Uri
dan wajib meminta izin terlebih dahulu!
2. Aturan Ketat: Android Permissions
Sejak Android 6.0 (Marshmallow), Google sangat memperketat privasi user. Aplikasi tidak bisa lagi diam-diam mengakses kamera, lokasi, atau file di HP. Kita harus membagi izin menjadi dua jenis:
1. Normal Permissions
Izin yang tidak mengancam
privasi user. Cukup daftarkan di AndroidManifest.xml, dan sistem
akan langsung mengizinkannya.
- Akses Internet (Internet)
- Getar HP (Vibrate)
- Status Jaringan (Network State)
2. Dangerous Permissions
Izin yang mengakses data sensitif. Selain didaftarkan di Manifest, kamu WAJIB memunculkan pop-up dialog kepada user saat aplikasi berjalan (Runtime Permission)!
- Membaca File (READ_EXTERNAL_STORAGE)
- Kamera (CAMERA) & Lokasi (ACCESS_FINE_LOCATION)
3. Simulator: Player + External Playlist
Uji coba aplikasi pemutar musik di bawah ini! Klik "Muat Lagu User", izinkan akses pop-up-nya, lalu pilih file `.mp3` sungguhan dari laptop/HP-mu. File yang kamu pilih akan ditambahkan ke Playlist layaknya aplikasi Android sungguhan!
Simulasi Permission
Uji coba skenario user menekan
Allow (Izinkan) lalu memilih file .mp3 dari media penyimpanan
lokal perangkatnya.
D/App: Media Player Ready.
Lagu Default (Lofi)
Aplikasi Internal
Daftar Putar
4. Bedah Kode: Intent File & Animasi!
Sesuai dengan Simulator di atas, ini adalah kode utuh yang siap dieksekusi di Android Studio!
Kita akan menggunakan Intent ACTION_GET_CONTENT untuk menelusuri isi penyimpanan lokal,
mengekstrak nama aslinya dengan Cursor, dan membiarkan user memilih banyak file
.mp3 sekaligus.
AndroidManifest.xml
WAJIB! Tambahkan izin
READ_EXTERNAL_STORAGE di luar tag <application> agar
aplikasi diizinkan membaca file lagu dari galeri/memori HP user.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mediaplayer">
<!-- 🚨 TAMBAHKAN BARIS INI UNTUK IZIN MEMBACA FILE DARI HP USER -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml
Layout interaktif lengkap dengan
ImageView bundar untuk piringan hitam, teks judul, serta deretan tombol
fungsi Playlist (Prev, Play/Pause, Next, Stop).
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="32dp">
<!-- Album Art (Piringan Hitam) -->
<ImageView
android:id="@+id/imgAlbum"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/cover_musik"
android:layout_marginBottom="24dp" />
<!-- Judul Lagu yang Sedang Diputar -->
<TextView
android:id="@+id/tvJudulLagu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Judul Lagu"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="32dp" />
<!-- Deretan Tombol Kontrol Musik -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:layout_marginBottom="32dp">
<Button
android:id="@+id/btnPrev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<< PREV"
android:layout_marginEnd="8dp" />
<Button
android:id="@+id/btnPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PLAY / PAUSE"
android:layout_marginEnd="8dp" />
<Button
android:id="@+id/btnNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NEXT >>" />
</LinearLayout>
<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="STOP MUSIK"
android:layout_marginBottom="32dp" />
<!-- Tombol Ekstra untuk Minta Izin & Buka File -->
<Button
android:id="@+id/btnRequestPerm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="MUAT LAGU USER (MINTA IZIN)"
android:backgroundTint="#f59e0b" />
</LinearLayout>
MainActivity.java (Masterpiece!)
Menangani penambahan lagu baru, ekstrak
nama asli file dari Cursor, dan rotasi animasi.
🚨
Ingat: Masukkan 3 file .mp3 ke folder res/raw sebelum run!
package com.example.mediaplayer;
import android.Manifest;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
// Deklarasi Komponen
private MediaPlayer player;
private TextView tvJudulLagu;
private ImageView imgAlbum;
private ObjectAnimator putaranAnimasi;
// Kode Rahasia untuk Intent
private static final int KODE_IZIN_STORAGE = 101;
private static final int KODE_PILIH_LAGU = 102;
// Simulasi Playlist (Menyimpan Nama dan Uri/Resource ID lagu)
private ArrayList<Integer> playlistRaw = new ArrayList<>();
private ArrayList<String> playlistJudul = new ArrayList<>();
private ArrayList<Uri> playlistExternal = new ArrayList<>();
private int indexSekarang = 0;
private boolean isMemutarExternal = false; // Penanda sumber lagu
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvJudulLagu = findViewById(R.id.tvJudulLagu);
imgAlbum = findViewById(R.id.imgAlbum);
Button btnPlay = findViewById(R.id.btnPlay);
Button btnPrev = findViewById(R.id.btnPrev);
Button btnNext = findViewById(R.id.btnNext);
Button btnStop = findViewById(R.id.btnStop);
Button btnReqPerm = findViewById(R.id.btnRequestPerm);
// Isi Playlist Bawaan (Default)
// Note: Kamu BISA menghapus semua file bawaan (raw) ini jika kamu murni
// ingin memutar lagu dari File Manager (Storage) secara langsung!
playlistRaw.add(R.raw.lagu_satu);
playlistJudul.add("Lagu Lofi Chill");
playlistRaw.add(R.raw.lagu_dua);
playlistJudul.add("Acoustic Breeze");
playlistRaw.add(R.raw.lagu_tiga);
playlistJudul.add("Cyberpunk City");
// --- 1. SETUP ANIMASI PIRINGAN HITAM ---
putaranAnimasi = ObjectAnimator.ofFloat(imgAlbum, "rotation", 0f, 360f);
putaranAnimasi.setDuration(4000); // 4 detik per putaran penuh
putaranAnimasi.setRepeatCount(ValueAnimator.INFINITE);
putaranAnimasi.setInterpolator(new LinearInterpolator());
// Panggil fungsi untuk menyiapkan lagu pertama
siapkanLaguBawaan(indexSekarang);
// --- 2. KONTROL PLAYER ---
btnPlay.setOnClickListener(v -> {
if (player != null) {
if (player.isPlaying()) {
player.pause();
putaranAnimasi.pause(); // Hentikan piringan
Toast.makeText(this, "Jeda.", Toast.LENGTH_SHORT).show();
} else {
player.start();
if(putaranAnimasi.isPaused()) { putaranAnimasi.resume(); }
else { putaranAnimasi.start(); }
Toast.makeText(this, "Memutar Lagu...", Toast.LENGTH_SHORT).show();
}
}
});
btnNext.setOnClickListener(v -> {
if (isMemutarExternal) {
// Logika next untuk playlist eksternal
indexSekarang = (indexSekarang + 1) % playlistExternal.size();
siapkanLaguExternal(playlistExternal.get(indexSekarang));
} else {
// Logika next untuk playlist bawaan
indexSekarang = (indexSekarang + 1) % playlistRaw.size();
siapkanLaguBawaan(indexSekarang);
}
player.start();
putaranAnimasi.start();
});
btnPrev.setOnClickListener(v -> {
if (isMemutarExternal) {
indexSekarang = (indexSekarang - 1 + playlistExternal.size()) % playlistExternal.size();
siapkanLaguExternal(playlistExternal.get(indexSekarang));
} else {
indexSekarang = (indexSekarang - 1 + playlistRaw.size()) % playlistRaw.size();
siapkanLaguBawaan(indexSekarang);
}
player.start();
putaranAnimasi.start();
});
btnStop.setOnClickListener(v -> {
if (player != null) {
player.stop();
putaranAnimasi.cancel(); // Matikan animasi
imgAlbum.setRotation(0f);
// Jika sudah di-stop, harus disiapkan ulang agar bisa di-play lagi
try { player.prepare(); } catch (Exception e) { e.printStackTrace(); }
}
});
// --- 3. MEMINTA IZIN (RUNTIME PERMISSION) ---
btnReqPerm.setOnClickListener(v -> {
// A. Cek izin akses media/memori
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// B. Jika BELUM DIIZINKAN, Munculkan pop-up permintaan izin!
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
KODE_IZIN_STORAGE);
} else {
// C. Jika SUDAH DIIZINKAN, buka File Manager!
bukaFileManager();
}
});
}
// --- FUNGSI HELPER: BUKA FILE MANAGER ---
private void bukaFileManager() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*"); // Hanya tampilkan file audio
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // Izinkan blok banyak file
// Tampilkan layar pemilih file bawaan Android
startActivityForResult(Intent.createChooser(intent, "Pilih Lagu MP3"), KODE_PILIH_LAGU);
}
// --- FUNGSI TANGKAP HASIL (DARI FILE MANAGER ATAU PERMISSION) ---
// 1. Tangkap jawaban dari Pop-Up Izin
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == KODE_IZIN_STORAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Izin diberikan! Bisa akses memori.", Toast.LENGTH_SHORT).show();
bukaFileManager();
} else {
Toast.makeText(this, "Izin ditolak! Gagal membuka file.", Toast.LENGTH_SHORT).show();
}
}
}
// 2. Tangkap file lagu yang dipilih oleh User
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == KODE_PILIH_LAGU && resultCode == RESULT_OK && data != null) {
// Hentikan lagu yang sedang main
if(player != null) player.stop();
int jumlahFileDitambah = 0;
// Jika user memilih BANYAK file sekaligus
if (data.getClipData() != null) {
int jumlahFile = data.getClipData().getItemCount();
for (int i = 0; i < jumlahFile; i++) {
Uri audioUri = data.getClipData().getItemAt(i).getUri();
// TAMBAHKAN LAGU BARU KE DALAM PLAYLIST!
playlistExternal.add(audioUri);
jumlahFileDitambah++;
}
}
// Jika user hanya memilih 1 file
else if (data.getData() != null) {
Uri audioUri = data.getData();
playlistExternal.add(audioUri);
jumlahFileDitambah++;
}
Toast.makeText(this, jumlahFileDitambah + " Lagu masuk Playlist!", Toast.LENGTH_SHORT).show();
// Putar lagu yang baru saja dimasukkan (ada di ujung array terakhir)
if(!playlistExternal.isEmpty()) {
isMemutarExternal = true;
indexSekarang = playlistExternal.size() - jumlahFileDitambah; // Play the first newly added song
siapkanLaguExternal(playlistExternal.get(indexSekarang));
player.start();
putaranAnimasi.start();
// Update UI tombol menjadi Pause (Opsional)
}
}
}
// --- FUNGSI HELPER SETUP LAGU ---
private void siapkanLaguBawaan(int index) {
if(player != null) player.release();
player = MediaPlayer.create(this, playlistRaw.get(index));
tvJudulLagu.setText(playlistJudul.get(index));
// Agar otomatis play lagu selanjutnya saat satu lagu selesai
player.setOnCompletionListener(mp -> findViewById(R.id.btnNext).performClick());
}
private void siapkanLaguExternal(Uri uriLagu) {
try {
if(player != null) player.release();
player = new MediaPlayer();
player.setDataSource(this, uriLagu);
player.prepare(); // Wajib prepare kalau pakai setDataSource
// Tampilkan nama file asli menggunakan fungsi helper!
String judulAsli = getFileName(uriLagu);
// Menghilangkan ekstensi .mp3 agar tampilan lebih rapi
if (judulAsli != null && judulAsli.toLowerCase().endsWith(".mp3")) {
judulAsli = judulAsli.substring(0, judulAsli.length() - 4);
}
tvJudulLagu.setText(judulAsli);
player.setOnCompletionListener(mp -> findViewById(R.id.btnNext).performClick());
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "Gagal memuat file ini!", Toast.LENGTH_SHORT).show();
}
}
// Fungsi sakti untuk mendapatkan nama asli file dari URI
public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
try (android.database.Cursor cursor = getContentResolver().query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME));
}
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf('/');
if (cut != -1) result = result.substring(cut + 1);
}
return result;
}
// 🚨 PENTING: Matikan pemutar musik saat aplikasi ditutup (Memory Leak)!
@Override
protected void onDestroy() {
super.onDestroy();
if (player != null) {
player.release();
player = null;
}
if (putaranAnimasi != null) putaranAnimasi.cancel();
}
}
5. Tugas Super: Music Player Pro!
Di "Bedah Kode" kita sudah membuat playlist menggunakan `Array` biasa. Sekarang, tantangannya adalah menggabungkan ilmu RecyclerView (Modul 7) dengan MediaPlayer (Modul 11)!
Misi Project Utama (RecyclerView Edition):
- Buat antarmuka (UI) yang memiliki area Player (Gambar Cover, Judul, & Tombol Play/Stop)
di bagian atas, dan sebuah
RecyclerViewdi bagian bawah. - Buat tombol "Tambah Lagu" yang memanggil
Intent.ACTION_GET_CONTENT(Pastikan kamu mendaftarkan izin Storage di Manifest!). - Gunakan fungsi
getFileName()yang sudah dipelajari di atas untuk mengambil nama asli lagunya, dan masukkan ke dalamArrayListuntuk RecyclerView! - Syarat Mutlak: Jika user mengeklik salah satu baris judul lagu di dalam
RecyclerView, lagu tersebut harus memutar (play) otomatis di Player atas!
Solusi Lengkap (Integrasi RecyclerView & MediaPlayer):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- BAGIAN ATAS: MUSIC PLAYER -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:background="#EEEEEE">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@android:drawable/ic_media_play"
android:background="#CCCCCC" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp">
<TextView
android:id="@+id/tvJudul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Belum Ada Lagu"
android:textStyle="bold"
android:textSize="18sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="8dp">
<Button
android:id="@+id/btnPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PLAY / PAUSE" />
<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="STOP" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<!-- BAGIAN TENGAH: TOMBOL TAMBAH -->
<Button
android:id="@+id/btnTambah"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="+ TAMBAH LAGU"
android:layout_margin="16dp" />
<!-- BAGIAN BAWAH: DAFTAR LAGU -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvLagu"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
<!-- item_lagu.xml (Desain Baris RecyclerView) -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:gravity="center_vertical"
android:background="?attr/selectableItemBackground">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@android:drawable/ic_media_play"
android:layout_marginEnd="16dp" />
<TextView
android:id="@+id/tvNamaLagu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="16sp" />
</LinearLayout>
// 1. LaguModel.java
package com.example.musicpro;
import android.net.Uri;
public class LaguModel {
private String judul;
private Uri uriLagu;
public LaguModel(String judul, Uri uriLagu) {
this.judul = judul;
this.uriLagu = uriLagu;
}
public String getJudul() { return judul; }
public Uri getUriLagu() { return uriLagu; }
}
// 2. LaguAdapter.java
package com.example.musicpro;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class LaguAdapter extends RecyclerView.Adapter<LaguAdapter.ViewHolder> {
private ArrayList<LaguModel> listLagu;
private OnItemClickListener listener;
public interface OnItemClickListener {
void onItemClick(LaguModel lagu);
}
public LaguAdapter(ArrayList<LaguModel> list, OnItemClickListener listener) {
this.listLagu = list;
this.listener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_lagu, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
LaguModel lagu = listLagu.get(position);
holder.tvJudul.setText(lagu.getJudul());
// Kirim sinyal klik beserta lagunya ke MainActivity!
holder.itemView.setOnClickListener(v -> listener.onItemClick(lagu));
}
@Override
public int getItemCount() { return listLagu.size(); }
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvJudul;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvJudul = itemView.findViewById(R.id.tvNamaLagu);
}
}
}
package com.example.musicpro;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements LaguAdapter.OnItemClickListener {
private MediaPlayer player;
private TextView tvJudul;
private LaguAdapter adapter;
private ArrayList<LaguModel> listLagu = new ArrayList<>();
private static final int KODE_IZIN = 101;
private static final int KODE_PILIH_LAGU = 102;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvJudul = findViewById(R.id.tvJudul);
Button btnPlay = findViewById(R.id.btnPlay);
Button btnStop = findViewById(R.id.btnStop);
Button btnTambah = findViewById(R.id.btnTambah);
RecyclerView rvLagu = findViewById(R.id.rvLagu);
// 1. Setup RecyclerView
rvLagu.setLayoutManager(new LinearLayoutManager(this));
adapter = new LaguAdapter(listLagu, this);
rvLagu.setAdapter(adapter);
// 2. Tombol Minta Izin & Buka File Manager
btnTambah.setOnClickListener(v -> {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, KODE_IZIN);
} else {
bukaFileManager();
}
});
// 3. Kontrol Player Atas
btnPlay.setOnClickListener(v -> {
if (player != null) {
if (player.isPlaying()) player.pause();
else player.start();
}
});
btnStop.setOnClickListener(v -> {
if (player != null) {
player.stop();
try { player.prepare(); } catch (Exception e) {}
}
});
}
private void bukaFileManager() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "Pilih Lagu"), KODE_PILIH_LAGU);
}
// Menangkap Hasil Jepretan File Manager
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == KODE_PILIH_LAGU && resultCode == RESULT_OK && data != null) {
if (data.getClipData() != null) {
// Multi file
for (int i = 0; i < data.getClipData().getItemCount(); i++) {
Uri uri = data.getClipData().getItemAt(i).getUri();
tambahKePlaylist(uri);
}
} else if (data.getData() != null) {
// Single file
tambahKePlaylist(data.getData());
}
// WAJIB LAPOR ADAPTER!
adapter.notifyDataSetChanged();
}
}
private void tambahKePlaylist(Uri uri) {
String judul = getFileName(uri);
if (judul.toLowerCase().endsWith(".mp3")) {
judul = judul.substring(0, judul.length() - 4);
}
listLagu.add(new LaguModel(judul, uri));
}
// EVENT SAAT ITEM RECYCLERVIEW DI-KLIK
@Override
public void onItemClick(LaguModel lagu) {
putarLagu(lagu);
}
private void putarLagu(LaguModel lagu) {
try {
if (player != null) player.release();
player = new MediaPlayer();
player.setDataSource(this, lagu.getUriLagu());
player.prepare();
player.start();
tvJudul.setText(lagu.getJudul());
} catch (Exception e) {
Toast.makeText(this, "Gagal memutar lagu ini", Toast.LENGTH_SHORT).show();
}
}
public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
try (android.database.Cursor cursor = getContentResolver().query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME));
}
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf('/');
if (cut != -1) result = result.substring(cut + 1);
}
return result;
}
}