{"id":35451,"date":"2025-11-29T22:40:45","date_gmt":"2025-11-29T19:40:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35451"},"modified":"2025-11-29T22:40:45","modified_gmt":"2025-11-29T19:40:45","slug":"android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/","title":{"rendered":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz mobil uygulamalar\u0131nda medya oynatma yetenekleri, kullan\u0131c\u0131 deneyiminin temel ta\u015flar\u0131ndan biridir. M\u00fczik uygulamalar\u0131, podcast oynat\u0131c\u0131lar, sesli kitaplar veya video i\u00e7erik platformlar\u0131 fark etmeksizin, kullan\u0131c\u0131n\u0131n medya \u00fczerinde tam kontrol sahibi olmas\u0131 beklenir. Bu kontrol\u00fcn en \u00f6nemli g\u00f6rsel ve etkile\u015fimli bile\u015fenlerinden biri ise \u015f\u00fcphesiz &#8220;SeekBar&#8221;d\u0131r. Android platformunda medya oynatma i\u015flevselli\u011fi genellikle <code>MediaPlayer<\/code> s\u0131n\u0131f\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131rken, oynatma ilerlemesini g\u00f6rselle\u015ftirmek ve kullan\u0131c\u0131n\u0131n zaman \u00e7izelgesinde gezinmesine olanak tan\u0131mak i\u00e7in <code>SeekBar<\/code> kullan\u0131l\u0131r. Bu makale, Android&#8217;de bir medya oynat\u0131c\u0131y\u0131 <code>SeekBar<\/code> ile entegre etmenin temellerinden ileri d\u00fczey konular\u0131na kadar kapsaml\u0131 bir rehber sunmaktad\u0131r.<\/p>\n<h3>Android&#8217;de Medya Oynatma Temelleri<\/h3>\n<p>Android&#8217;de medya oynatma, genellikle <code>android.media.MediaPlayer<\/code> s\u0131n\u0131f\u0131 etraf\u0131nda d\u00f6ner. Bu s\u0131n\u0131f, ses ve video dosyalar\u0131n\u0131 \u00e7almak i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir API sa\u011flar. Yerel depolamadaki dosyalar\u0131, uygulama kaynaklar\u0131n\u0131 veya internet \u00fczerinden akan medyay\u0131 oynatabilir. Ancak, <code>MediaPlayer<\/code>&#8216;\u0131n do\u011fru \u015fekilde kullan\u0131lmas\u0131, durum ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc anlamay\u0131 gerektirir.<\/p>\n<h4>MediaPlayer S\u0131n\u0131f\u0131 ve Ya\u015fam D\u00f6ng\u00fcs\u00fc<\/h4>\n<p><code>MediaPlayer<\/code> nesnesi, belirli bir durum ya\u015fam d\u00f6ng\u00fcs\u00fcne sahiptir. Bu ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc anlamak, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek ve uygulaman\u0131z\u0131n medya oynatma s\u0131ras\u0131nda kararl\u0131 kalmas\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Temel durumlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Idle (Bo\u015fta):<\/strong> Yeni olu\u015fturulan bir <code>MediaPlayer<\/code> nesnesi veya <code>reset()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131ndan sonraki ba\u015flang\u0131\u00e7 durumu.<\/li>\n<li><strong>Initialized (Ba\u015flat\u0131ld\u0131):<\/strong> <code>setDataSource()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131ndan sonraki durum. Bu noktada medya kayna\u011f\u0131 belirtilmi\u015ftir ancak hen\u00fcz y\u00fcklenmemi\u015ftir.<\/li>\n<li><strong>Preparing (Haz\u0131rlan\u0131yor):<\/strong> <code>prepare()<\/code> veya <code>prepareAsync()<\/code> metodlar\u0131n\u0131n \u00e7a\u011fr\u0131lmas\u0131ndan sonraki durum. Medya kayna\u011f\u0131 y\u00fckleniyor ve oynatmaya haz\u0131r hale getiriliyor.<\/li>\n<li><strong>Prepared (Haz\u0131r):<\/strong> Medya kayna\u011f\u0131 ba\u015far\u0131yla haz\u0131rland\u0131\u011f\u0131nda bu duruma ge\u00e7ilir. Oynatmaya ba\u015flanabilir.<\/li>\n<li><strong>Started (Ba\u015flad\u0131):<\/strong> <code>start()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131yla medya oynat\u0131lmaya ba\u015flar.<\/li>\n<li><strong>Paused (Duraklat\u0131ld\u0131):<\/strong> <code>pause()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131yla oynatma duraklat\u0131l\u0131r. <code>start()<\/code> ile kald\u0131\u011f\u0131 yerden devam edebilir.<\/li>\n<li><strong>Stopped (Durduruldu):<\/strong> <code>stop()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131yla oynatma tamamen durur. Bu durumda <code>start()<\/code> ile devam edilemez, tekrar <code>prepare()<\/code> veya <code>prepareAsync()<\/code> \u00e7a\u011fr\u0131lmas\u0131 gerekir.<\/li>\n<li><strong>PlaybackCompleted (Oynatma Tamamland\u0131):<\/strong> Medya dosyas\u0131n\u0131n sonuna ula\u015f\u0131ld\u0131\u011f\u0131nda bu duruma ge\u00e7ilir.<\/li>\n<li><strong>End (Son):<\/strong> <code>release()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131yla <code>MediaPlayer<\/code> nesnesi serbest b\u0131rak\u0131l\u0131r ve kullan\u0131lamaz hale gelir.<\/li>\n<li><strong>Error (Hata):<\/strong> Herhangi bir hata durumunda bu duruma ge\u00e7ilir.<\/li>\n<\/ul>\n<p>Bu durumlar aras\u0131nda ge\u00e7i\u015f yapmak i\u00e7in kullan\u0131lan temel metodlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>create(Context context, int resId)<\/code>: Kaynak ID&#8217;sinden bir <code>MediaPlayer<\/code> nesnesi olu\u015fturur ve haz\u0131rl\u0131k yapar.<\/li>\n<li><code>setDataSource(String path)<\/code>: Medya dosyas\u0131n\u0131n yolunu belirtir.<\/li>\n<li><code>prepare()<\/code> \/ <code>prepareAsync()<\/code>: Medya kayna\u011f\u0131n\u0131 oynatmaya haz\u0131r hale getirir. <code>prepare()<\/code> senkron, <code>prepareAsync()<\/code> asenkron \u00e7al\u0131\u015f\u0131r. A\u011f kaynaklar\u0131 i\u00e7in <code>prepareAsync()<\/code> tercih edilmelidir.<\/li>\n<li><code>start()<\/code>: Medya oynatmaya ba\u015flar veya duraklat\u0131lm\u0131\u015fsa devam eder.<\/li>\n<li><code>pause()<\/code>: Medya oynatmay\u0131 duraklat\u0131r.<\/li>\n<li><code>stop()<\/code>: Medya oynatmay\u0131 tamamen durdurur.<\/li>\n<li><code>release()<\/code>: <code>MediaPlayer<\/code> taraf\u0131ndan tutulan kaynaklar\u0131 serbest b\u0131rak\u0131r. Uygulama kapat\u0131ld\u0131\u011f\u0131nda veya medya oynat\u0131c\u0131ya ihtiya\u00e7 kalmad\u0131\u011f\u0131nda \u00e7a\u011fr\u0131lmas\u0131 zorunludur.<\/li>\n<li><code>seekTo(int msec)<\/code>: Medya oynatmay\u0131 belirtilen milisaniye konumuna ta\u015f\u0131r.<\/li>\n<li><code>getCurrentPosition()<\/code>: Oynat\u0131lan medyan\u0131n anl\u0131k konumunu milisaniye cinsinden d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>getDuration()<\/code>: Oynat\u0131lan medyan\u0131n toplam s\u00fcresini milisaniye cinsinden d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ul>\n<h4>Gerekli \u0130zinler<\/h4>\n<p>Medya oynatma i\u015flemi i\u00e7in uygulaman\u0131z\u0131n <code>AndroidManifest.xml<\/code> dosyas\u0131na baz\u0131 izinleri eklemesi gerekebilir:<\/p>\n<ul>\n<li><code><uses-permission android:name=\"android.permission.INTERNET\"\/><\/code>: \u0130nternet \u00fczerinden medya ak\u0131\u015f\u0131 yap\u0131l\u0131yorsa gereklidir.<\/li>\n<li><code><uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"\/><\/code>: Cihaz\u0131n harici depolamas\u0131ndan dosya okunuyorsa (Android 10 \u00f6ncesi i\u00e7in) gereklidir. Modern Android s\u00fcr\u00fcmlerinde scoped storage nedeniyle bu izne \u00e7o\u011fu zaman do\u011frudan ihtiya\u00e7 duyulmaz, bunun yerine MediaStore API veya Storage Access Framework kullan\u0131l\u0131r.<\/li>\n<li><code><uses-permission android:name=\"android.permission.WAKE_LOCK\"\/><\/code>: Medya oynat\u0131l\u0131rken cihaz\u0131n uyku moduna ge\u00e7mesini engellemek i\u00e7in gereklidir. Bu, ekran kapal\u0131yken bile sesin \u00e7almaya devam etmesini sa\u011flar.<\/li>\n<\/ul>\n<h3>SeekBar Kullan\u0131m\u0131 ve Entegrasyonu<\/h3>\n<p><code>SeekBar<\/code>, kullan\u0131c\u0131n\u0131n belirli bir aral\u0131ktaki de\u011feri se\u00e7mesine olanak tan\u0131yan bir kullan\u0131c\u0131 aray\u00fcz\u00fc bile\u015fenidir. Medya oynat\u0131c\u0131larda, oynatma ilerlemesini g\u00f6rselle\u015ftirmek ve kullan\u0131c\u0131n\u0131n \u015fark\u0131 i\u00e7inde ileri\/geri sarmas\u0131na izin vermek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>SeekBar Nedir ve Nas\u0131l Tan\u0131mlan\u0131r?<\/h4>\n<p><code>SeekBar<\/code>, <code>ProgressBar<\/code>&#8216;dan t\u00fcretilmi\u015ftir ve bir &#8220;thumb&#8221; (ba\u015fparmak) ile kullan\u0131c\u0131n\u0131n s\u00fcr\u00fckleyerek de\u011ferini de\u011fi\u015ftirebilece\u011fi bir \u00e7ubuk i\u00e7erir. XML layout dosyan\u0131zda a\u015fa\u011f\u0131daki gibi tan\u0131mlan\u0131r:<\/p>\n<pre><code>\n<SeekBar\n    android:id=\"@+id\/seekBarProgress\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"16dp\"\n    android:max=\"100\" \/>\n<\/code><\/pre>\n<p>\u00d6nemli nitelikler:<\/p>\n<ul>\n<li><code>android:max<\/code>: SeekBar&#8217;\u0131n ula\u015fabilece\u011fi maksimum de\u011feri belirler. Medya oynat\u0131c\u0131 ba\u011flam\u0131nda, bu genellikle \u015fark\u0131n\u0131n toplam s\u00fcresine (milisaniye cinsinden) ayarlan\u0131r.<\/li>\n<li><code>android:progress<\/code>: SeekBar&#8217;\u0131n ba\u015flang\u0131\u00e7taki ilerleme de\u011ferini belirler.<\/li>\n<\/ul>\n<h4>OnSeekBarChangeListener Aray\u00fcz\u00fc<\/h4>\n<p>Kullan\u0131c\u0131n\u0131n <code>SeekBar<\/code> ile etkile\u015fimlerini dinlemek i\u00e7in <code>OnSeekBarChangeListener<\/code> aray\u00fcz\u00fcn\u00fc implement etmeniz gerekir. Bu aray\u00fcz \u00fc\u00e7 metot i\u00e7erir:<\/p>\n<ul>\n<li><code>onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)<\/code>: SeekBar&#8217;\u0131n ilerlemesi de\u011fi\u015fti\u011finde \u00e7a\u011fr\u0131l\u0131r. <code>fromUser<\/code> parametresi, de\u011fi\u015fimin kullan\u0131c\u0131 etkile\u015fiminden mi (<code>true<\/code>) yoksa programatik olarak m\u0131 (<code>false<\/code>) kaynakland\u0131\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>onStartTrackingTouch(SeekBar seekBar)<\/code>: Kullan\u0131c\u0131 SeekBar&#8217;\u0131n thumb&#8217;\u0131n\u0131 s\u00fcr\u00fcklemeye ba\u015flad\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r.<\/li>\n<li><code>onStopTrackingTouch(SeekBar seekBar)<\/code>: Kullan\u0131c\u0131 SeekBar&#8217;\u0131n thumb&#8217;\u0131n\u0131 s\u00fcr\u00fcklemeyi b\u0131rakt\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Bu metot i\u00e7inde genellikle <code>MediaPlayer<\/code>&#8216;\u0131n <code>seekTo()<\/code> metodu \u00e7a\u011fr\u0131larak oynatma konumu g\u00fcncellenir.<\/li>\n<\/ul>\n<h4>MediaPlayer ile SeekBar&#8217;\u0131 Senkronize Etme<\/h4>\n<p><code>MediaPlayer<\/code> ve <code>SeekBar<\/code>&#8216;\u0131 senkronize etmek i\u00e7in iki temel i\u015flem gereklidir:<\/p>\n<ol>\n<li><strong>SeekBar&#8217;\u0131n maksimum de\u011ferini ayarlama:<\/strong> Medya oynatma ba\u015flad\u0131\u011f\u0131nda veya haz\u0131rland\u0131\u011f\u0131nda, <code>SeekBar<\/code>&#8216;\u0131n <code>max<\/code> de\u011ferini <code>MediaPlayer.getDuration()<\/code> ile al\u0131nan toplam medya s\u00fcresine ayarlay\u0131n.<\/li>\n<li><strong>SeekBar&#8217;\u0131n ilerlemesini d\u00fczenli olarak g\u00fcncelleme:<\/strong> Medya oynat\u0131l\u0131rken, <code>MediaPlayer.getCurrentPosition()<\/code> metodunu kullanarak anl\u0131k oynatma konumunu al\u0131n ve bu de\u011feri <code>SeekBar.setProgress()<\/code> ile <code>SeekBar<\/code>&#8216;a uygulay\u0131n. Bu i\u015flem genellikle bir <code>Handler<\/code> ve <code>Runnable<\/code> kullan\u0131larak belirli aral\u0131klarla (\u00f6rne\u011fin her saniye) tekrarlan\u0131r.<\/li>\n<li><strong>Kullan\u0131c\u0131 etkile\u015fimine yan\u0131t verme:<\/strong> <code>OnSeekBarChangeListener<\/code>&#8216;\u0131n <code>onStopTrackingTouch()<\/code> metodunda, kullan\u0131c\u0131n\u0131n se\u00e7ti\u011fi yeni ilerleme de\u011ferini (<code>SeekBar.getProgress()<\/code>) <code>MediaPlayer.seekTo()<\/code> metoduna ileterek medya oynatma konumunu de\u011fi\u015ftirin.<\/li>\n<\/ol>\n<h3>Ad\u0131m Ad\u0131m Uygulama Geli\u015ftirme<\/h3>\n<p>\u015eimdi, basit bir medya oynat\u0131c\u0131y\u0131 <code>SeekBar<\/code> ile nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h4>Proje Kurulumu ve \u0130zinler<\/h4>\n<p>Yeni bir Android Studio projesi olu\u015fturun (Empty Activity \u015fablonu yeterlidir). Ard\u0131ndan, <code>AndroidManifest.xml<\/code> dosyan\u0131za gerekli izinleri ekleyin:<\/p>\n<pre><code>\n<manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    package=\"com.example.mediaplayerseekbar\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" \/>\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" \/>\n\n    <application\n        ...>\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" \/>\n                <category android:name=\"android.intent.category.LAUNCHER\" \/>\n            <\/intent-filter>\n        <\/activity>\n    <\/application>\n<\/manifest>\n<\/code><\/pre>\n<h4>Kullan\u0131c\u0131 Aray\u00fcz\u00fc Tasar\u0131m\u0131 (activity_main.xml)<\/h4>\n<p><code>res\/layout\/activity_main.xml<\/code> dosyan\u0131z\u0131 a\u015fa\u011f\u0131daki gibi d\u00fczenleyin. Bu layout, bir \u015fark\u0131 ad\u0131, oynatma\/duraklatma butonu, durdurma butonu, ve bir <code>SeekBar<\/code> i\u00e7erecektir.<\/p>\n<pre><code>\n<LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:gravity=\"center\"\n    android:padding=\"16dp\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id\/tvSongTitle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\u015eark\u0131 Ad\u0131 Buraya Gelecek\"\n        android:textSize=\"24sp\"\n        android:textStyle=\"bold\"\n        android:layout_marginBottom=\"24dp\"\/>\n\n    <TextView\n        android:id=\"@+id\/tvCurrentTime\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"00:00\"\n        android:textSize=\"18sp\" \/>\n\n    <SeekBar\n        android:id=\"@+id\/seekBarProgress\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\" \/>\n\n    <TextView\n        android:id=\"@+id\/tvTotalTime\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"00:00\"\n        android:textSize=\"18sp\"\n        android:layout_marginBottom=\"24dp\"\/>\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id\/btnPlay\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Oynat\"\n            android:layout_marginEnd=\"8dp\"\/>\n\n        <Button\n            android:id=\"@+id\/btnPause\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Duraklat\"\n            android:layout_marginEnd=\"8dp\"\/>\n\n        <Button\n            android:id=\"@+id\/btnStop\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Durdur\"\/>\n\n    <\/LinearLayout>\n\n<\/LinearLayout>\n<\/code><\/pre>\n<h4>Java\/Kotlin Kodu (MainActivity.java)<\/h4>\n<p><code>MainActivity.java<\/code> dosyan\u0131z\u0131 a\u015fa\u011f\u0131daki gibi doldurun. Bu kod, <code>MediaPlayer<\/code>&#8216;\u0131 ba\u015flatacak, buton t\u0131klamalar\u0131n\u0131 y\u00f6netecek, <code>SeekBar<\/code>&#8216;\u0131 g\u00fcncelleyecek ve kullan\u0131c\u0131 etkile\u015fimlerine yan\u0131t verecektir.<\/p>\n<pre><code>\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.media.MediaPlayer;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private MediaPlayer mediaPlayer;\n    private SeekBar seekBarProgress;\n    private Button btnPlay, btnPause, btnStop;\n    private TextView tvSongTitle, tvCurrentTime, tvTotalTime;\n    private Handler handler = new Handler();\n\n    private String audioUrl = \"https:\/\/www.soundhelix.com\/examples\/mp3\/SoundHelix-Song-1.mp3\"; \/\/ \u00d6rnek MP3 URL'si\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        \/\/ UI Bile\u015fenlerini Tan\u0131mlama\n        tvSongTitle = findViewById(R.id.tvSongTitle);\n        tvCurrentTime = findViewById(R.id.tvCurrentTime);\n        tvTotalTime = findViewById(R.id.tvTotalTime);\n        seekBarProgress = findViewById(R.id.seekBarProgress);\n        btnPlay = findViewById(R.id.btnPlay);\n        btnPause = findViewById(R.id.btnPause);\n        btnStop = findViewById(R.id.btnStop);\n\n        \/\/ MediaPlayer'\u0131 Ba\u015flatma ve Haz\u0131rlama\n        mediaPlayer = new MediaPlayer();\n        try {\n            mediaPlayer.setDataSource(audioUrl);\n            mediaPlayer.prepareAsync(); \/\/ Asenkron haz\u0131rl\u0131k\n            mediaPlayer.setOnPreparedListener(mp -> {\n                \/\/ Medya haz\u0131r oldu\u011funda\n                Toast.makeText(MainActivity.this, \"Medya Haz\u0131r\", Toast.LENGTH_SHORT).show();\n                seekBarProgress.setMax(mediaPlayer.getDuration());\n                tvTotalTime.setText(formatTime(mediaPlayer.getDuration()));\n                tvSongTitle.setText(\"SoundHelix-Song-1.mp3\"); \/\/ \u00d6rnek ba\u015fl\u0131k\n                updateSeekBar(); \/\/ SeekBar g\u00fcncellemesini ba\u015flat\n            });\n            mediaPlayer.setOnCompletionListener(mp -> {\n                \/\/ Medya bitti\u011finde\n                Toast.makeText(MainActivity.this, \"Oynatma Tamamland\u0131\", Toast.LENGTH_SHORT).show();\n                btnPlay.setText(\"Oynat\");\n                seekBarProgress.setProgress(0);\n                tvCurrentTime.setText(\"00:00\");\n                \/\/ MediaPlayer'\u0131 durdur ve resetle veya serbest b\u0131rak\n                if (mediaPlayer != null) {\n                    mediaPlayer.stop();\n                    mediaPlayer.reset();\n                    try {\n                        mediaPlayer.setDataSource(audioUrl); \/\/ Tekrar \u00e7almak i\u00e7in kayna\u011f\u0131 tekrar ayarla\n                        mediaPlayer.prepareAsync();\n                    } catch (IOException e) {\n                        e.printStackTrace();\n                    }\n                }\n            });\n            mediaPlayer.setOnErrorListener((mp, what, extra) -> {\n                Toast.makeText(MainActivity.this, \"Hata olu\u015ftu: \" + what, Toast.LENGTH_LONG).show();\n                return false; \/\/ Hatay\u0131 i\u015fledik\n            });\n\n        } catch (IOException e) {\n            e.printStackTrace();\n            Toast.makeText(this, \"Medya y\u00fcklenirken bir hata olu\u015ftu.\", Toast.LENGTH_SHORT).show();\n        }\n\n        \/\/ Buton Dinleyicileri\n        btnPlay.setOnClickListener(v -> {\n            if (!mediaPlayer.isPlaying()) {\n                mediaPlayer.start();\n                btnPlay.setText(\"Devam\"); \/\/ Veya \"Duraklat\" ikonu\n                updateSeekBar();\n            }\n        });\n\n        btnPause.setOnClickListener(v -> {\n            if (mediaPlayer.isPlaying()) {\n                mediaPlayer.pause();\n                btnPlay.setText(\"Oynat\");\n            }\n        });\n\n        btnStop.setOnClickListener(v -> {\n            if (mediaPlayer != null) {\n                mediaPlayer.stop();\n                mediaPlayer.reset(); \/\/ Durumunu s\u0131f\u0131rla\n                try {\n                    mediaPlayer.setDataSource(audioUrl); \/\/ Kayna\u011f\u0131 tekrar ayarla\n                    mediaPlayer.prepareAsync(); \/\/ Tekrar haz\u0131rla\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n                btnPlay.setText(\"Oynat\");\n                seekBarProgress.setProgress(0);\n                tvCurrentTime.setText(\"00:00\");\n            }\n        });\n\n        \/\/ SeekBar Dinleyicisi\n        seekBarProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {\n            @Override\n            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                if (fromUser) {\n                    tvCurrentTime.setText(formatTime(progress));\n                }\n            }\n\n            @Override\n            public void onStartTrackingTouch(SeekBar seekBar) {\n                \/\/ Kullan\u0131c\u0131 s\u00fcr\u00fcklemeye ba\u015flad\u0131\n            }\n\n            @Override\n            public void onStopTrackingTouch(SeekBar seekBar) {\n                \/\/ Kullan\u0131c\u0131 s\u00fcr\u00fcklemeyi b\u0131rakt\u0131, MediaPlayer'\u0131 yeni konuma ta\u015f\u0131\n                if (mediaPlayer != null) {\n                    mediaPlayer.seekTo(seekBar.getProgress());\n                }\n            }\n        });\n    }\n\n    \/\/ SeekBar'\u0131 d\u00fczenli olarak g\u00fcncelleyen Runnable\n    private Runnable updateSeekBarTime = new Runnable() {\n        public void run() {\n            if (mediaPlayer != null && mediaPlayer.isPlaying()) {\n                int currentPosition = mediaPlayer.getCurrentPosition();\n                seekBarProgress.setProgress(currentPosition);\n                tvCurrentTime.setText(formatTime(currentPosition));\n                handler.postDelayed(this, 1000); \/\/ Her saniye g\u00fcncelle\n            } else if (mediaPlayer != null && !mediaPlayer.isPlaying() && mediaPlayer.getCurrentPosition() == mediaPlayer.getDuration()) {\n                \/\/ Oynatma bitti\u011finde handler'\u0131 durdur\n                handler.removeCallbacks(this);\n            }\n        }\n    };\n\n    private void updateSeekBar() {\n        handler.postDelayed(updateSeekBarTime, 1000);\n    }\n\n    \/\/ Milisaniyeyi MM:SS format\u0131na d\u00f6n\u00fc\u015ft\u00fcren yard\u0131mc\u0131 metod\n    private String formatTime(int milliseconds) {\n        return String.format(\"%02d:%02d\",\n                TimeUnit.MILLISECONDS.toMinutes(milliseconds),\n                TimeUnit.MILLISECONDS.toSeconds(milliseconds) -\n                        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (mediaPlayer != null) {\n            mediaPlayer.release(); \/\/ Kaynaklar\u0131 serbest b\u0131rak\n            mediaPlayer = null;\n        }\n        handler.removeCallbacks(updateSeekBarTime); \/\/ Handler'\u0131 durdur\n    }\n}\n<\/code><\/pre>\n<p>Bu kodda dikkat edilmesi gerekenler:<\/p>\n<ul>\n<li><code>mediaPlayer.prepareAsync()<\/code>: A\u011f \u00fczerinden medya ak\u0131\u015f\u0131 yap\u0131ld\u0131\u011f\u0131 i\u00e7in asenkron haz\u0131rl\u0131k kullan\u0131l\u0131r. Haz\u0131rl\u0131k tamamland\u0131\u011f\u0131nda <code>setOnPreparedListener<\/code> tetiklenir.<\/li>\n<li><code>setOnCompletionListener<\/code>: \u015eark\u0131 bitti\u011finde ne yap\u0131laca\u011f\u0131n\u0131 belirtir. Burada \u015fark\u0131y\u0131 durdurup resetliyor ve tekrar \u00e7almaya haz\u0131r hale getiriyoruz.<\/li>\n<li><code>handler.postDelayed(updateSeekBarTime, 1000)<\/code>: Bir <code>Handler<\/code> kullanarak <code>updateSeekBarTime<\/code> adl\u0131 <code>Runnable<\/code>&#8216;\u0131 her saniye \u00e7al\u0131\u015ft\u0131r\u0131r\u0131z. Bu <code>Runnable<\/code>, <code>SeekBar<\/code>&#8216;\u0131n ilerlemesini ve anl\u0131k zaman <code>TextView<\/code>&#8216;ini g\u00fcnceller.<\/li>\n<li><code>onStopTrackingTouch()<\/code>: Kullan\u0131c\u0131 <code>SeekBar<\/code>&#8216;\u0131 s\u00fcr\u00fcklemeyi b\u0131rakt\u0131\u011f\u0131nda, <code>mediaPlayer.seekTo()<\/code> metodu ile oynatma konumu g\u00fcncellenir.<\/li>\n<li><code>onDestroy()<\/code>: Aktivite yok edildi\u011finde <code>mediaPlayer.release()<\/code> \u00e7a\u011fr\u0131larak t\u00fcm kaynaklar serbest b\u0131rak\u0131l\u0131r. Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in hayati \u00f6neme sahiptir. Ayr\u0131ca, <code>Handler<\/code>&#8216;\u0131n da durdurulmas\u0131 gerekir.<\/li>\n<\/ul>\n<h3>Geli\u015fmi\u015f Konular ve \u0130yi Uygulamalar<\/h3>\n<p>Basit bir oynat\u0131c\u0131 kurmak yeterli olsa da, ger\u00e7ek d\u00fcnya uygulamalar\u0131 daha karma\u015f\u0131k senaryolar\u0131 ve daha iyi bir kullan\u0131c\u0131 deneyimini gerektirir.<\/p>\n<h4>Arka Planda Oynatma (Background Playback) ve Bildirimler<\/h4>\n<p>Kullan\u0131c\u0131 uygulaman\u0131zdan ayr\u0131ld\u0131\u011f\u0131nda bile medyan\u0131n \u00e7almaya devam etmesi isteniyorsa, <code>MediaPlayer<\/code>&#8216;\u0131 bir <code>Service<\/code> i\u00e7inde \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. Bu bir <code>Foreground Service<\/code> olmal\u0131 ve kullan\u0131c\u0131ya oynatma kontrolleri i\u00e7eren bir bildirim g\u00f6stermelidir. Bu, uygulaman\u0131z\u0131n Android sistem taraf\u0131ndan \u00f6ncelikli kabul edilmesini ve arka planda \u00e7al\u0131\u015f\u0131rken kapat\u0131lmamas\u0131n\u0131 sa\u011flar.<\/p>\n<ul>\n<li><strong><code>Service<\/code> Kullan\u0131m\u0131:<\/strong> <code>MediaPlayer<\/code> nesnesi <code>Service<\/code> s\u0131n\u0131f\u0131 i\u00e7inde ba\u015flat\u0131l\u0131r ve y\u00f6netilir.<\/li>\n<li><strong><code>Foreground Service<\/code>:<\/strong> Android 8.0 (API 26) ve \u00fczeri s\u00fcr\u00fcmlerde, arka planda \u00e7al\u0131\u015fan servislerin bildirim g\u00f6stermesi zorunludur. Bu, kullan\u0131c\u0131n\u0131n servis hakk\u0131nda bilgilendirilmesini ve onu y\u00f6netebilmesini sa\u011flar.<\/li>\n<li><strong><code>MediaSession<\/code> API:<\/strong> Kilit ekran\u0131 kontrolleri, bildirim kontrolleri, Bluetooth cihazlar\u0131ndan gelen kontroller ve Android Auto gibi platformlarla entegrasyon i\u00e7in <code>MediaSession<\/code> API&#8217;si kullan\u0131l\u0131r. Bu API, medya oynatma durumunu ve kontrollerini sistemle payla\u015f\u0131r.<\/li>\n<\/ul>\n<h4>Ses Odaklanmas\u0131 (Audio Focus) Y\u00f6netimi<\/h4>\n<p>Android cihazlarda ayn\u0131 anda birden fazla uygulama ses \u00e7alabilir. Bu \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek ve iyi bir kullan\u0131c\u0131 deneyimi sunmak i\u00e7in ses odaklanmas\u0131 (audio focus) y\u00f6netimi \u00f6nemlidir. Uygulaman\u0131z\u0131n ses \u00e7almaya ba\u015flamadan \u00f6nce <code>AudioManager<\/code> \u00fczerinden ses oda\u011f\u0131 istemesi ve di\u011fer uygulamalar\u0131n oda\u011f\u0131 kaybetti\u011finde veya geri ald\u0131\u011f\u0131nda buna g\u00f6re tepki vermesi gerekir. \u00d6rne\u011fin, navigasyon uygulamas\u0131 konu\u015fmaya ba\u015flad\u0131\u011f\u0131nda m\u00fczi\u011finizin sesini k\u0131sabilir veya duraklatabilirsiniz.<\/p>\n<ul>\n<li><code>AudioManager.requestAudioFocus()<\/code>: Ses oda\u011f\u0131 iste\u011fi yap\u0131l\u0131r.<\/li>\n<li><code>OnAudioFocusChangeListener<\/code>: Ses oda\u011f\u0131ndaki de\u011fi\u015fiklikleri dinler ve uygulaman\u0131z\u0131n buna g\u00f6re davranmas\u0131n\u0131 sa\u011flar (\u00f6rne\u011fin, m\u00fczi\u011fi duraklatma veya sesini k\u0131sma).<\/li>\n<\/ul>\n<h4>Kaynak Y\u00f6netimi ve Sa\u011flaml\u0131k<\/h4>\n<p><code>MediaPlayer<\/code> kaynak yo\u011fun bir nesnedir. Her zaman do\u011fru \u015fekilde serbest b\u0131rak\u0131ld\u0131\u011f\u0131ndan emin olun:<\/p>\n<ul>\n<li><code>release()<\/code>: Uygulaman\u0131z art\u0131k <code>MediaPlayer<\/code>&#8216;a ihtiya\u00e7 duymad\u0131\u011f\u0131nda (\u00f6rne\u011fin, aktivite yok edildi\u011finde veya servis durduruldu\u011funda) bu metodu \u00e7a\u011f\u0131r\u0131n.<\/li>\n<li>Hata Y\u00f6netimi: <code>setOnErrorListener()<\/code> kullanarak oynatma s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 yakalay\u0131n ve kullan\u0131c\u0131ya bilgi verin veya uygun bir \u015fekilde kurtarma i\u015flemi yap\u0131n.<\/li>\n<li>A\u011f Ba\u011flant\u0131s\u0131: Ak\u0131\u015fl\u0131 medya i\u00e7in a\u011f ba\u011flant\u0131s\u0131n\u0131n durumunu kontrol edin. Ba\u011flant\u0131 kesildi\u011finde veya yava\u015flad\u0131\u011f\u0131nda uygun geri bildirim sa\u011flay\u0131n.<\/li>\n<\/ul>\n<h4>Kullan\u0131c\u0131 Deneyimi \u0130yile\u015ftirmeleri<\/h4>\n<ul>\n<li><strong>Y\u00fckleniyor G\u00f6stergesi:<\/strong> <code>prepareAsync()<\/code> kullan\u0131l\u0131rken medya y\u00fcklenirken kullan\u0131c\u0131ya bir <code>ProgressBar<\/code> g\u00f6stererek uygulaman\u0131n donmad\u0131\u011f\u0131 hissini verin.<\/li>\n<li><strong>H\u0131zl\u0131 \u0130leri\/Geri Sarma:<\/strong> <code>ImageButton<\/code>&#8216;lar kullanarak belirli bir miktar (\u00f6rne\u011fin, 10 saniye) ileri veya geri sarma i\u015flevselli\u011fi ekleyin.<\/li>\n<li><strong>\u015eark\u0131 Listesi Y\u00f6netimi:<\/strong> Birden fazla \u015fark\u0131 \u00e7almak i\u00e7in bir \u015fark\u0131 listesi (<code>ArrayList<\/code> veya <code>Queue<\/code>) tutun ve <code>OnCompletionListener<\/code> i\u00e7inde bir sonraki \u015fark\u0131y\u0131 y\u00fckleyin.<\/li>\n<li><strong>Zaman Formatlama:<\/strong> <code>formatTime()<\/code> gibi yard\u0131mc\u0131 metodlarla zaman\u0131 kullan\u0131c\u0131 dostu &#8220;MM:SS&#8221; format\u0131nda g\u00f6sterin.<\/li>\n<\/ul>\n<h4>Alternatif Medya K\u00fct\u00fcphaneleri: ExoPlayer<\/h4>\n<p><code>MediaPlayer<\/code> \u00e7o\u011fu temel kullan\u0131m durumu i\u00e7in yeterli olsa da, Google taraf\u0131ndan geli\u015ftirilen <a href=\"https:\/\/exoplayer.dev\/\">ExoPlayer<\/a>, daha geli\u015fmi\u015f ve \u00f6zelle\u015ftirilebilir bir medya oynatma \u00e7\u00f6z\u00fcm\u00fc sunar. \u00d6zellikle karma\u015f\u0131k ak\u0131\u015f senaryolar\u0131 (DASH, HLS), DRM korumal\u0131 i\u00e7erikler, \u00f6zel medya kaynaklar\u0131 ve render ediciler i\u00e7in <code>ExoPlayer<\/code> daha esnektir ve daha iyi performans g\u00f6sterebilir. Modern Android medya uygulamalar\u0131 genellikle <code>ExoPlayer<\/code>&#8216;\u0131 tercih eder.<\/p>\n<h3>Sorun Giderme (Troubleshooting)<\/h3>\n<p><code>MediaPlayer<\/code> ve <code>SeekBar<\/code> entegrasyonunda s\u0131k kar\u015f\u0131la\u015f\u0131lan baz\u0131 sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<ul>\n<li><strong><code>MediaPlayer<\/code> Durum Hatalar\u0131:<\/strong> <code>MediaPlayer<\/code>&#8216;\u0131n belirli bir metodun \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 anda yanl\u0131\u015f durumda olmas\u0131 (IllegalStateException) s\u0131k g\u00f6r\u00fclen bir hatad\u0131r. \u00d6rne\u011fin, <code>prepare()<\/code> \u00e7a\u011fr\u0131lmadan <code>start()<\/code> \u00e7a\u011fr\u0131lmas\u0131. Medya oynat\u0131c\u0131n\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc dikkatlice takip edin.<\/li>\n<li><strong><code>SeekBar<\/code> Senkronizasyon Sorunlar\u0131:<\/strong> <code>SeekBar<\/code>&#8216;\u0131n ilerlemesinin medya oynatma ile e\u015fle\u015fmemesi, genellikle <code>Handler<\/code>&#8216;\u0131n do\u011fru \u015fekilde ba\u015flat\u0131lmamas\u0131 veya durdurulmamas\u0131ndan kaynaklan\u0131r. <code>updateSeekBar()<\/code> metodunun yaln\u0131zca oynatma ba\u015flad\u0131\u011f\u0131nda \u00e7a\u011fr\u0131ld\u0131\u011f\u0131ndan ve <code>onDestroy()<\/code> i\u00e7inde durduruldu\u011fundan emin olun.<\/li>\n<li><strong>Medya Y\u00fckleme Hatalar\u0131:<\/strong> Medya kayna\u011f\u0131n\u0131n (URL veya yerel dosya) ge\u00e7ersiz olmas\u0131, a\u011f ba\u011flant\u0131s\u0131 sorunlar\u0131 veya medya format\u0131 uyumsuzluklar\u0131 <code>IOException<\/code> veya <code>OnErrorListener<\/code> taraf\u0131ndan yakalanan hatalara yol a\u00e7abilir. Kaynak URL&#8217;sini veya dosya yolunu kontrol edin.<\/li>\n<li><strong>Bellek S\u0131z\u0131nt\u0131lar\u0131:<\/strong> <code>MediaPlayer.release()<\/code> metodunun \u00e7a\u011fr\u0131lmamas\u0131, aktivite veya servis yok edildi\u011finde bellek s\u0131z\u0131nt\u0131lar\u0131na neden olur. Her zaman kaynaklar\u0131 serbest b\u0131rakmay\u0131 unutmay\u0131n.<\/li>\n<li><strong>\u0130zin Eksiklikleri:<\/strong> Gerekli Android izinlerinin (<code>INTERNET<\/code>, <code>WAKE_LOCK<\/code> vb.) <code>AndroidManifest.xml<\/code>&#8216;e eklenmemesi, medya y\u00fckleme veya oynatma sorunlar\u0131na yol a\u00e7abilir.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Android&#8217;de <code>MediaPlayer<\/code> ve <code>SeekBar<\/code> kullanarak fonksiyonel ve kullan\u0131c\u0131 dostu bir medya oynat\u0131c\u0131 olu\u015fturmak, platformun temel bile\u015fenlerini anlamay\u0131 ve do\u011fru ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimini gerektirir. Bu makalede ele al\u0131nan ad\u0131mlar ve iyi uygulamalar, temel bir medya oynat\u0131c\u0131dan ba\u015flayarak daha sa\u011flam ve zengin \u00f6zelliklere sahip bir uygulamaya do\u011fru ilerlemeniz i\u00e7in bir yol haritas\u0131 sunmaktad\u0131r. Arka planda oynatma, ses oda\u011f\u0131 y\u00f6netimi ve geli\u015fmi\u015f hata i\u015fleme gibi konulara dikkat etmek, uygulaman\u0131z\u0131n genel kalitesini ve kullan\u0131c\u0131 memnuniyetini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Daha karma\u015f\u0131k medya ihtiya\u00e7lar\u0131n\u0131z i\u00e7in <code>ExoPlayer<\/code> gibi alternatif k\u00fct\u00fcphaneleri ke\u015ffetmek de gelecekteki geli\u015ftirme se\u00e7eneklerinizi geni\u015fletebilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber\nG\u00fcn\u00fcm\u00fcz mobil uygulamalar\u0131nda medya oynatma yetenekleri, kullan\u0131c\u0131 deney","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-35451","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber G\u00fcn\u00fcm\u00fcz mobil uygulamalar\u0131nda medya oynatma yetenekleri, kullan\u0131c\u0131 deney\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-29T19:40:45+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-29T19:40:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\"},\"wordCount\":2109,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\",\"name\":\"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-29T19:40:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber","og_description":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber G\u00fcn\u00fcm\u00fcz mobil uygulamalar\u0131nda medya oynatma yetenekleri, kullan\u0131c\u0131 deney","og_url":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-29T19:40:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-29T19:40:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/"},"wordCount":2109,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/","name":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-29T19:40:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-medya-oynatici-ve-seekbar-entegrasyonu-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android Medya Oynat\u0131c\u0131 ve SeekBar Entegrasyonu: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35451"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35451\/revisions"}],"predecessor-version":[{"id":35452,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35451\/revisions\/35452"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}