PMO2 Pertemuan 2 SD CARD(Music player-Cursor,Content Resolver)

Pengenalan Dasar Fungsi SD Card dan Penggunaan Melalui Aplikasi

 

External Storage / SD Card pada perangkat Mobile

External storage adalah storage yang berfungsi untuk meyimpan data dari luar main storage dalam waktu yang sangat atau relative lama, biasanya external storage digunakan untuk menampung data dalam jumlah yang sangat besar.

Setiap perangkat yang kompatibel dengan system operasi android harus mendukung media penyimpanan eksternal yang dapat digunakan untuk menyimpan file. Media penyimpanan ini bisa pula menjadi media penyimpanan yang removable.

Selain itu, tidak ada system keamanan yang diberlakukan pada file yang disimpan dalam external storage. Semua aplikasi dapat membaca, menulis, dan menghapus file yang ditempatkan di external storage.

Sebelum membaca atau menulis file dari dan kedalam external storage, terlebih dahulu program harus memeriksa ketersediaan media, karena terdapat kemungkinan  bahwa user tidak memasukkan SD card kedalam slotnya.

 

Sifat-Sifat

  • Memori eksternal disebut juga Secondary-Memory memiliki ukuranvolume yang relatif besar, bahkan bisa sangat besar sampai ordo Tera Byte (TB), digunakan sebagai “storage” atau gudang penyimpanan data dan Program.
  • Memiliki kecepatan akses data yang relatif lebih lamban jika dibandingkan dengan Main Memory (RAM)
  • Program dan Data yang disimpan biasanya dalam keadaan tidak “aktif” , misal dalam bentuk terkompresi (.ZIP) , atau programprogram yang belum di-instal.
  • Oleh CPU digunakan sebagai “Virtual Memory”

Jenis-jenis External Storage / SD Card

  • Berdasarkan Jenis Akses Data

Berdasarkan jenis aksesnya memori eksternal dikelompokkan menjadi dua jenis yaitu :

  1. DASD (Direct Access Storage Device) di mana ia mempunyai akses langsung terhadap data. Contoh : Magnetik (floppy disk, hard disk); Removeable hard disk (Zip disk, Flash disk); Optical Disk.
  2. SASD (Sequential Access Storage Device) : Akses data secara tidak langsung (berurutan), seperti pita magnetik.

 

  • Berdasarkan Karakteristik Bahan

Berdasarkan karakteristik bahan pembuatannya, memori eksternal digolongkan menjadi beberapa kelompok sebagai berikut:

  1. Punched Card atau kartu berlubang

Merupakan kartu kecil berisi lubang-lubang yang menggambarkan berbagai instruksi atau data. Kartu ini dibaca melalui puch card reader yang sudah tidak digunakan lagi sejak tahun 1979.

  1. Magnetic Disk

Magnetic Disk merupakan disk yang terbuat dari bahan yang bersifat magnetik, Contoh : floppy dan harddisk.

  1. Optical Disk

Optical disk terbuat dari bahan-bahan optik, seperti dari resin (polycarbonate) dan dilapisi permukaan yang sangat reflektif seperti alumunium. Contoh : CD dan DVD

  1. Magnetic Tape

Sedangkan magnetik tape, terbuat dari bahan yang bersifat magnetik tetapi berbentuk pita, seperti halnya pita kaset tape recorder.

 

  • Multiple Disk
  1. harddisk
    disebut juga dengan cakram keras berbentuk piringan hitam terbuat dari alumunium dan dilapisi bahan magnetic. Hard disk sudah menjadi komponen utama dari PC untuk sistem operasi. Komponen bagian hard disk terdiri dari sebuah jarum untuk membaca data di cakram.
  2. flashdisk
    Adalah piranti penyimpan dari floppy drive jenis lain yang mempunyai kapasitas memori 128 MB, dengan menggunakan kabel interface jenis USB (Universal Serial Bus), sangat praktis dan ringan dengan ukuran berkisar 96 x 32 mm dan pada bagian belakang bentuknya agak menjurus keluar, digunakan untuk tempat penyimpanan baterai jenis AAA dan terdapat port USB yang disediakan penutupnya yang berbentuk sama dengan body utamanya dan juga mempunyai layar LCD yang berukuran 29,5 x 11 mm.
  3. floppydisk
    Karakteristik disket adalah head menyentuh permukaan disk saat membaca ataupun menulis.
  4. CD ROM
    (Compact Disk – Read Only Memory). Merupakan generasi CD yang diaplikasikan sebagai media penyimpan data komputer. Dikenalkan pertama kali oleh Phillips dan Sony tahun 1984 dalam publikasinya, yang dikenal dengan Yellow Book. Perbedaan utama dengan CD adalah CD ROM player lebih kasar dan memiliki perangkat pengoreksi kesalahan, untuk menjamin keakuratan tranfer data ke komputer.
  5. CD-R
    (Compact Disk Recordables) Secara fisik CD-R merupakan CD polikarbonat kosong berdiameter 120 mm sama seperti CD ROM. Perbedaannya adanya alur – alur untuk mengarahkan laser saat penulisan. Awalnya CD-R dilapisi emas sebagai media refleksinya. Permukaan reflektif pada lapisan emas tidak memiliki depresi atau lekukan – lekukan fisik seperti halnya pada lapisan aluminium sehingga harus dibuat tiruan lekukan antara pit dan land-nya.

 

  • RAID

RAID (Redundancy Array of Independent Disk) merupakan organisasi disk memori yang mampu menangani beberapa disk dengan sistem akses paralel dan redudansi ditambahkan untuk meningkatkan reliabilitas. Karena kerja paralel inilah dihasilkan resultan kecepatan disk yang lebih cepat. Teknologi database sangatlah penting dalam model disk ini karena pengontrol disk harus mendistribusikan data pada sejumlah disk dan juga membacaan kembali.

 Tiga karakteristik umum pada tingkatan RAID yaitu :

  1. RAID adalah merupakan sekumpulan disk drive yang dianggap oleh sistem oprasi sebagai sebuah drive logic tunggal
  2. Data didistribusikan ke drive fisik array.
  3. Kapasitas redudant disk digunakan untuk menyimpan informasi paritas yang menjamin recovability data terjadi kegagalan disk.

 

RAID-0

Tidak Memiliki Redundansi – BUKAN RAID YG SEBENARNYA

  • Data di strip dan disebar ke seluruh disk
  • Round Robin striping
  • Kecepatan Akses Tinggi
  • Multiple data requests terjadi tdk dalam satu disk
  • Pencarian data dilakukan secara paralel
  • Sebuah data secara fisik tersebar terdistribusi pada keseluruhan disk

 

RAID-1

  • Mirrored Disks , artinya selurugh disk memiliki bayangan duplikatnya masing-masing
  • Data di – strip keseluruh disk
  • Masing-masing data memiliki “duplikat” pada disk yg lain.
  • Proses Baca bisa pada salah satu disk, tapi proses Tulis dilakukan pada kedua disk yaitu asli dan duplikatnya.
  • Recovery bersifat sederhana
  • Swap faulty disk & re-mirror
  • No down time
  • Sangat Mahal , karena biaya keseluruhan disk menjadi 2x lipat

 

RAID-2-

  • Gerakan semua Disk Disinkronisasikan satu sama lain
  • stripes yang digunakan berukuran sangat kecil
  • Often single byte/word
  • Error correction dihitung antar disk
  • Multiple parity disks menggunakan Hamming Code
  • Redundancy disknya masih terlalu banyak
  • Sangat Mahal
  • Jarang digunakan

 

RAID-3-

Serupa dengan RAID-2

  • Hanya ada sebuah redundant-disk tunggal, untuk semua disk
  • Hanya menggunakan sistem Parity-Bit untuk recovery
  • Data pada disk yang mengalami kegagalan di-recovery dari parity Bit yang ada rudundant di
  • yang ada pada redundant disl
  • Kecepatan Transfer Data sangat Tinggi

 

RAID-4

  • Setiap disk dioperasikan secara independent , tdk disinkronisasi
  • Cocok untuk kebutuhan akses I/O yang tinggi
  • Ukuran Stripes besar-besar
  • Bit by bit parity dihitung untuk setiap disk
  • Parity bit disimpan di redundant disk

RAID-5

  • Seperti RAID-4
  • Parity bit disebar pada seluruh disk, termasuk redundant disk
  • Alokasi Parity Bit disusun secara Round robin
  • Mencegah bottleneck at redundant disk
  • Umum digunakan untuk network servers

 

RAID-6

  • Double Parity P() dan Q()
  • Disebar merata keseluruh disk
  • Kebutuhan N disks adalah N+2
  • Cocok untuk data volume tinggi

 

  • RAM

Random access memory, RAM adalah sebuah tipe penyimpanan komputer yang isinya dapat diakses dalam waktu yang tetap tidak memperdulikan letak data tersebut dalam memori.
Pengertian lain : RAM (Random-Acces Memory) merupakan salah satu jenis memory internal yang menentukan kemampuan sebuah komputer. Memory internal (Internal Memory) bisa disebut juga memory utama (main memory) dan memory primer (primary memory). Komponen ini berfungsi sebagai pengingat.

 

  • FLASH DISK

USB flash drive adalah alat penyimpanan data memori flash tipe NAND yang memiliki alat penghubung USB yang terintegrasi. Flash drive ini biasanya berukuran kecil, ringan, serta bisa dibaca dan ditulisi dengan mudah. Per November 2006, kapasitas yang tersedia untuk USB flash drive ada dari 128 megabyte sampai 64 gigabyte.

  • USB flash drive memiliki banyak kelebihan dibandingkan alat penyimpanan data lainnya, khususnya disket atau cakram padat. Alat ini lebih cepat, kecil, dengan kapasitas lebih besar, serta lebih dapat diandalkan

SD Card pada Android Emulator Device(AVD).

AVD (Android Virtual Devices) adalah konfigurasi dari emulator sehingga kita dapat menjalankan perangkat Android sesuai model yang dipilih, misal Android 1.5 atau 2.2 dan seterusnya. Untuk dapat menjalankan emulator, kawan-kawan harus terlebih dahulu memiliki Android SDK. Tapi tenang , kemarin kita telah menginstalnya dengan baik

Setiap AVD terdiri dari:

  1. Sebuah profil perangkat keras. Kawan-kawan dapat mengatur opsi untuk menentukan fitur hardware emulator. Misalnya, menentukan apakah menggunakan perangkat kamera, apakah menggunakan keyboard QWERTY fisik atau tidak, berapa banyak memori internal, dan lain-lain.
  2. Sebuah pemetaan versi Android. Kawan-kawan dapat menentukan versi dari platform Android akan berjalan pada emulator.
  3. Pilihan lainnya. kawan-kawan dapat menentukan skin yang ingin di gunakan pada emulator, yang memungkinkan untuk menentukan dimensi layar, tampilan, dan sebagainya. Selain itu kita juga dapat menentukan SD Card virtual untuk digunakan dengan di emulator.

Tata Cara penggunaan SdCard pada android (Android-Studio)

Ketika kita membuat sebuah aplikasi android khusus untuk membaca file/SdCard perlu ada beberapa langkah

yaitu :

  1. Khusus untuk android dengan versi sdk dibawah android Lolipop (5.0) hanya perlu menambahkan <uses-permission  />

 

 

2. Untuk android versi SDK diatas Lolipop (5.0) perlu ijin User secara langsung bai pertama kali diinstal atau ketika dijalankan

 

 

 

 

 

 

 

PROJECT SEDERHANA SDCARD(Musik Player Menggunakan Cursor)

Pada sesi kali ini kita akan membuat projek android dimana hasilnya akan menampilkan lagu yang ada di android dan memutarnya untuk hasil akhirnya kurang lebih seperti ini :

 

 

 

 

 

 

 

 

Oke pertama-tama kita buat projek baru pada android studio karna sudah kita bahas di rps sebelumnya untuk membuat projek baru maka langsung saja kita buat…kita hanya akan menggunakan 1 Activity 1 class adapter baik kita mulai

  1. Pada AndroidManifest.xml tambahkan permission EXTERNAL_STORAGE
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kelompok3.trian.pmo2_rps2">

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- TODO : tambah service -->
        <activity android:name=".player"></activity>
    </application>

</manifest>

2. Kemudian kita buat laoyutnya
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
   <FrameLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="200dp"
          android:background="#535353">

      </LinearLayout>
      <ImageView
          android:id="@+id/iv_cover"
          android:layout_width="100dp"
          android:layout_gravity="right|center"
          android:layout_height="100dp"
          android:layout_marginEnd="5dp"
          android:scaleType="fitXY"
          android:src="@drawable/background"/>
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="200dp"
          android:orientation="vertical">


         <include layout="@layout/toolbar" />

         <TextView
             android:id="@+id/txt_judul"
             android:layout_width="wrap_content"
             android:layout_marginEnd="100dp"
             android:layout_height="wrap_content"
             android:paddingLeft="28dp"
             android:text="hehe"
             android:maxLines="2"
             android:maxLength="52"
             android:textColor="#ffffff"
             android:layout_marginTop="10dp"
             android:textSize="17dp" />

         <TextView
             android:id="@+id/txt_artis"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="6dp"
             android:paddingLeft="28dp"
             android:text="Taylor Swift"
             android:textSize="13dp"
             android:textColor="#ffffff" />

         <TextView
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="6dp"
             android:paddingLeft="29dp"
             android:text="_"
             android:textColor="#ffffff"
             android:textSize="10dp" />

         <SeekBar
             android:id="@+id/seekbar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginLeft="20dp"
             android:layout_marginRight="20dp"
             android:layout_marginTop="20dp"
             android:progressBackgroundTint="#ffff"
             android:theme="@style/MySeekBarTheme"
             />

         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginBottom="15dp"
             android:layout_marginLeft="7dp"
             android:layout_marginRight="8dp"
             android:layout_marginTop="3dp"
             android:orientation="horizontal">

            <TextView
                android:id="@+id/txt_durasi_awal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:paddingLeft="26dp"
                android:text="00:00"
                android:textColor="#ffffff"
                android:textSize="10dp" />

            <TextView
                android:id="@+id/txt_durasi_max"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="end"
                android:paddingRight="26dp"
                android:text="00:00"
                android:textColor="#ffffff"
                android:textSize="10dp" />
         </LinearLayout>
      </LinearLayout>



   </FrameLayout>
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginBottom="17dp"
       android:layout_marginTop="17dp"
       android:orientation="horizontal">

      <ImageView
          android:layout_width="match_parent"
          android:layout_height="18dp"
          android:layout_gravity="center"
          android:layout_weight="1"
          android:paddingLeft="28dp"
          android:src="@drawable/ic_repeat" />

      <ImageView
          android:id="@+id/btn_prev"
          android:layout_width="match_parent"
          android:layout_height="20dp"
          android:layout_gravity="center"
          android:layout_weight="1"
          android:paddingLeft="22dp"
          android:src="@drawable/ic_back" />

      <ImageView
          android:layout_width="match_parent"
          android:layout_height="50dp"
          android:layout_gravity="center"
          android:layout_marginLeft="11dp"
          android:layout_marginRight="11dp"
          android:layout_weight="1"
          android:id="@+id/btn_play"
          android:background="@drawable/circle"
          android:padding="15dp"
          android:src="@drawable/ic_pause" />

      <ImageView
          android:id="@+id/btn_next"
          android:layout_width="match_parent"
          android:layout_height="20dp"
          android:layout_gravity="center"
          android:layout_weight="1"
          android:paddingRight="22dp"
          android:src="@drawable/ic_forward" />

      <ImageView
          android:layout_width="match_parent"
          android:layout_height="18dp"
          android:layout_gravity="center"
          android:layout_marginRight="28dp"
          android:layout_weight="1"
          android:src="@drawable/ic_shuffle" />


   </LinearLayout>
   <ListView
       android:id="@+id/daftarmusik"

       android:layout_width="match_parent"
       android:layout_height="wrap_content">

   </ListView>
</LinearLayout>

3.Pada MainActivity.java
tambahkan

package com.kelompok3.trian.pmo2_rps2;

import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.kelompok3.trian.pmo2_rps2.hoho.tulung;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener,ActivityCompat.OnRequestPermissionsResultCallback{

    private ArrayList<Song> listmusik;
    public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99;
    private ListView vielistmusik;
    //TODO : variabel
    int posisi = 0;
    ImageView next,prev,play,cover;
    TextView judul,artis,durasi_awal,durasi_akhir;
    SeekBar seek;
    MediaPlayer mp;
    Thread update;
    boolean status_play = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        next = findViewById(R.id.btn_next);
        prev = findViewById(R.id.btn_prev);
        play = findViewById(R.id.btn_play);
        judul = findViewById(R.id.txt_judul);
        artis = findViewById(R.id.txt_artis);
        cover = findViewById(R.id.iv_cover);
        seek = findViewById(R.id.seekbar);
        durasi_akhir = findViewById(R.id.txt_durasi_max);
        durasi_awal = findViewById(R.id.txt_durasi_awal);
        play.setOnClickListener(this);
        next.setOnClickListener(this);
        prev.setOnClickListener(this);
        judul.setText("");
        artis.setText("");
checkStoragePermission();



        vielistmusik = findViewById(R.id.daftarmusik);
        listmusik = new ArrayList<>();
        getListMusik();
        Collections.sort(listmusik, new Comparator<Song>() {
            @Override
            public int compare(Song a, Song b) {
                return a.getJudul().compareTo(b.getJudul());
            }
        });
        AdapterSong adapter = new AdapterSong(MainActivity.this,listmusik);
        vielistmusik.setAdapter(adapter);

    }
    public void getListMusik(){
        ContentResolver musicresolver = getContentResolver();
        Uri urimusik = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Uri uriart = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;

        Cursor cursormusik = musicresolver.query(urimusik,null,null,null,null,null);
        Cursor cursoralbum = musicresolver.query(uriart,null,null,null,null,null);

        if (cursormusik!=null&& cursormusik.moveToFirst()){
            int alamat_palsu = cursormusik.getColumnIndex(MediaStore.Audio.Media.DATA);
            int cover = cursoralbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
            int titlecolumn = cursormusik.getColumnIndex
                    (MediaStore.Audio.Media.TITLE);
            int idColumn = cursormusik.getColumnIndex
                    (android.provider.MediaStore.Audio.Media._ID);
            int artistColumn = cursormusik.getColumnIndex
                    (android.provider.MediaStore.Audio.Media.ARTIST);

            do {


                final long thisId = cursormusik.getLong(idColumn);
                final String data = cursormusik.getString(alamat_palsu);
                final String thistitle = cursormusik.getString(titlecolumn);
                final String thisArtist = cursormusik.getString(artistColumn);
                final String Art = cursormusik.getString(cover);
                listmusik.add(new Song(thisId,data, thistitle, thisArtist,Art));

                kliklistView();

            }
            while (cursormusik.moveToNext());

        }

    }



    private void kliklistView() {
        vielistmusik.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (mp != null){
                    mp.stop();
                    mp.release();
                }

                Uri jalur = Uri.parse(listmusik.get(position).getData());


                posisi = position;
                if (jalur == null ){

                }else {
                    judul.setText(listmusik.get(position).getJudul());
                    artis.setText(listmusik.get(position).getArtis());
                    mp = MediaPlayer.create(MainActivity.this, jalur);
                    posisi = position;
                    try {
                        mp.start();
                    } catch (NullPointerException e) {
                        new tulung(MainActivity.this).gawe_toast("Format tidak didukung" + e.getMessage(), true);
                    } catch (Exception e) {
                        new tulung(MainActivity.this).gawe_toast("Format tidak didukung" + e.getMessage(), true);
                    }
                }
                play.setImageResource(R.drawable.ic_pause);
                status_play = true;
                update = new Thread(){
                    @Override
                    public void run() {
                        int totalDuration = mp.getDuration();
                        int currentPosition = 0;
                        while(currentPosition < totalDuration){
                            try{
                                sleep(500);
                                currentPosition=mp.getCurrentPosition();
                                seek.setProgress(currentPosition);

                                durasi_awal.setText(""+milliSecondsToTimer((long) mp.getCurrentPosition()));
                                durasi_akhir.setText(""+milliSecondsToTimer((long)mp.getDuration()));
                            }
                            catch (InterruptedException e){
                                e.printStackTrace();
                            }
                        }
                    }
                };
                update.start();
                try {
                    seek.setMax(mp.getDuration());
                }catch (NullPointerException e){
                    new tulung(MainActivity.this).gawe_toast("tidak ada lagu",true);
                }

                seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {

                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        mp.seekTo(seekBar.getProgress());
                    }
                });


            }
        });
    }
    public  String milliSecondsToTimer(long milliseconds) {
        String finalTimerString = "";
        String secondsString = "";

        // TODO: Convert total duration into time
        int hours = (int) (milliseconds / (1000 * 60 * 60));
        int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60);
        int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000);
        // TODO:Add hours if there
        if (hours > 0) {
            finalTimerString = hours + ":";
        }

        // TODO:Prepending 0 to seconds if it is one digit
        if (seconds < 10) {
            secondsString = "0" + seconds;
        } else {
            secondsString = "" + seconds;
        }

        finalTimerString = finalTimerString + minutes + ":" + secondsString;

        // TODO:return timer string
        return finalTimerString;
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            //TODO : tombolplay dan pause
            case R.id.btn_play:
                try {
                    seek.setMax(mp.getDuration());
                }catch (NullPointerException e){
                    new tulung(MainActivity.this).gawe_toast("tidak ada lagu",true);
                }

                if (mp.isPlaying()){
                    try {
                        mp.pause();
                    }catch (NullPointerException e){
                        new tulung(MainActivity.this).gawe_toast("Format tidak didukung"+e.getMessage(),true);
                    }catch (Exception e){
                        new tulung(MainActivity.this).gawe_toast("Format tidak didukung"+e.getMessage(),true);
                    }

                    play.setImageResource(R.drawable.ic_play);
                    status_play = false;
                }else {

                    try {
                        mp.start();
                    }catch (NullPointerException e){
                        new tulung(MainActivity.this).gawe_toast("Format tidak didukung"+e.getMessage(),true);
                    }catch (Exception e){
                        new tulung(MainActivity.this).gawe_toast("Format tidak didukung"+e.getMessage(),true);
                    }

                    play.setImageResource(R.drawable.ic_pause);
                    status_play = true;
                }
                   // new tulung(this).gawe_toast("gg",true);


                break;
            case R.id.btn_next:
                mp.stop();
                mp.release();

                int pos=((posisi) +1)%listmusik.size();
                posisi = pos;
                Uri u = Uri.parse(listmusik.get( pos).getData());
                judul.setText(listmusik.get(pos).getJudul());
                artis.setText(listmusik.get(pos).getArtis());
                mp = MediaPlayer.create(getApplicationContext(),u);
                mp.start();

                break;
            case R.id.btn_prev:
                mp.stop();
                mp.release();

                int pos2 =((posisi-1)<0)?(listmusik.size()-1):(posisi-1);
                Uri u2 = Uri.parse(listmusik.get(pos2).getData());//%mysongs so that it do not go to invalid
                judul.setText(listmusik.get(pos2).getJudul());
                artis.setText(listmusik.get(pos2).getArtis());
                mp = MediaPlayer.create(getApplicationContext(),u2);
                mp.start();
                break;
        }
    }
    public boolean checkStoragePermission() {
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                android.Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(this,
                        new
                                String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
            } else {
                ActivityCompat.requestPermissions(this,
                        new
                                String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
            }
            return false;
        } else {
            return true;
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[]
                                                   grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: {
                if (grantResults.length > 0
                        && grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED) {
                    if (ContextCompat.checkSelfPermission(MainActivity.this,
                            android.Manifest.permission.READ_EXTERNAL_STORAGE)
                            == PackageManager.PERMISSION_GRANTED) {

                    }
                } else {
                   new tulung(MainActivity.this).gawe_toast("tdak dapat ijin",true);
                }
                return;
            }
        }
    }
}

4. kemudian pada class Adapter.java

package com.kelompok3.trian.pmo2_rps2;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class AdapterSong extends BaseAdapter {
    private ArrayList<Song> songs;
    private LayoutInflater songinf;
    public AdapterSong(Context c, ArrayList<Song> thesongs){
        songs = thesongs;
        songinf = LayoutInflater.from(c);
    }

    @Override
    public View getView(int position,View convertView, ViewGroup parent){
        LinearLayout layout = (LinearLayout)songinf.inflate(
                R.layout.item_lagu,parent,false);
        TextView songView = (TextView)layout.findViewById(R.id.song_title);
        TextView artistView = (TextView)layout.findViewById(R.id.song_artist);
        //get song using position
        Song currSong = songs.get(position);
        //get title and artist strings
        songView.setText(currSong.getJudul());
        artistView.setText("Artist : "+currSong.getArtis());
        //set position as tag
        layout.setTag(position);
        return layout;
    }

    @Override
    public int getCount() {
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }


}

File PowerPoint

Power Point

File Sourecode

PROJECT

 

Daftar Pustaka

http://muhamad-irvansah.blogspot.com/2014/11/pengertian-dan-jenis-jenis-memory_1.html

 

AVD

https://blogermencobasukses.wordpress.com/2013/03/21/membuat-avd-android-virtual-devices/

http://bisakomputer.com/membuat-dan-konfigurasi-emulator-android/

 

JENIS EKS STORAGE

http://muhamad-irvansah.blogspot.com/2014/11/pengertian-dan-jenis-jenis-memory_1.html

http://arsyliyah.blogspot.com/2014/04/jenis-jenis-memori-eksternal.html