Интеграция видеофайла в приложении Android в качестве фона приложения

Мне нужно использовать видео в качестве фона. Сначала я поместил видеофайл в выпадающую папку и вызвал в качестве фона LinearLayout в main.xml. Но во время работы приложения я увидел только черный экран. Затем я попытался использовать VideoView и назвал его следующим:

   

В моем файле активности я назвал его следующим fragmentом кода:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); VideoView video=(VideoView) findViewById(R.id.video); video.start(); } 

Но все равно я не получаю видеофайл. Моим основным предложением является использование пузырькового видео в качестве фона и наложение на него двух кнопок пузырьков и предоставление пользователю ощущения, как экран с видом на воду. Может кто-нибудь мне помочь?

Также видеофайл, который я хочу использовать из папки res. Не с SD-карты или с любой внешней папки.

Хорошо, мой друг, прежде всего, вы не можете установить фон в свой VideoView и заставить его играть на фоне вашего экрана.

Пожалуйста, следуйте моим шагам и добавьте свои усилия, и вы должны быть там.

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

Прежде всего, создайте SurfaceView в вашем xml, как это.

     

Теперь создайте class, подобный приведенному ниже, который может реализовать SurfaceView ,

 public class YourMovieActivity extends Activity implements SurfaceHolder.Callback { private MediaPlayer mp = null; //... SurfaceView mSurfaceView=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mp = new MediaPlayer(); mSurfaceView = (SurfaceView) findViewById(R.id.surface); mSurfaceView.getHolder().addCallback(this); //... } } 

Теперь ваш class попросит добавить недопустимые методы. Добавьте эти методы, просто нажав «Добавить нереализованные методы»

Теперь вы сможете увидеть автоматически созданный метод, подобный этому,

 @Override public void surfaceCreated(SurfaceHolder holder) { } 

И внутри этого метода добавьте приведенный ниже код,

 @Override public void surfaceCreated(SurfaceHolder holder) { Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.your_raw_file); mp.setDataSource(video); mp.prepare(); //Get the dimensions of the video int videoWidth = mp.getVideoWidth(); int videoHeight = mp.getVideoHeight(); //Get the width of the screen int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); //Get the SurfaceView layout parameters android.view.ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams(); //Set the width of the SurfaceView to the width of the screen lp.width = screenWidth; //Set the height of the SurfaceView to match the aspect ratio of the video //be sure to cast these as floats otherwise the calculation will likely be 0 lp.height = (int) (((float)videoHeight / (float)videoWidth) * (float)screenWidth); //Commit the layout parameters mSurfaceView.setLayoutParams(lp); //Start video mp.setDisplay(holder); mp.start(); } 
 /** * Created by zoid23 on 05/10/15. */ public class IntroVideoSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = "INTRO_SF_VIDEO_CALLBACK"; private MediaPlayer mp; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public IntroVideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public IntroVideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public IntroVideoSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public IntroVideoSurfaceView(Context context) { super(context); init(); } private void init (){ mp = new MediaPlayer(); getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.intro); try { mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); mp.prepare(); } catch (IOException e) { e.printStackTrace(); } int videoWidth = mp.getVideoWidth(); int videoHeight = mp.getVideoHeight(); int screenHeight = getHeight(); android.view.ViewGroup.LayoutParams lp = getLayoutParams(); lp.height = screenHeight; lp.width = (int) (((float)videoWidth / (float)videoHeight) * (float)screenHeight); setLayoutParams(lp); mp.setDisplay(getHolder()); mp.setLooping(true); mp.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mp.stop(); } } 

Используйте IntroVideoSurfaceView на вашем xml и поместите свое видео в raw/intro.mp4

Полная версия модифицированной версии luigi23, позволяющая избежать некоторых сбоев.

 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

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

   

Создать файл IntroVideoSurfaceView.java

 import android.annotation.TargetApi; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.media.MediaPlayer; import android.os.Build; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; public class IntroVideoSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private MediaPlayer mp; private boolean has_started = false; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public IntroVideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public IntroVideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public IntroVideoSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public IntroVideoSurfaceView(Context context) { super(context); init(); } private void init() { mp = new MediaPlayer(); getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.slideshow); try { if (!has_started) { has_started = true; mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); } mp.prepare(); android.view.ViewGroup.LayoutParams lp = getLayoutParams(); lp.height = getHeight(); lp.width = getWidth(); setLayoutParams(lp); mp.setDisplay(getHolder()); mp.setLooping(true); mp.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mp.stop(); } } 

добавьте «slideshow.mp4» в ресурсы / raw

измените activity_main.xml с помощью

      

Некоторые заметки.

Добавление видео сделает ваш apk огромным, поэтому вы можете избежать этого … Время от времени неизвестные сбои происходят даже на телефонах с высоким разрешением (галактика s6). Важно, чтобы файл был небольшим.

Я использовал этот код для воспроизведения видео по поверхности

 public class VideoPlayOnSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private MediaPlayer mediaPlayer; private boolean has_started = false; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public VideoPlayOnSurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public VideoPlayOnSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public VideoPlayOnSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public VideoPlayOnSurfaceView(Context context) { super(context); init(); } private void init() { mediaPlayer = new MediaPlayer(); getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.small); try { if (!has_started) { has_started = true; mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); } mediaPlayer.prepare(); android.view.ViewGroup.LayoutParams lp = getLayoutParams(); lp.height = getHeight(); lp.width = getWidth(); setLayoutParams(lp); mediaPlayer.setDisplay(holder); mediaPlayer.setLooping(true); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.stop(); } } 

xml-файл

     

Я смог получить эту работу с комбинацией из вышеперечисленного и следующих двух других сообщений:

Исправлено предупреждение о сбое Android-плеера: состояние 0x1

Как подключить MediaPlayer с SurfaceView в Android?

я использовал

 AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.file_name); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); 

вместо

  Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.your_raw_file); 

И используйте нижеприведенный код для настройки медиаплеера.

 MediaPlayer mp = new MediaPlayer(); SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.video_surface); SurfaceHolder holder = mSurfaceView.getHolder(); holder.addCallback(this); 
  • Android: макет xml для списка с различными элементами
  • Android-декодер-> декодирование возвращено false для Bitmap download
  • Изменение формы уведомления
  • Увеличить расстояние между текстом и заголовком по оси y
  • Как извлечь текст из выбранного элемента в listView
  • Android: Как сделать все элементы внутри LinearLayout того же размера?
  • getSize () дает мне ошибки
  • Разметка Android сломана с фоном 9 патчей
  • как читать значение из string.xml в android?
  • Ошибка раздувания fragmentа classа
  • Сдвиньте макет снизу экрана
  • Давайте будем гением компьютера.