Подтвердить что ты не робот

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

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

  <VideoView
    android:id="@+id/video"
    android:layout_width="320px"
    android:layout_height="240px"
    android:layout_gravity="center"
    android:background="@raw/hp"/>

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

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

        setContentView(R.layout.main);
        VideoView video=(VideoView) findViewById(R.id.video);
        video.start();
}

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

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

4b9b3361

Ответ 1

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

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
            android:id="@+id/home_container"  
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">

<SurfaceView 
        android:id="@+id/surface" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:paddingTop="10dip" />
</Framelayout>

Теперь создайте класс, подобный ниже, который может реализовать 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);
        //...
    }
}

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

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

@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();
}

Ответ 2

/**
 * 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

Ответ 3

Полная версия модифицированной версии 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);
  }
}

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

  <style name="Theme.AppCompat.Light.NoActionBar.FullScreen" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
  </style>

Создать файл 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 с помощью

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/home_container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

  <com.androidadvance.videobackground.IntroVideoSurfaceView
      android:id="@+id/surface"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      />

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Press Me"
      android:id="@+id/button"
      android:layout_gravity="center_horizontal|bottom"
      android:layout_margin="16dp"
      />
</FrameLayout>

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

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

Ответ 4

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

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 файл

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <YourPacakageName.VideoPlayOnSurfaceView
            android:id="@+id/surface"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:paddingTop="10dip" />
</FrameLayout>

Ответ 6

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

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);