почему медиаплеер воспроизводит мое видео только один раз? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть приложение android, которое загружает контент с сайта https.Это происходит в моем FullImageActivity, который получает мой контент (изображения и видео), и я вижу, что мой контент отображается на экране как thumbnails .Когда я нажимаю на изображения и / или видео, это приводит меня к FullImageFragment.Я использую последний Glide 4.9.0 для отображения моего контента в полном размере (что работает, кстати).

Однако, когда я играю видео, оно работает, но оно воспроизводит каждое видео только один раз!Это происходит, когда я нажимаю на стрелку назад, чтобы вернуться к миниатюрам, а затем нажимаю на видео, чтобы воспроизвести его снова, и оно не будет воспроизводиться!

Это то, что я получаю в своем журнале консоли, когда нажимаю на кнопку «Назад» телефона:

W/MediaPlayer: mediaplayer went away with unhandled events
    mediaplayer went away with unhandled events

Вот как я загружаю свои изображения и видео в мой FullImageFragment :

    import ...
    public class FullImageFragment
    extends Fragment {
     //region members variables
     private SelectedItem mCurrentItem = null; //The selected item
     private VideoView mVideoView;
     private MediaController mediaController;
     private TextView mLoadingView;
     private ImageButton mPlayButton;

     private void FullImageFragment()
     {
         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
            if (getArguments() != null)
                mCurrentItem = (SelectedItem) getArguments().getSerializable(AP_ITEM_ARG);

            ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.switcherimage, container, false);

            // region Initialize global views
            this.mImage = rootView.findViewById(R.id.switchimageview);
            this.mVideoView = rootView.findViewById(R.id.switcherWebView);
            this.mLoadingView = rootView.findViewById(R.id.loading_view);
            this.mPlayButton = rootView.findViewById(R.id.play_button);
            //endregion

            mLoadingView.setVisibility(View.GONE);

            Glide.with(rootView.getContext())
                    .asBitmap()
                    .load(FooData.getPreUrl(getActivity()) + mCurrentItem.getmWebSize())
                    .into(new BitmapImageViewTarget(mImage) {
                        @Override
                        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                            super.onResourceReady(resource, transition);
                            mImage.setImageBitmap(resource);
                            mImage.setZoom(1);
                        }
                    });

            if (mCurrentItem.getmDownloadLink().endsWith(".mp4")) {
                //region play video function
                mPlayButton.setVisibility(View.VISIBLE);
                mPlayButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        setVideoPlayerView();
                    }
                });
            } 
            else 
            {
                mVideoView.setVisibility(View.INVISIBLE);
                mLoadingView.setVisibility(View.GONE);
                mPlayButton.setVisibility(View.GONE);
            }
            return rootView;
        }
     }
    private void setVideoPlayerView() {
            int SDK_INT = android.os.Build.VERSION.SDK_INT;

            if (SDK_INT > 8) {

                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                        .permitAll().build();
                StrictMode.setThreadPolicy(policy);

            }

            this.mPlayButton.setVisibility(View.GONE);
            mLoadingView.setVisibility(View.VISIBLE);
            mImage.setVisibility(View.GONE);
            mVideoView.setVisibility(View.VISIBLE);

            mVideoView.requestFocus();
            mVideoView.bringToFront();

            // enable callbacks from MediaButtons and TransportControls
            mediaController = new MediaController(getActivity());
            mediaController.setBackgroundColor(getResources().getColor(R.color.transparent));
            mediaController.setAnchorView(mVideoView);

            String url = mCurrentItem.getmDownloadLink()
                            .replace(" ", "%20")
                    .replace("\\", "/")
                    .replace("//", "/")
                    .replace(":/", "://");

            mVideoView.setVideoPath(url);
            //mVideoView.setVideoURI(Uri.parse(url));

            mVideoView.setZOrderOnTop(true);

            mVideoView.setMediaController(mediaController);
            mVideoView.setVisibility(View.VISIBLE);

            mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mVideoView.setZOrderOnTop(true);
                    mLoadingView.setVisibility(View.GONE);
                    mVideoView.requestFocus();

                    mp.setLooping(true);
                    mp.start();
                }
            });

            mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    AlertDialog dialog = new AlertDialog.Builder(getContext())
                            .setTitle(R.string.video_error_title)
                            .setMessage(R.string.video_error_message)
                            .setNeutralButton(R.string.action_ok, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    mLoadingView.setVisibility(View.GONE);
                                    mPlayButton.setVisibility(View.VISIBLE);

                                    mImage.setVisibility(View.VISIBLE);
                                }
                            })
                            .show();

                    return true;
                }
            });

            mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.start();
                }
            });
        }
/**
     *
     */
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart() called");
    }

    /**
     *
     */
    public void onResume() {
        Log.d(TAG, "onResume() called");
        super.onResume();
    }

    /**
     *
     */
    public void onPause() {
        Log.d(TAG, "onPause() called");
        super.onPause();
        this.viewCreated = true;

        hideVideoView();
    }

    private void hideVideoView() {
        if (mVideoView.isShown() && mVideoView.isPlaying()) {
            mVideoView.stopPlayback();
            mVideoView.suspend();
        }
    }

    @Override
    public void onStop() {
        super.onStop();

        hideVideoView();
    }
  }

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

...