Android UniversalVideoView實現(xiàn)視頻播放器
更新時間:2022年04月19日 11:22:19 作者:抱著回憶旅行
這篇文章主要為大家詳細(xì)介紹了Android UniversalVideoView實現(xiàn)視頻播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Android UniversalVideoView實現(xiàn)視頻播放器的具體代碼,供大家參考,具體內(nèi)容如下


1.添加依賴 app下的 build.gradle
dependencies {
?
? ? ......
?
? ? compile 'com.linsea:universalvideoview:1.1.0@aar'
}2.XML布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? xmlns:app="http://schemas.android.com/apk/res-auto" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? android:orientation="vertical"> ? ? ? ? <FrameLayout ? ? ? ? android:id="@+id/video_layout" ? ? ? ? android:layout_width="fill_parent" ? ? ? ? android:layout_height="200dp" ? ? ? ? android:background="@android:color/black"> ? ? ? ? ? <com.universalvideoview.UniversalVideoView ? ? ? ? ? ? android:id="@+id/videoView" ? ? ? ? ? ? android:layout_width="fill_parent" ? ? ? ? ? ? android:layout_height="fill_parent" ? ? ? ? ? ? android:layout_gravity="center" ? ? ? ? ? ? app:uvv_autoRotation="true" ? ? ? ? ? ? app:uvv_fitXY="false" /> ? ? ? ? ? <com.universalvideoview.UniversalMediaController ? ? ? ? ? ? android:id="@+id/media_controller" ? ? ? ? ? ? android:layout_width="fill_parent" ? ? ? ? ? ? android:layout_height="fill_parent" ? ? ? ? ? ? app:uvv_scalable="true" /> ? ? </FrameLayout> ? ? ? <LinearLayout ? ? ? ? android:id="@+id/bottom_layout" ? ? ? ? android:layout_width="fill_parent" ? ? ? ? android:layout_height="0dp" ? ? ? ? android:layout_weight="1" ? ? ? ? android:orientation="vertical"> ? ? ? ? ? <Button ? ? ? ? ? ? android:id="@+id/start" ? ? ? ? ? ? android:layout_margin="5dp" ? ? ? ? ? ? android:layout_width="fill_parent" ? ? ? ? ? ? android:layout_height="50dp" ? ? ? ? ? ? android:gravity="center" ? ? ? ? ? ? android:text="start" /> ? ? ? ? ? <TextView ? ? ? ? ? ? android:id="@+id/introduction" ? ? ? ? ? ? android:layout_width="fill_parent" ? ? ? ? ? ? android:layout_height="0dp" ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:gravity="center" ? ? ? ? ? ? android:text="this is video introduciton ......" ? ? ? ? ? ? android:background="@color/uvv_gray" /> ? ? </LinearLayout> </LinearLayout>
3.MainActivity
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.universalvideoview.UniversalMediaController;
import com.universalvideoview.UniversalVideoView;
?
public class MainActivity extends Activity implements UniversalVideoView.VideoViewCallback{
?
? ? private static final String TAG = "MainActivity";
? ? private static final String SEEK_POSITION_KEY = "SEEK_POSITION_KEY";
? ? private static final String VIDEO_URL = "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4";
? ? //視頻地址
? ? //http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
? ? //http://vjs.zencdn.net/v/oceans.mp4
? ? //https://media.w3.org/2010/05/sintel/trailer.mp4
?
? ? UniversalVideoView mVideoView;
? ? UniversalMediaController mMediaController;
?
? ? View mBottomLayout;
? ? View mVideoLayout;
? ? TextView mStart;
?
? ? private int mSeekPosition;
? ? private int cachedHeight;
? ? private boolean isFullscreen;
? ? private TextView tv_title;
? ? private LinearLayout titlebar;
?
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? tv_title = (TextView) findViewById(R.id.introduction);
? ? ? ? //titlebar = (LinearLayout) findViewById(R.id.titlebar);
? ? ? ? tv_title.setText("UniversalVideoView");
?
? ? ? ? mVideoLayout = findViewById(R.id.video_layout);
? ? ? ? mBottomLayout = findViewById(R.id.bottom_layout);
? ? ? ? mVideoView = (UniversalVideoView) findViewById(R.id.videoView);
? ? ? ? mMediaController = (UniversalMediaController) findViewById(R.id.media_controller);
? ? ? ? mVideoView.setMediaController(mMediaController);
? ? ? ? //設(shè)置播放屏幕模式和設(shè)置播放地址
? ? ? ? setVideoAreaSize();
? ? ? ? //設(shè)置屏幕狀態(tài)和播放狀態(tài)的監(jiān)聽
? ? ? ? mVideoView.setVideoViewCallback(this);
? ? ? ? mStart = (TextView) findViewById(R.id.start);
?
? ? ? ? mStart.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View v) {
? ? ? ? ? ? ? ? if (mSeekPosition > 0) {
? ? ? ? ? ? ? ? ? ? mVideoView.seekTo(mSeekPosition);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? mVideoView.start();
? ? ? ? ? ? ? ? mMediaController.setTitle("Big Buck Bunny");
? ? ? ? ? ? }
? ? ? ? });
?
? ? ? ? mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onCompletion(MediaPlayer mp) {
? ? ? ? ? ? ? ? Log.d(TAG, "onCompletion ");
? ? ? ? ? ? }
? ? ? ? });
?
? ? ? ? mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onPrepared(MediaPlayer mp) {
? ? ? ? ? ? ? ? if (mSeekPosition > 0) {
? ? ? ? ? ? ? ? ? ? mVideoView.seekTo(mSeekPosition);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? mVideoView.start();
? ? ? ? ? ? }
? ? ? ? });
? ? }
?
? ? @Override
? ? protected void onPause() {
? ? ? ? super.onPause();
? ? ? ? Log.d(TAG, "onPause ");
? ? ? ? if (mVideoView != null && mVideoView.isPlaying()) {
? ? ? ? ? ? mSeekPosition = mVideoView.getCurrentPosition();
? ? ? ? ? ? Log.d(TAG, "onPause mSeekPosition=" + mSeekPosition);
? ? ? ? ? ? mVideoView.pause();
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 置視頻區(qū)域大小
? ? ?*/
? ? private void setVideoAreaSize() {
? ? ? ? mVideoLayout.post(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? int width = mVideoLayout.getWidth();
? ? ? ? ? ? ? ? cachedHeight = (int) (width * 405f / 720f);
// ? ? ? ? ? ? ? ?cachedHeight = (int) (width * 3f / 4f);
// ? ? ? ? ? ? ? ?cachedHeight = (int) (width * 9f / 16f);
? ? ? ? ? ? ? ? ViewGroup.LayoutParams videoLayoutParams = mVideoLayout.getLayoutParams();
? ? ? ? ? ? ? ? videoLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
? ? ? ? ? ? ? ? videoLayoutParams.height = cachedHeight;
? ? ? ? ? ? ? ? mVideoLayout.setLayoutParams(videoLayoutParams);
? ? ? ? ? ? ? ? mVideoView.setVideoPath(VIDEO_URL);
? ? ? ? ? ? ? ? mVideoView.requestFocus();
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? //當(dāng)屏幕發(fā)生改變的時候,如果要保持進(jìn)度必須自己重寫onSaveInstanceState方法
? ? @Override
? ? protected void onSaveInstanceState(Bundle outState) {
? ? ? ? super.onSaveInstanceState(outState);
? ? ? ? Log.d(TAG, "onSaveInstanceState Position=" + mVideoView.getCurrentPosition());
? ? ? ? outState.putInt(SEEK_POSITION_KEY, mSeekPosition);
? ? }
?
? ? @Override
? ? protected void onRestoreInstanceState(Bundle outState) {
? ? ? ? super.onRestoreInstanceState(outState);
? ? ? ? mSeekPosition = outState.getInt(SEEK_POSITION_KEY);
? ? ? ? Log.d(TAG, "onRestoreInstanceState Position=" + mSeekPosition);
? ? }
?
? ? /**
? ? ?* 全屏和默認(rèn)的切換
? ? ?* @param isFullscreen
? ? ?*/
? ? @Override
? ? public void onScaleChange(boolean isFullscreen) {
? ? ? ? this.isFullscreen = isFullscreen;
? ? ? ? if (isFullscreen) {
? ? ? ? ? ? ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
? ? ? ? ? ? layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
? ? ? ? ? ? layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
? ? ? ? ? ? mVideoLayout.setLayoutParams(layoutParams);
? ? ? ? ? ? mBottomLayout.setVisibility(View.GONE);
?
? ? ? ? ? ? //全屏就隱藏標(biāo)題欄
? ? ? ? ? ? //titlebar.setVisibility(View.GONE);
?
? ? ? ? } else {
? ? ? ? ? ? ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
? ? ? ? ? ? layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
? ? ? ? ? ? layoutParams.height = this.cachedHeight;
? ? ? ? ? ? mVideoLayout.setLayoutParams(layoutParams);
? ? ? ? ? ? mBottomLayout.setVisibility(View.VISIBLE);
? ? ? ? ? ? //豎直方法的時候,顯示標(biāo)題欄
? ? ? ? ? // ?titlebar.setVisibility(View.VISIBLE);
? ? ? ? }
// ? ? ? ?switchTitleBar(!isFullscreen);
? ? }
?
// ? ?private void switchTitleBar(boolean show) {
// ? ? ? ?android.support.v7.app.ActionBar supportActionBar = getSupportActionBar();
// ? ? ? ?if (supportActionBar != null) {
// ? ? ? ? ? ?if (show) {
// ? ? ? ? ? ? ? ?supportActionBar.show();
// ? ? ? ? ? ?} else {
// ? ? ? ? ? ? ? ?supportActionBar.hide();
// ? ? ? ? ? ?}
// ? ? ? ?}
// ? ?}
?
? ? @Override
? ? public void onPause(MediaPlayer mediaPlayer) {
? ? ? ? Log.d(TAG, "onPause UniversalVideoView callback");
? ? }
?
? ? @Override
? ? public void onStart(MediaPlayer mediaPlayer) {
? ? ? ? Log.d(TAG, "onStart UniversalVideoView callback");
? ? }
?
? ? @Override
? ? public void onBufferingStart(MediaPlayer mediaPlayer) {
? ? ? ? Log.d(TAG, "onBufferingStart UniversalVideoView callback");
? ? }
?
? ? @Override
? ? public void onBufferingEnd(MediaPlayer mediaPlayer) {
? ? ? ? Log.d(TAG, "onBufferingEnd UniversalVideoView callback");
? ? }
?
? ? @Override
? ? public void onBackPressed() {
? ? ? ? if (this.isFullscreen) {
? ? ? ? ? ? mVideoView.setFullscreen(false);
? ? ? ? } else {
? ? ? ? ? ? super.onBackPressed();
? ? ? ? }
? ? }
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
基于android示例程序(bitmapfun) 高效加載圖片讓人無語地方
嘗試了使用git上的一個開源項目afinal(bitmapfun的封裝版)來加載圖片,但是在測試的時候發(fā)現(xiàn)了一個問題,新的圖片加載器(bitmapfun)比之前用的ImageDownloader要慢很多,特別是在網(wǎng)絡(luò)狀況不好的時候,那簡直是太讓人無語了2013-04-04
flutter項目引入iconfont阿里巴巴圖標(biāo)
這篇文章主要為大家介紹了flutter項目引入iconfont阿里巴巴圖標(biāo)的過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
詳解Android提交數(shù)據(jù)到服務(wù)器的兩種方式四種方法
本篇文章主要介紹了Android提交數(shù)據(jù)到服務(wù)器的兩種方式四種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-11-11
android開機(jī)自啟動原理與實現(xiàn)案例(附源碼)
完成一下步驟后,啟動一次程序,完成注冊。等下次手機(jī)開機(jī)時,該軟件即會自動啟動,具體實現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06
Android基于CountDownView的時間控件擴(kuò)展
這篇文章主要為大家詳細(xì)介紹了Android基于CountDownView的時間控件擴(kuò)展,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02

