Я разрабатываю приложение, в котором одна из функций состоит в том, чтобы иметь две кнопки, которые при касании отображали бы одно из двух локально сохраненных видео на дополнительном мониторе в полноэкранном режиме.Монитор подключается напрямую через кабель HDMI, так как у используемого планшета есть порт HDMI-выхода.Нет необходимости управлять воспроизведением видео при поиске или остановке.Видео может просто начаться заново (поиск 0) при повторном нажатии кнопки.Если пользователь воспроизводит video1 и нажимает кнопку video2, предполагается, что video1 немедленно остановится и начнется video2.
Текущая реализация (с заглушкой, включенной ниже) в основном работает как задумано.Когда я впервые подключаю дополнительный дисплей, запускаю приложение и нажимаю любую кнопку, и соответствующее видео начинает воспроизводиться в VideoView.Если я нажимаю кнопку еще раз или нажимаю другую кнопку, соответствующее видео начинает воспроизводиться с самого начала.
Ошибка, с которой я сталкиваюсь, возникает, когда Я либо выхожу из приложения, используя кнопку возврата, если я создаю фоновое изображение приложения, используя кнопку обзора, или если я выхожу из приложения, проводя его в обзоре приложения.В следующий раз, когда я открою приложение и нажму одну из кнопок видео, на моем дополнительном дисплее ничего не происходит.Он просто остается зеркалом основного дисплея моего планшета.Если я отсоединяю и снова присоединяю свой дополнительный дисплей, даже когда приложение открыто, кнопки начинают работать как положено.Это заставляет меня поверить, что я не очищаю должным образом ни презентацию, ни MediaRouter, ни VideoView после приостановки или остановки приложения.Любая помощь будет принята с благодарностью.Если добавление основного кода активности поможет, дайте мне знать.
import android.content.res.Resources;
import android.media.MediaPlayer;
import android.media.MediaRouter;
import android.content.Context;
import android.app.Presentation;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.MotionEvent;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
import android.util.Log;
import java.util.ArrayList;
import java.util.Map;
public class GuiFragment extends Fragment{
private MediaRouter mMediaRouter;
private VideoPresentation mPresentation;
public GuiFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.e("GuiFragment", "onCreate");
super.onCreate(savedInstanceState);
// Get the media router service.
mMediaRouter = (MediaRouter) getActivity().getSystemService(Context.MEDIA_ROUTER_SERVICE);
}
@Override
public void onPause() {
Log.e("GuiFragment", "onPause");
// Be sure to call the super class.
super.onPause();
// Dismiss the presentation when the activity is not visible.
stopVideo();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.e("GuiFragment", "onCreateView");
View rootView = inflater.inflate(R.layout.fragment_connection_gui, container, false);
// Initialize Button objects
Button video1Button = (Button) rootView.findViewById(R.id.vid1_button);
Button video2Button = (Button) rootView.findViewById(R.id.vid2_button);
video1Button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_UP:
Log.e("GuiFragment", "video1 button event");
int duration = Toast.LENGTH_SHORT;
MediaRouter.RouteInfo route = mMediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Log.e("GuiFragment", "Obtained Video Media Route");
Display presentationDisplay = route.getPresentationDisplay();
if (presentationDisplay != null) {
Log.e("GuiFragment", "Obtained Presentation Display, Presenting Video");
//if (mPresentation == null)
//{
Log.e("GuiFragment", "Video1: No presentation, create a new one");
mPresentation = new VideoPresentation(getActivity(), presentationDisplay,
Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.bigbuckbunny));
mPresentation.show();
//}
//else
//{
// Log.e("GuiFragment", "Video1: Presentation exists, update URI");
// mPresentation.stopVideoView();
// mPresentation.updateVideo(Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.bigbuckbunny));
//}
}
else {
Toast toast = Toast.makeText(getActivity(), "No Display", duration);
toast.show();
}
}
else {
Toast toast = Toast.makeText(getActivity(), "No MediaRouter", duration);
toast.show();
}
break;
default:
break;
}
/* This causes onClick not to be called. You would need it for accessibility options
but we don't really care about that in this app */
return true;
}
});
video2Button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_UP:
Log.e("GuiFragment", "video2 button event");
int duration = Toast.LENGTH_SHORT;
MediaRouter.RouteInfo route = mMediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Log.e("GuiFragment", "Obtained Video Media Route");
Display presentationDisplay = route.getPresentationDisplay();
if (presentationDisplay != null) {
Log.e("GuiFragment", "Obtained Presentation Display, Presenting Video");
//if (mPresentation == null)
//{
Log.e("GuiFragment", "Video2: No presentation, create a new one");
mPresentation = new VideoPresentation(getActivity(), presentationDisplay,
Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.bigbuckbunny));
mPresentation.show();
//}
//else
//{
// Log.e("GuiFragment", "Video2: Presentation exists, update URI");
// mPresentation.stopVideoView();
// mPresentation.updateVideo(Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.bigbuckbunny));
//}
}
else {
Toast toast = Toast.makeText(getActivity(), "No Display", duration);
toast.show();
}
}
else {
Toast toast = Toast.makeText(getActivity(), "No MediaRouter", duration);
toast.show();
}
break;
default:
break;
}
/* This causes onClick not to be called. You would need it for accessibility options
but we don't really care about that in this app */
return true;
}
});
// Inflate the layout for this fragment
return rootView;
}
private void stopVideo() {
Log.e("GuiFragment", "stopVideo()");
if (mPresentation != null) {
Log.e("GuiFragment", "Stopping video1 playback");
mPresentation.stopVideoView();
mPresentation.dismiss();
mPresentation = null;
}
}
private final static class VideoPresentation extends Presentation {
VideoView mVideoView;
Context mContext;
Uri mVideo;
public VideoPresentation(Context context, Display display, Uri video) {
super(context, display);
mContext = context;
mVideo = video;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("VideoPresentation", "onCreate");
// Be sure to call the super class.
super.onCreate(savedInstanceState);
// Get the resources for the context of the presentation.
// Notice that we are getting the resources from the context of the presentation.
Resources r = getContext().getResources();
// Inflate the layout.
setContentView(R.layout.presentation_with_media_router_activity);
mVideoView = (VideoView) findViewById(R.id.video_view);
mVideoView.requestFocus();
mVideoView.setVideoURI(mVideo);
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mediaPlayer) {
mVideoView.start();
}
});
}
@Override
protected void onStart() {
Log.e("VideoPresentation", "onStart");
// Be sure to call the super class.
super.onStart();
}
@Override
protected void onStop() {
Log.e("VideoPresentation", "onStop");
// Be sure to call the super class.
super.onStop();
}
@Override
public void onDetachedFromWindow() {
Log.e("VideoPresentation", "onDetachedFromWindow");
// Be sure to call the super class.
super.onDetachedFromWindow();
}
public void stopVideoView() {
mVideoView.stopPlayback();
}
public void updateVideo(Uri video) {
mVideo = video;
mVideoView.requestFocus();
mVideoView.setVideoURI(mVideo);
}
public VideoView getVideoView() {
return mVideoView;
}
}
}