با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. اندروید راه های بسیاری را برای کنترل پخش فایل های صوتی / تصویری فراهم می کند. یکی از این راهها، از طریق یک کلاس به نام MediaPlayer است.اندروید کلاس MediaPlayer را برای دسترسی به سرویس های مدیا پلیر ساخته شده مانند پخش صوت، ویدئو و… ارائه می دهد. برای استفاده از قابلیت های کلاس MediaPlayer، باید از متد ()create در برنامه استفاده کنیم. برای آشنایی با چگونگی استفاده از کلاس MediaPlayer در برنامه نویسی اندروید در ادامه ی مباحث این بخش با ما همراه باشید.
در این مبحث ما ساختار کلی استفاده از MediaPlayer در برنامه نویسی اندروید و متدهای مربوطه را ارائه کرده ایم.
همانطور که اشاره کردیم برای استفاده از کلاس MediaPlayer ما باید از متد ()create در برنامه خود استفاده کنیم.
ساختار کلی تعریف این متد به صورت زیر است:
1 | MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.song); |
پارامتر دوم نام آهنگی است که می خواهید آن را اجرا کنید.
در اولین گام یک فولدر جدید با نام raw در پروژه ی حخود ایجاد کرده و آهنگ مورد نظر را داخل آن قرار می دهیم.
هنگامی که شما Object Mediaplayer را ایجاد کرده اید، می توانید برخی از متدها را برای شروع یا توقف موسیقی فراخوانی کنید.
این متدها شامل به صورت زیر است:
1 2 | mediaPlayer.start(); mediaPlayer.pause(); |
با فراخوانی متد ()start موزیک از ابتدای پخش آن پخش خواهد شد.
اگر متد فوق بعد از متد ()pause مجددا فرخوانی شود آهنگ از جایی که موقف شده پخش می شود.
در این صورت اگر می خواهید آهنگ از ابتدای آن پخش شود باید متد ()reset را فرخوانی کنید:
1 | mediaPlayer.reset(); |
علاوه بر متدهای فوق، متدهای دیگری نیز برای مدیریت و رفتاردهی به فایل های audio/video ارائه شده که به شرح زیر است:
ردیف | متد توضیحات |
---|---|
۱ | isPlaying() این متد با برگرداندن یکی از مقادیر true/false مشخص می کند یک موسیقی در حال پخش است یا خیر. |
۲ | seekTo(position) این متد یک پارامتر از نوع integer دریافت کرده و بر اساس آن موزیک را بر حسب میلی ثانیه به موقعیت خاص می برد. |
۳ | getCurrentPosition() این متد موقعیت جاری پخش موزیک را بر حسب میلی ثانیه برمی گرداند. |
۴ | getDuration() این متد زمان کلی پخش موزیک را بر حسب میلی ثانیه برمی گرداند. |
۵ | reset() این متد media player را ریست می کند. |
۶ | release() این متد منابعی را که به آجکت MediaPlayer مرتبط شده اند را تجزیه می کند. |
۷ | setVolume(float leftVolume, float rightVolume) این متد volume بالای player را تنظیم می کند. |
۸ | setDataSource(FileDescriptor fd) این متد منبع داده فایل های audio/video را تنظیم می کند. |
۹ | selectTrack(int index) این متد یک مقدار integer را دریافت کرده و شماره index معادل آن، از لیست پخش را که یک track مشخص است، را برمی گرداند. |
۱۰ | getTrackInfo() این متد آرایه ی اطلاعات track را برمی گرداند. |
در ادامه به یک نمونه برنامه از طرز استفاده ی کلاس MediaPlayer برای پخش موسیقی پرداخته ایم.
این برنامه ی ساده به شما امکن پخش ، مکث و برگشت به عقب موسیقی را فراهم می کند.
نکته : برای تست این برنامه باید آن را در یک دستگاه اندروید واقعی اجرا کنید تا بتوانید صدای موسیقی را بشنوید.
مراحل انجام کار:
مراحل | توضیحات |
---|---|
۱ | مراحل ایجاد برنامه در اندروید استدیو را طبق بخش های قبلی دنبال کنید. |
۲ | به محتوای فایل src/MainActivity.java کد MediaPlayer را اضافه کنید. |
۳ | طراحی مناسب با این برنامه را به res/layout/activity_main اضافه کنید. |
۴ | یک فولدر جدید با نام raw در زیر MediaPlayer ایجاد کرده و یک فایل .mp3 موسیقی را با نام song.mp3 به آن اضافه کنید. |
۵ | برنامه را اجرا کنید تا دستگاه اندروید شما نتیجه را نمایش دهد. |
به محتوای فایل main activity که در src/MainActivity.java قرار دارد کد زیر را اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | package com.example.Pvlearn.myapplication; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import java.util.concurrent.TimeUnit; public class MainActivity extends Activity { private Button b1,b2,b3,b4; private ImageView iv; private MediaPlayer mediaPlayer; private double startTime = 0; private double finalTime = 0; private Handler myHandler = new Handler();; private int forwardTime = 5000; private int backwardTime = 5000; private SeekBar seekbar; private TextView tx1,tx2,tx3; public static int oneTimeOnly = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.button); b2 = (Button) findViewById(R.id.button2); b3 = (Button)findViewById(R.id.button3); b4 = (Button)findViewById(R.id.button4); iv = (ImageView)findViewById(R.id.imageView); tx1 = (TextView)findViewById(R.id.textView2); tx2 = (TextView)findViewById(R.id.textView3); tx3 = (TextView)findViewById(R.id.textView4); tx3.setText("Song.mp3"); mediaPlayer = MediaPlayer.create(this, R.raw.song); seekbar = (SeekBar)findViewById(R.id.seekBar); seekbar.setClickable(false); b2.setEnabled(false); b3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Playing sound",Toast.LENGTH_SHORT).show(); mediaPlayer.start(); finalTime = mediaPlayer.getDuration(); startTime = mediaPlayer.getCurrentPosition(); if (oneTimeOnly == 0) { seekbar.setMax((int) finalTime); oneTimeOnly = 1; } tx2.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) ); tx1.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) ); seekbar.setProgress((int)startTime); myHandler.postDelayed(UpdateSongTime,100); b2.setEnabled(true); b3.setEnabled(false); } }); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Pausing sound",Toast.LENGTH_SHORT).show(); mediaPlayer.pause(); b2.setEnabled(false); b3.setEnabled(true); } }); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int temp = (int)startTime; if((temp+forwardTime)<=finalTime){ startTime = startTime + forwardTime; mediaPlayer.seekTo((int) startTime); Toast.makeText(getApplicationContext(),"You have Jumped forward 5 seconds",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getApplicationContext(),"Cannot jump forward 5 seconds",Toast.LENGTH_SHORT).show(); } } }); b4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int temp = (int)startTime; if((temp-backwardTime)>0){ startTime = startTime - backwardTime; mediaPlayer.seekTo((int) startTime); Toast.makeText(getApplicationContext(),"You have Jumped backward 5 seconds",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getApplicationContext(),"Cannot jump backward 5 seconds",Toast.LENGTH_SHORT).show(); } } }); } private Runnable UpdateSongTime = new Runnable() { public void run() { startTime = mediaPlayer.getCurrentPosition(); tx1.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. toMinutes((long) startTime))) ); seekbar.setProgress((int)startTime); myHandler.postDelayed(this, 100); } }; } |
طراحی این برنامه در فایل res/layout/activity_main.xml به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:text="Music Palyer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textview" android:textSize="35dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pvlearn" android:id="@+id/textView" android:layout_below="@+id/textview" android:layout_centerHorizontal="true" android:textColor="#ff7aff24" android:textSize="35dp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:src="@drawable/abc"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/forward" android:id="@+id/button" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pause" android:id="@+id/button2" android:layout_alignParentBottom="true" android:layout_alignLeft="@+id/imageView" android:layout_alignStart="@+id/imageView" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/back" android:id="@+id/button3" android:layout_alignTop="@+id/button2" android:layout_toRightOf="@+id/button2" android:layout_toEndOf="@+id/button2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rewind" android:id="@+id/button4" android:layout_alignTop="@+id/button3" android:layout_toRightOf="@+id/button3" android:layout_toEndOf="@+id/button3" /> <SeekBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/seekBar" android:layout_alignLeft="@+id/textview" android:layout_alignStart="@+id/textview" android:layout_alignRight="@+id/textview" android:layout_alignEnd="@+id/textview" android:layout_above="@+id/button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/textView2" android:layout_above="@+id/seekBar" android:layout_toLeftOf="@+id/textView" android:layout_toStartOf="@+id/textView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/textView3" android:layout_above="@+id/seekBar" android:layout_alignRight="@+id/button4" android:layout_alignEnd="@+id/button4" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/textView4" android:layout_alignBaseline="@+id/textView2" android:layout_alignBottom="@+id/textView2" android:layout_centerHorizontal="true" /> </RelativeLayout> |
محتوای فایل res/values/string.xml:
1 2 3 4 5 6 7 | <resources> <string name="app_name">My Application</string> <string name="back"><![CDATA[<]]></string> <string name="rewind"><![CDATA[<<]]></string> <string name="forward"><![CDATA[>>]]></string> <string name="pause">||</string> </resources> |
محتوای فایل AndroidManifest.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.Pvlearn.myapplication" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.Pvlearn.myapplication.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
سپس نتیجه اجرای برنامه را در دستگاه اندروید خود مشابه زیر مشاهده خواهید کرد:
در حالت پیش فرض مشاهده می کنید که دکمه pause غیر فعال است.
وقتی که روی play برای پخش موسیقی کلیک کنید خواهید دید که pause فعال می شود.
حالا در حالی که موسیقی در حال پخش است روی pause کلیک کنید تا نتیجه ی توقف پخش را مشاهده کنید:
سپس زمانیکه مجددا روی play کلیک کنید موسیقی از ابتدای آن پخش نخواهد شد.
حالا روی دکمه هایی که نماد fast forward یا backward دارد کلیک کنید تا موسیقی ۵ ثانیه به جلو یا عقب برود.
زمانیکه دیگر امکان به جلو بردن موسیقی نباشد، یک اطلاعیه به صورت زیر نمایش داده می شود:
تا زمانیکه از این برنامه خورج نشوید ، در حالیکه سایر کارهای تلفن همراه خود را انجم می دهید موسیقی در پس زمینه در حال پخش است که برای جلوگیری از این کار باید آن را در برنامه متوقف کرده و یا از برنامه خارج شوید.
قابلیت پخش موسیقی و فایل های چند رسانه ای امروزه تقریبا در تمام تلفن های همراه اندروید ارائه می شود. شما نیز می توانید با استفاده از کلاس MediaPlayer در برنامه نویسی اندروید این قابلیت را به اپلیکیشن خود اضافه کنید.
در بخش بعدی به آموزش قابلیت Multitouch در اندروید می پردازیم.