Отображение видео на дополнительном экране с использованием Android Presentation Class

Я разрабатываю приложение, где одна из функций состоит в том, чтобы иметь две кнопки, при касании которых одно из двух локально сохраненных видео будет отображаться на дополнительном мониторе в полноэкранном режиме. Монитор подключен напрямую кабелем HDMI, так как планшет, который я использую, имеет выходной порт HDMI. Нет необходимости управлять воспроизведением видео с поиском или остановкой. Видео может просто начаться заново (перейти к 0) при повторном нажатии кнопки. Если пользователь воспроизводит видео1 и нажимает кнопку видео2, предполагается, что видео1 немедленно остановится и начнется видео2.

Текущая реализация (заглушка которой приведена ниже) в основном работает так, как предполагалось. Когда я впервые подключаю дополнительный дисплей, запускаю приложение и нажимаю любую кнопку, связанное видео начинает воспроизводиться в VideoView. Если я нажму кнопку еще раз или нажму другую кнопку, связанное видео начнет воспроизводиться с самого начала.

Ошибка, с которой я сталкиваюсь, возникает, когда Я выхожу из приложения либо с помощью кнопки "Назад", либо если я запускаю приложение в фоновом режиме с помощью кнопки обзора, либо если я выхожу из приложения, проводя пальцем по нему в обзоре приложения. В следующий раз, когда я открываю приложение и нажимаю одну из кнопок видео, на моем дополнительном дисплее ничего не происходит. Он просто остается зеркалом основного дисплея моего планшета. Если я отсоединяю и снова подключаю свой дополнительный дисплей, даже когда приложение открыто, кнопки начинают работать как положено. Это наводит меня на мысль, что я неправильно очищаю Presentation, 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;
        }
    }
}

Вы решили эту проблему?

c-an 03.07.2020 05:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
854
0

Другие вопросы по теме