#15 – Android MediaPlayer sınıfı ve Müzik Çalma Uygulaması


Android’in multimedya framework’ünde bulunan MediaPlayer sınıfı bir medya dosyasını kolayca oynatmamıza imkan tanıyor. Bu medya dosyası ses, fotoğraf, video olabildiği gibi internetteki bir dosya da olabilir.

Oynatabileceğimiz medya dosyamız şu konumlarda olabilir;

  • res/raw dizininde
  • dosya sisteminde herhangi bir konumda
  • internette bir adreste

MediaPlayer sınıfı iki satırda medya oynatmanızı sağlayacak şekilde minimal bir yapıdadır. Örneğin res/raw dizinine attığınız bir ses dosyasını aşağıdaki şekilde oynatabilirsiniz.

//Burada sound_file_1 dosyamızın adıdır. Dosya uzantısı buraya yazılmaz
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start();

Bu sınıfın desteklediği, oynatabileceği dosyaların formatına aşağıdaki linkten ulaşabilirsiniz.
http://developer.android.com/guide/appendix/media-formats.html#core

[wpdm_file id=6]

MediaPlayer için yapacağımız uygulama şimdilik bir müzik çalıcı olacak, daha sonraki yazılarda bu uygulamamıza yeni kabiliyetler katacağız. Şuanki amacımız res/raw dizini altında bulunan ses medyası dosyalarını oynatmak.

Uygulamadaki kod blokları ne yapıyor onlara bakalım.
raw/res dizini altındaki dosyaların listesinin alımı:

     Field[] fields = R.raw.class.getFields();
        String[] mediaList = new String[fields.length];
        for (int count = 0; count < fields.length; count++)
            mediaList[count] = fields[count].getName();

raw/res dizini altındaki listeyi yukarıdaki şekilde aldığımızdan buraya istediğiniz kadar dosya atabilirsiniz, uygulamanızı değiştirmenize gerek olmayacak. yalnız burada dosya atarken boşuk ” “ kullanmayınız.

Listenin ListView‘e iliştirilmesi:

     listView = (ListView) findViewById(R.id.listView2);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                MainActivity.this, android.R.layout.simple_list_item_1,
                mediaList);
        listView.setAdapter(adapter);

Listedeki bir öğeye tıklandığında, tıklananın çalınmasını sağlamak, arkaplan rengini değiştirmek, hangisinin çalındığını ve kaç sn. uzunluğunda olduğunu göstermek:

     listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position,
                    long id) {
                if (oncekiView != null)
                    ((TextView) oncekiView).setBackgroundDrawable(orjArkaFon);
                orjArkaFon = ((TextView) v).getBackground();

                String uri = "android.resource://" + getPackageName() + "/raw/"
                        + ((TextView) v).getText();

                if (mp != null && mp.isPlaying())
                    mp.stop();

                mp = MediaPlayer.create(getApplicationContext(), Uri.parse(uri));
                mp.start();

                ((TextView) v).setBackgroundColor(Color.GREEN);
                oncekiView = v;

                textBilgi.setText(((TextView) v).getText() + " ["
                        + mp.getDuration() / 1000 + " sn.]");
            }
        });

Uygulama dosyalarındaki kodlar derli toplu halde aşağıdaki gibidir.

activity_main.xml dosyamız;

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textBilgi1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#fc0"
        android:padding="5dp"
        android:text="Çalan Parça"
        android:textColor="#fff"
        android:textSize="20sp" />

    <ListView
        android:id="@+id/listView2"
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        android:layout_margin="10dp"
        android:background="@drawable/borderui" />

</LinearLayout>

MainActivity.java dosyamız;

package com.androidevreni.medyaoynatici;

import java.lang.reflect.Field;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    MediaPlayer mp;
    View oncekiView;
    ListView listView;
    Drawable orjArkaFon;
    TextView textBilgi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Field[] fields = R.raw.class.getFields();
        String[] mediaList = new String[fields.length];
        for (int count = 0; count < fields.length; count++)
            mediaList[count] = fields[count].getName();

        listView = (ListView) findViewById(R.id.listView2);
        textBilgi = (TextView) findViewById(R.id.textBilgi1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                MainActivity.this, android.R.layout.simple_list_item_1,
                mediaList);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position,
                    long id) {
                if (oncekiView != null)
                    ((TextView) oncekiView).setBackgroundDrawable(orjArkaFon);
                orjArkaFon = ((TextView) v).getBackground();

                String uri = "android.resource://" + getPackageName() + "/raw/"
                        + ((TextView) v).getText();

                if (mp != null && mp.isPlaying())
                    mp.stop();

                mp = MediaPlayer.create(getApplicationContext(), Uri.parse(uri));
                mp.start();

                ((TextView) v).setBackgroundColor(Color.GREEN);
                oncekiView = v;

                textBilgi.setText(((TextView) v).getText() + " ["
                        + mp.getDuration() / 1000 + " sn.]");
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

res/drawable altındaki borderui.xml dosyamız : müzik listemize (ListView) arkaplan rengi ve kenarlık vermemizi sağlayacak.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#f2f2f2"/>
    <stroke android:width="2dip" android:color="#cccccc"/>

</shape>

Yeni bir uygulamada görüşmek üzere.

Şunlar da ilginizi çekebilir

5 yorum

  • Murat
    26 Aralık 2013 at 21:50

    MainActivity.java dosyasi icerisinde 48. satirda bulunan

    ((TextView) oncekiView).setBackgroundDrawable(orjArkaFon);
    kodlamasinin icerisindeki :.setBackgroundDrawable ifadesi hata uyerisi veriyor ve üzeri cozgili gözüküyor. Android in tüm sürümleri yüklü, yani sürüm problemi olmamasi gerekiyordu. Calistiramadim, yardimci olabilirseniz sevinirim…

  • anıl
    14 Nisan 2014 at 22:24

    Merhaba bu uygulamaya MediaController ekleyebilirmisiniz ve de çalınan müzik bittiği zaman sıradaki şarkıya geçmesini sağlayabilirmiyiz teşekkür ederim.

  • Çetin
    3 Ağustos 2014 at 23:15

    Allah sizden razı olsun, sizin sayenizde uygulamama müzik ekledim :) Bu site süper ya .)

    • MUSTAFA DEMİR
      4 Ağustos 2014 at 12:40

      merhaba, teşekkür ederiz düşüncelerinizi yorum yazarak bize ilettiniz Allah sizden de razı olsun. AndroidEvreni’ni, yazılarımızı paylaşarak bize destek olabilirsiniz. :)

      İyi Çalışmalar.

LEAVE A COMMENT