پخش فیلم با استفاده از Video View در اندروید

یکشنبه 2 اسفند 1394

در این مقاله قصد داریم یک فیلم را در یک ابزاری به نام video view نمایش دهیم، زمانی که ما می خواهیم یک فیلم داخل activity نمایش داده شود ما باید یک مکانی را برای نمایش فیلم در نظر بگیریم.

پخش فیلم با استفاده از Video View در اندروید

کلاس 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 قرار دهید به صورت زیر خواهد بود:

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید