Черный экран Android VideoView

Я искал способ избавиться от неприятного черного начального экрана в VideoView перед запуском метода start().

Я пробовал использовать фоновое изображение в виджете, но оно совсем не работает должным образом. Я также попытался поместить изображение первого кадра видео поверх VideoView и скрыть его после метода start(). Добавление прослушивателя onPrepared для запуска видео и скрытия изображения. Это работает, но при переходе возникает ужасное мерцание, и я не знаю, как от него избавиться.


Добавление MediaController ни на что не повлияло. Проблема сохраняется (я все еще вижу мерцание черного), и я не хочу, чтобы элементы управления видео были видны вообще. Мой код выглядит так:

    VideoView vSurface= (VideoView) findViewById(R.id.surfaceView1);
    vSurface.setVideoURI(Uri.parse("android.resource://com.mypackage/" + R.raw.video1));
    vSurface.setVisibility(View.VISIBLE);
    vSurface.setOnPreparedListener(this);
    vSurface.setDrawingCacheEnabled(true);
    vSurface.setOnErrorListener(this);

person SergioM    schedule 19.03.2012    source источник
comment
Вы нашли решение своей проблемы? У меня такая же ситуация   -  person M to the K    schedule 02.04.2012
comment
Я сделал, лучший способ сделать это был ниже. Но проблема сохраняется, когда вы пытаетесь удалить представление (если это так). Он по-прежнему будет мерцать. Надеюсь, это не ваш случай.   -  person SergioM    schedule 18.04.2012
comment
Эта проблема намного старше, если вы проверите. Спасибо   -  person SergioM    schedule 12.09.2017
comment
может кто-нибудь сказать мне, почему это происходит?   -  person blackHawk    schedule 06.10.2019


Ответы (24)


У меня такая же проблема, и я нашел решение. Это немного взломано, но помогает. Итак, в основном вам нужно поместить свой VideoView в FrameLayout. Поверх видеовоспроизведения вам нужно добавить еще один FrameLayout с фоном вашего видео, и когда ваше видео загружено и готово к воспроизведению, вы скрываете заполнитель.

<FrameLayout
  android:id="@+id/frameLayout1"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_gravity="center"
  android:layout_marginTop="50dip" >

  <VideoView
    android:id="@+id/geoloc_anim"
    android:layout_width="fill_parent"
    android:layout_height="172dip" android:layout_gravity="top|center" android:visibility="visible"/>

  <FrameLayout
      android:id="@+id/placeholder"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" android:background="@drawable/fondvert_anim">
  </FrameLayout>

In your activity you need to implements OnPreparedListener and add this

//Called when the video is ready to play
public void onPrepared(MediaPlayer mp) {

    View placeholder = (View) findViewById(R.id.placeholder);

    placeholder.setVisibility(View.GONE);
}

Поэтому, когда видео готово, мы скрываем наш заполнитель, и этот трюк позволяет избежать черного мерцающего экрана.

Надеюсь, это кому-то поможет.

person M to the K    schedule 02.04.2012
comment
Это очень плохой обходной путь, потому что он подразумевает, что непрозрачный объект для рисования соответствует макету. Кроме того, я обнаружил, что продолжительность мерцания зависит от устройства, и первый кадр не обязательно отображается при вызове onPrepared(). Неутешительно. - person Paul Lammertsma; 10.04.2012
comment
если он работает, то кого волнует, что это «взлом» - в жизни не все идеально! вы всегда можете установить короткую альфа-анимацию на макете кадра с помощью заполнителя, чтобы уменьшить эффект «щелчка» - или поиграйте с чем-то вроде этого .. - person Mark Keen; 20.06.2015
comment
но мой черный экран появляется даже после вызова onPrepared, что для этого делать? - person Narendra Singh; 02.12.2015
comment
У меня до сих пор мерцает черный цвет с этим решением на Android 5.1. - person user2966445; 28.08.2016
comment
вид по-прежнему вызывает мерцание. @wizardlee имеет правильный ответ - person Ken Zira; 16.09.2018
comment
Для тех, кто ищет решение форм Xamarin: stackoverflow.com/questions/60414907/ - person Legion; 26.02.2020

Я сталкиваюсь с той же проблемой и решаю ее с помощью принятого выше решения плюс следующее:

  @Override
  public void onPrepared(MediaPlayer mp) {
    mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
      @Override
      public boolean onInfo(MediaPlayer mp, int what, int extra) {
        Log.d(TAG, "onInfo, what = " + what);
        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
          // video started; hide the placeholder.
          placeholder.setVisibility(View.GONE);
          return true;
        }
        return false;
      }
    });

Я думаю, что onPrepared просто означает, что видео готово к воспроизведению, но не означает, что видео начало воспроизводиться. Если скрыть заполнитель в onPrepared, на экране все равно будет отображаться черный экран.

На моих Note3 и Nexus это решение работает хорошо.

person wizardlee    schedule 29.10.2014
comment
Я применил это с ImageView поверх VideoView. когда запускается MEDIA_INFO_VIDEO_RENDERING_START, я скрываю ImageView. - person mwm; 01.12.2014
comment
просто обратите внимание, что MEDIA_INFO_VIDEO_RENDERING_START требует api 17+ - person Keke; 28.03.2015
comment
Определенно должен быть правильный ответ! +1 мой друг;) - person Hugo; 17.09.2015
comment
Не имеет значения на Android 5.1. - person user2966445; 28.08.2016
comment
Я попробовал это и не увидел мерцания на физическом устройстве, но все еще видел мерцание на эмуляторе (API 23). Похоже, ожидание MEDIA_INFO_VIDEO_RENDERING_START ничего не гарантирует. Однако я не знаю лучшей альтернативы. - person Daniel Lubarov; 06.07.2017
comment
Небольшой совет: если вы не хотите, чтобы вид покрывал экран и вам нравится показывать вид сзади, вы можете установить альфа-канал VideoView на 0 и вернуть его на 1 на MEDIA_INFO_VIDEO_RENDERING_START. Однако установка скрытой видимости не сработает. - person lbarbosa; 14.10.2018
comment
этот работает для меня, даже не помещая VideoView внутрь FrameLayout - person Dody Rachmat Wicaksono; 07.05.2020

У меня была такая же проблема на Galaxy tab 2, Android 4.1.1.

Сделайте videoView.setZOrderOnTop(true); и затем videoView.start()

Он отлично работает для меня.

person jc_35    schedule 30.04.2013
comment
Работает только в том случае, если у вас нет виджета, установленного поверх видеопросмотра. - person mrroboaat; 12.01.2015
comment
У меня работает на Android 7.0, большое спасибо! Это сводило меня с ума - person Parker; 19.06.2017

У меня была такая же проблема, и это сработало для меня ..

Если вы хотите показать видео, сделайте videoView.setZOrderOnTop (false); а если вы хотите скрыть видео, просто сделайте videoView.setZOrderOnTop (true);

person Ravi Bhojani    schedule 02.07.2012
comment
По какой-то причине это улучшает производительность, однако не предотвращает полностью черную вспышку. Спасибо хоть - person Moak; 16.03.2013
comment
Этот ответ помог мне, и как-то, как сказал @Moak, он не полностью предотвращает черную вспышку. Чтобы предотвратить это, я сделал if(videoView.isPlaying()), а затем установил videoView.setZOrderOnTop(false) - person elL; 29.08.2013
comment
он должен работать для всех. Сначала установите videoView.setZOrderOnTop (true); Затем установите videoView.setZOrderOnTop (true); внутри обратного вызова OnPreparedListener. - person iamcrypticcoder; 04.05.2015

У меня такая же проблема, я только что использовал videov.setBackgroundColor (Color.WHITE), а затем onprepare использовал Color.TRANSPARENT) белый цвет для меня все равно лучше черного

person Ahmad Dwaik 'Warlock'    schedule 28.03.2013
comment
Простое решение. Это лучше всего, если у вас есть возможность установить цвет, который не противоречит вашему стилю просмотра. - person andrea.rinaldi; 15.04.2014
comment
У меня был сплошной черный экран, проигрывался только звук без видео. Color.TRANSPARENT работал у меня в onPreparedListener ... Большое спасибо - person Janwilx72; 31.01.2017

Расширяя TextureView, я не получаю черные экраны ни в начале, ни в конце. Это если вы хотите избежать использования ZOrderOnTop(true).

public class MyVideoView extends TextureView implements TextureView.SurfaceTextureListener {
  private MediaPlayer mMediaPlayer;
  private Uri mSource;
  private MediaPlayer.OnCompletionListener mCompletionListener;
  private boolean isLooping = false;


  public MyVideoView(Context context) {
      this(context, null, 0);
  }

  public MyVideoView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
  }

  public MyVideoView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      setSurfaceTextureListener(this);
  }

  public void setSource(Uri source) {
      mSource = source;
  }

  public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
      mCompletionListener = listener;
  }

  public void setLooping(boolean looping) {
     isLooping = looping;
  }

  @Override
  protected void onDetachedFromWindow() {
     // release resources on detach
     if (mMediaPlayer != null) {
         mMediaPlayer.release();
         mMediaPlayer = null;
     }
     super.onDetachedFromWindow();
   }

   /*
    * TextureView.SurfaceTextureListener
    */
    @Override
   public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
     Surface surface = new Surface(surfaceTexture);
     try {
         mMediaPlayer = new MediaPlayer();
         mMediaPlayer.setOnCompletionListener(mCompletionListener);
         mMediaPlayer.setOnBufferingUpdateListener(this);
         mMediaPlayer.setOnErrorListener(this);
         mMediaPlayer.setLooping(isLooping);
         mMediaPlayer.setDataSource(getContext(), mSource);
         mMediaPlayer.setSurface(surface);
         mMediaPlayer.prepare();
         mMediaPlayer.start();
     } catch (IllegalArgumentException e) {
         e.printStackTrace();
     } catch (SecurityException e) {
         e.printStackTrace();
     } catch (IllegalStateException e) {
         e.printStackTrace();
         mMediaPlayer.reset();
     } catch (IOException e) {
         e.printStackTrace();
     }
   }

   @Override
   public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

  @Override
  public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
     surface.release();
     return true;
  }

  @Override
  public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
}
person Carl B    schedule 03.07.2013
comment
Одна точность, TextureView входит в api 14 - person mrroboaat; 12.01.2015
comment
@Carl B, как переключаться с одного видео на другое видео. не могли бы вы помочь, какой метод я должен вызвать - person Bhavesh Jethani; 20.06.2016
comment
Что делать в видео-классе? - person Mitul Goti; 17.08.2016
comment
Может кто-нибудь объяснить это лучше? Если я использую приведенный выше код, он не содержит общих методов VIdeoView, таких как start () и т. Д. - person user2966445; 28.08.2016
comment
Хорошо, я успешно реализовал пользовательский VideoView, используя приведенную выше логику, но все еще мерцает черный цвет. Так что на Android 5.1 ничего хорошего для меня не годится. - person user2966445; 28.08.2016
comment
Вау, это прекрасно. Я не могу использовать VideoView.setZOrderOnTop (), потому что он перекрывает другие элементы. Это прекрасно работает. Спасибо Карл - person Karan Nagpal; 14.09.2017

Это сработало для меня:

videoView.setBackgroundColor(Color.WHITE); // Your color.
videoView.start();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        videoView.setBackgroundColor(Color.TRANSPARENT);
    }
});

По крайней мере, два года спустя, но я надеюсь, что это было полезно.

person emmgfx    schedule 11.08.2014

У меня ничего из вышеперечисленного не сработало. В моем случае onPrepared вызывается ДО того, как исчезнет черная рамка, поэтому я все равно буду видеть черную рамку.

Мне нужно было решение, при котором видео появлялось сразу после первого кадра.

Итак, я установил альфа-канал VideoView на 0 в xml:

android:alpha="0"

а затем, прежде чем начать видео, я возвращаю альфа-канал к 1:

videoView.animate().alpha(1);
videoView.seekTo(0);
videoView.start();

в качестве альтернативы вы можете просто опубликовать отложенный Runnable, чтобы установить альфа на 1, вместо его анимации.

person Siavash    schedule 21.09.2016

Это определенно хакерство, но лучше, чем наложение изображения (IMO).

boolean mRestored = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mRestored = savedInstanceState != null;
}

@Override
public void onPrepared(MediaPlayer mp) {

    if (!mRestored) vSurface.seekTo(1);
}

Предполагая, что вы помещаете вещи в savedInstanceState в onSaveInstanceState.

person Paul Burke    schedule 14.03.2013
comment
Не имеет значения на Android 5.1. - person user2966445; 28.08.2016

Просто покажите кадр из видео в качестве превью.

vSurface.SeekTo(100);
person j7nn7k    schedule 30.10.2014

Думаю, просто используйте VideoView # setBackgroundDrawable ().

  1. начальные настройки.

    VideoView.setBackgroundDrawable(yourdrawableid);
    
  2. начать видео

    VideoView.start();
    VideoView.setBackgroundDrawable(0);
    
person Takeaki Kubota    schedule 04.07.2013

Для людей, которые все еще ищут ответ на этот вопрос, у меня работал последовательный вызов VideoView.start() и VideoView.pause() внутри onPrepared. Я знаю, что это не может быть идеальным способом достижения этой цели, однако это может быть тот, который требует минимального обходного пути в коде. Надеюсь, это сработает и для вас.

@Override
public void onPrepared(MediaPlayer mp) {
    mVideoView.start();
    mVideoView.pause();
}
person Gagan    schedule 16.01.2015
comment
Не имеет значения на Android 5.1. - person user2966445; 28.08.2016

Это работает для меня:

В XML: VideoView прячется за относительным макетом с белым фоном

    <VideoView
      android:id="@+id/myVideo"
      android:layout_below="@+id/logo_top"
      android:layout_width="200dp"
      android:layout_height="200dp"
      android:layout_centerHorizontal="true" 
    />
    <RelativeLayout
      android:id="@+id/mask"
      android:background="#FFFFFF"
      android:layout_below="@+id/logo_top"
      android:layout_centerHorizontal="true"
      android:layout_width="200dp"  android:layout_height="200dp"
    >
    </RelativeLayout>

и в Activity: onCreate

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.acceuil);
    myVideo = (VideoView)  findViewById(R.id.myVideo);
    mask = (RelativeLayout)  findViewById(R.id.mask);
    String path = "android.resource://" 
      + getPackageName() + "/" + R.raw.anim_normal;
    myVideo.setVideoURI(Uri.parse(path));
    myVideo.start();
}

onStart:

 public void onStart() { 
    final long time = System.currentTimeMillis();
    super.onStart();
    new CountDownTimer(5000, 100) { 
    @Override
        public void onTick(long l) {

            long time2 = System.currentTimeMillis();
            if((time2 - time) > 500) {
                mask.setVisibility(View.GONE);
            }
        }

}.start();

Надеюсь это поможет.

person Ramza    schedule 20.06.2015

Используйте svVideoView.seekTo (position).

Укажите позицию в пределах 5 (мс).

onPause():
position=svVideoView.getCurrentPosition()

onResume():
svVideoView.seekTo(position);
person Raj    schedule 01.10.2014

Это работает для меня как в Activity, так и в Fragment.

VideoView mVideo = (VideoView) findViewById(R.id.yourViewViewId);
          mVideo.setVideoURI(mUri);
          mVideo.setZOrderOnTop(false);

SurfaceHolder surfaceholder = mVideo.getHolder();
surfaceholder.setFormat(PixelFormat.TRANSPARENT);
person Nam lê đình    schedule 06.01.2018

Для меня установка setZOrderOnTop не полностью удаляла начальную черную рамку при воспроизведении видео в формате mp4. Однако это уменьшило время появления черной рамки. Я хотел полностью удалить начальный черный кадр, поэтому поэкспериментировал и обнаружил, что поиск видео вперед на 100 мс помог мне.

В качестве примечания, я использую видео в цикле, поэтому, если вы не хотите повторять цикл, просто удалите
mp.isLooping = true

Ниже приведен фрагмент кода, который я использовал для устранения проблемы:

val path = "android.resource://" + packageName + "/" + R.raw.my_video
videoView.setVideoURI(Uri.parse(path))
videoView.setZOrderOnTop(true)
videoView.seekTo(100)
videoView.start()

videoView.setOnPreparedListener { mp ->
   videoView.setZOrderOnTop(false)
   mp.isLooping = true // Loops the video 
}

Было бы здорово, если бы я получил точное объяснение того, почему вышеперечисленное сработало, если кто-то сочтет это полезным.

person FutureJJ    schedule 23.03.2020

Это немного поздно для этого ответа, но, возможно, у других пользователей такая же проблема, и они найдут этот вопрос ..

Я справился с этим, сначала установив BackgroundResource, а затем, при запуске видео, я установил фон в невидимый цвет ..

VideoView myView = findViewById(R.id.my_view);
myView.setBackgroundResource(R.drawable.some_resource);
// some stuff

// this is when starting the video
myView.setVideoUri(someUri);
// also set MediaController somewhere...
//...
// now set the backgroundcolor to be not visible (first val of Color.argb(..) is the alpha)
myView.setBackGroundColor(Color.argb(0, 0, 0, 0));
//...
myView.start();
person MalaKa    schedule 31.01.2013
comment
Просто video.setBackgroundColor(Color.WHITE); перед запуском видео. Затем video.setBackgroundColor(Color.TRANSPARENT);, когда будете готовы. - person Hamzeh Soboh; 25.09.2013

Это хорошее решение:

package com.example.videoviewpractice;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.MediaController;
import android.widget.VideoView;

public class MainActivity extends Activity {

    VideoView myVideoView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initVideo();
}

private void initVideo() {
    myVideoView = (VideoView) findViewById(R.id.videoView1);
    String url = "http://mtc.cdn.vine.co/r/videos/3DF00EB7001110633055418310656_1e50d6d9a65.3.2.mp4?" + 
            "versionId=KVMUFFGqe6rYRrGKgl8hxL6eakVAErPy";
    myVideoView.setVideoURI(Uri.parse(url));
    myVideoView.setMediaController(new MediaController(this));
    myVideoView.requestFocus();
}

public void gone(View v){
    myVideoView.setZOrderOnTop(true);
    View placeholder = (View) findViewById(R.id.placeholder);

    placeholder.setVisibility(View.GONE);
    myVideoView.start();
}

}

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >

<FrameLayout
    android:id="@+id/frameLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:layout_marginTop="50dip" >

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="top|center"
        android:visibility="visible" />

    <FrameLayout
        android:id="@+id/placeholder"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="top|center"
        android:background="@drawable/ic_launcher"
        android:onClick="gone" >
    </FrameLayout>

</FrameLayout>

</LinearLayout>
person OShiffer    schedule 17.08.2014

Чтобы избежать раздражающего мерцания и проблем с черным экраном, я написал FrameVideoView.

Он использует преимущества «решения-заполнителя» и (если на вашем устройстве работает API уровня 14 или выше) TextureView, что намного эффективнее, чем VideoView.

Я написал статью в нашем блоге, чтобы рассказать, что это действительно делает.

Это просто в использовании:

Добавить FrameVideoView в макет:

<mateuszklimek.framevideoview.FrameVideoView
    android:id="@+id/frame_video_view"
    android:layout_width="@dimen/video_width"
    android:layout_height="@dimen/video_height"
  />

найдите его экземпляр в Activity и вызовите соответствующие методы в onResume и onPause:

public class SampleActivity extends Activity {

  private FrameVideoView videoView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple);

    String uriString = "android.resource://" + getPackageName() + "/" + R.raw.movie;
    videoView = (FrameVideoView) findViewById(R.id.frame_video_view);
    videoView.setup(Uri.parse(uriString), Color.GREEN);
  }

    @Override
    protected void onResume() {
      super.onResume();
      videoView.onResume();
    }

    @Override
    protected void onPause() {
      videoView.onPause();
      super.onPause();
    }
  }
person klimat    schedule 15.01.2015
comment
Это хорошее решение, но видео находится в бесконечном цикле, и на некоторых видео есть зеленая линия на правом краю и черная внизу (исходное видео, которое есть в проекте, не имеет, h.264, mp4). Кто-нибудь с этой проблемой? Решение? - person Toshe; 02.11.2015

Я была такая же проблема. Я обнаружил, что основной причиной этого было использование FrameLayout в качестве родительского макета. Используйте RelativeLayout в качестве родительского макета для VideoView

person Vinil Chandran    schedule 27.07.2017

Изменение ответа @ emmgfx сработало для меня:

videoView.setBackgroundColor(Color.WHITE)
videoView.start()
Timer().schedule(100){
  videoView?.setBackgroundColor(Color.TRANSPARENT)
}

Уловка заключается в том, чтобы отложить просмотр видео до загрузки видео. PS: Это котлин.

person Fawaz    schedule 05.07.2019

Я нашел отличное решение этой проблемы. (в Котлине)

Создайте изображение поверх своего видеовоспроизведения. Создайте функцию с обработчиком и проверьте, есть ли (videoview.duration ›0)

если продолжительность больше нуля, установите для imageview.visibility значение INVISABLE и сразу же выполните handler.removeCallbacks (this)

Вызовите указанную выше функцию после вызова videoview.start

Код ниже:

fun showVideoView () {

    val handler = Handler()

    handler.postDelayed(object : Runnable {
        override fun run() {
            try {
                if (videoplayer_topthree.currentPosition > 0) {
                    videoview_topthreeloadingimage.visibility = View.INVISIBLE
                    videoview_topthreeprogressbar.visibility = View.VISIBLE
                    videoview_topthreefullname.visibility = View.VISIBLE
                    videoview_topthreeviews.visibility = View.VISIBLE
                    videoview_topthreedate.visibility = View.VISIBLE
                    videoview_topthreedescription.visibility = View.VISIBLE
                    videoview_topthreedimview.visibility = View.VISIBLE
                    handler.removeCallbacks(this)
                }
                handler.postDelayed(this, 250)
            } catch (e: Exception) {
                println("SHOW VIDEOVIEW CATCH WAS CAUGHT")
            }
        }

    }, 0)

}

и здесь я вызываю эту функцию ..

videoplayer_topthree.setOnPreparedListener {

        prepareSizing(it)
        initializeProgressBar()
        showVideoView()
        
    }
person Colin Williams    schedule 04.03.2021

Попытка воспроизвести в основном белое видео на в основном белом макете показывает эти сбои очень очевидным и раздражающим образом, особенно во время переходов Activity. Единственный способ, которым мне удалось полностью избавиться от глюков, - это смешать несколько разных ответов из этой ветки и ответа elprl на https://stackoverflow.com/a/9089245/3997253.

Создайте сплошной цвет, который закрывает VideoView

<View
android:id="@+id/coverView"
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="match_parent" />

В onCreate

...
coverView = findViewById(R.id.coverView)
videoView = findViewById(R.id.videoView)

videoView.setZOrderOnTop(false)
val surfaceHolder = videoView.holder
surfaceHolder.setFormat(PixelFormat.TRANSPARENT)

В onStart

...
videoView.setOnPreparedListener { mp ->
    // Fade out cover View to show VideoView once rendering has started
    mp.setOnInfoListener { _, what, _ ->
        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
            coverView.animate().alpha(0F)
            return@setOnInfoListener true
        }
        return@setOnInfoListener false
    }
    mp.isLooping = true
    videoView.start()
    videoView.requestFocus()
}

По завершении с помощью VideoView

// Fade in cover View to hide the VideoView
coverView.animate().alpha(1F)
person David Kirkpatrick    schedule 15.06.2021

видеть это

VideoView videoView = (VideoView) findViewById(R.id.VideoView);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        Uri video = Uri.parse("android.resource://your_package_name/"+R.raw.monkeysonthebed_video);

        videoView.setMediaController(mediaController);
        videoView.setVideoURI(video);
        videoView.start();
person Venkata Krishna    schedule 19.03.2012
comment
Спасибо, но я не хочу использовать / отображать медиа-контроллер. - person SergioM; 27.03.2012