Интеграция видеофайла в приложении 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-карты или с любой внешней папки.
Ответы
Ответ 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>
Ответ 5
Мне удалось получить эту работу с комбинацией вышеперечисленного и следующих двух других сообщений:
Ошибка подготовки к сбору Android-плеера: статус 0x1
Как подключить MediaPlayer с SurfaceView в Android?
Ответ 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);