پخش فیلم با استفاده از Video View در اندروید
یکشنبه 2 اسفند 1394در این مقاله قصد داریم یک فیلم را در یک ابزاری به نام video view نمایش دهیم، زمانی که ما می خواهیم یک فیلم داخل activity نمایش داده شود ما باید یک مکانی را برای نمایش فیلم در نظر بگیریم.
کلاس videoview کلاسی است که مدیریت نمایش یک فایل تصویری و تصاویر را از منابع دارد.برای نمایش فیلم مورد نظر خود باید توجه داشته باشید که فیلم های کوتاه انتخاب نمایید نباید فیلم ها طولانی باشند.
فیلم که پخش شده است نباید دوباره از اول پخش شود برای ذخیره و برگرداندن فیلم مورد نظر باید از دو متد onsaveinstancestate و onrestoreinstancestate استفاده نمایید.
بنابر این ما در این نمونه از یک فایل صوتی با فرمت 3gp استفاده کرده ایم، که این دو فایل به دو صورت portrait و lanscape نمایش داده می شود.
ابتدا یک پروژه ی جدید ایجاد نمایید:
نام پروژه و package مورد نظر خود را مشخص نمایید:
یک activity جدید ایجاد نمایید.
حالا باید آیکون مورد نظر را برای application خود انتخاب نمایید یا اینکه یک آیکون پیش فرض انتخاب نمایید:
حالا باید یک Blank Activity انتخاب نمایید به صورت زیر:
حالا نام activity خود را داخل پوشه ی res/layout ایجاد نمایید:
ساختار پروژه به صورت زیر خواهد بود:
داخل صفحه ی خود فقط از یک view استفاده می نماییم باید حتما صفحه ی مورد نظر هم به صورت portrait باشد هم به صورت landscape تنظیم شود.
در این نمونه ما نمی خواهیم فیلم فقط به صورت portrait باشد می خواهیم فیلم به صورت landscape هم پخش شود پس داخل پوشه ی res از یک پوشه به نام land استفاده می نماییم.
داخل فایل activity مورد نظر کد زیر را می نویسیم:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_gravity="center" android:layout_height="fill_parent" > <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout>
همین فایل activity خود را در پوشه ی landscape خود قرار می دهید محتوا و کدها همان است با این تفاوت که داخل یک پوشه ی دیگر قرار گرفته است و باعث میشود صفحه به صورت landscape نمایش داده شود.
داخل کلاس جاوا قطعه کد زیر را قرار دهید:
import android.app.Activity; import android.app.ProgressDialog; import android.content.res.Configuration; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.MediaController; import android.widget.VideoView; public class AndroidVideoViewExample extends Activity { private VideoView myVideoView; private int position = 0; private ProgressDialog progressDialog; private MediaController mediaControls; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the layout from video_main.xml setContentView(R.layout.activity_main); if (mediaControls == null) { mediaControls = new MediaController(AndroidVideoViewExample.this); } // Find your VideoView in your video_main.xml layout myVideoView = (VideoView) findViewById(R.id.video_view); // Create a progressbar progressDialog = new ProgressDialog(AndroidVideoViewExample.this); // Set progressbar title progressDialog.setTitle("مرجع تخصصی برنامه نویسان"); // Set progressbar message progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); // Show progressbar progressDialog.show(); try { myVideoView.setMediaController(mediaControls); myVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.kitkat)); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } myVideoView.requestFocus(); myVideoView.setOnPreparedListener(new OnPreparedListener() { // Close the progress bar and play the video public void onPrepared(MediaPlayer mp) { progressDialog.dismiss(); myVideoView.seekTo(position); if (position == 0) { myVideoView.start(); } else { myVideoView.pause(); } } }); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt("Position", myVideoView.getCurrentPosition()); myVideoView.pause(); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); position = savedInstanceState.getInt("Position"); myVideoView.seekTo(position); } }
ابتدا تعریف کد از یک videoview استفاده کردیم به صورت زیر:
setContentView(R.layout.activity_main); myVideoView = (VideoView) findViewById(R.id.video_view);
برای جلو و عقب بردن فیلم و بخش و متوقف کردن آن باید از mediacontroller استفاده نماییم.
if (mediaControls == null) { mediaControls = new MediaController(AndroidVideoViewExample.this); } myVideoView.setMediaController(mediaControls);
برای شروع و توقف فیلم:
myVideoView.start(); myVideoView.pause(); myVideoView.resume(); myVideoView.seekTo(position); //when we want the video to start from a certain point
زمانی که progress کامل لود شد و فیلم مورد نظر نمایش داده می شود به صورت زیر:
progressDialog = new ProgressDialog(AndroidVideoViewExample.this); // Set progressbar title progressDialog.setTitle("مرجع تخصصی برنامه نویسان"); // Set progressbar message progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); // Show progressbar progressDialog.show();
به منظور کش کردن و بار گذاری فایل ویدیوی خود ما از یک متد به نام onpreparedlistener استفاده می نماییم.
myVideoView.setOnPreparedListener(new OnPreparedListener() { // Close the progress bar and play the video public void onPrepared(MediaPlayer mp) { progressDialog.dismiss(); myVideoView.seekTo(position); if (position == 0) { myVideoView.start(); } else { myVideoView.pause(); } } }); }
زمانی که شما activity مورد نظر خود را اجرا نمایید فیلم حالت portrait پخش خواهد شد زمانی که بخواهید آن را به صورت landscape پخش نمایید یک مشکل به وجود می آید و آن هم این است که فیلم دوباره از اول راه اندازی می شود برای اینکه این اتفاق نیفتد و این مشکل بر طرف شود باید از متد onsaveInstancestate و onrestoreInstancestate استفاده نمایید.
متد زیر به منظور ذخیره ی فیلم در position خود خواهد بود:
@Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt("Position", myVideoView.getCurrentPosition()); myVideoView.pause(); }
و برای پخش موقعیت ضبط شده باید از متد زیر استفاده نماییم:
@Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); position = savedInstanceState.getInt("Position"); myVideoView.seekTo(position); }
در فایل androidmanifest برای اینکه قابل گردش باشد از کد زیر استفاده می نمایید:
android:configChanges="orientation"
زمانی که برنامه را اجرا نمایید به صورت زیر خواهد بود:
این نمونه قابلیت پخش و توقف و حالت landscape شدن بدون بارگذاری از اول فیلم و یا متوقف شدن فیلم مورد نظر، زمانی که گوشی خود را به حالت lanscape قرار دهید به صورت زیر خواهد بود:
- Android
- 2k بازدید
- 3 تشکر