【问题标题】:Play Local Video Android播放本地视频 Android
【发布时间】:2017-04-24 06:18:14
【问题描述】:

如何将本地externalStorageDirectory的所有视频路径(不是来自互联网的链接)嵌入RecyclerView并在单击playButton时播放。 我试过但没有显示一些东西并播放。谢谢大家。 这是我的代码:

@Override
    public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item, parent, false);
        return new VideoViewHolder(view);
    }

    @Override
    public void onBindViewHolder(VideoViewHolder holder, int position) {
        holder.videoUrl = videos.get(position);
        holder.imageLoaderProgressBar.setVisibility(View.INVISIBLE);
        holder.videoImageView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onViewRecycled(VideoViewHolder holder) {
        if (holder == currentVideoViewHolder) {
            holder.stopVideo();
        }
        holder.videoView.stopPlayback();
        super.onViewRecycled(holder);

    }

    @Override
    public int getItemCount() {
        return videos.size();
    }
    VideoViewHolder currentVideoViewHolder;
    public void onScrolled(RecyclerView recyclerView) {
        if (currentVideoViewHolder != null) {
            currentVideoViewHolder.onScrolled(recyclerView);
        }
    }

    

    class VideoViewHolder extends RecyclerView.ViewHolder {
       //find R.id.controls for each controls. : button, progressbar, videoview.
        String videopath;

        public String getVideoUrl() {
            return videopath;
        }

        public VideoViewHolder(View view) {
            super(view);
            videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(final MediaPlayer mp) {
                    int width = mp.getVideoWidth();
                    int height = mp.getVideoHeight();
                    videoView.setIsPrepared(true);
                    UIUtils.resizeView(videoView, UIUtils.getScreenWidth(getActivity()), UIUtils.getScreenWidth(getActivity()) * height / width);
                    if (currentVideoViewHolder == VideoViewHolder.this) {
                        videoImageView.setVisibility(View.GONE);
                        imageLoaderProgressBar.setVisibility(View.INVISIBLE);
                        videoView.setVisibility(View.VISIBLE);
                        videoView.seekTo(0);
                        videoView.start();
                    }
                }
            });
            videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    return false;
                }
            });
            
            videoPlayImageButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (currentVideoViewHolder != null ) {
                        currentVideoViewHolder.videoView.pause();

                        if (currentVideoViewHolder.videoView.getVisibility() == View.VISIBLE)                           currentVideoViewHolder.videoView.setVisibility(View.INVISIBLE);

                        currentVideoViewHolder = null;
                    }
                    currentVideoViewHolder = VideoViewHolder.this;
                    if (!getVideoUrl().equals(videoView.getVideoPath())) {
                        videoView.setIsPrepared(false);
                        videoView.setVideoPath(getVideoUrl());
                        videoView.requestFocus();
                    } else {
                        if (videoView.isPrepared()) {
                            imageLoaderProgressBar.setVisibility(View.INVISIBLE);
                        } else {
                            imageLoaderProgressBar.setVisibility(View.VISIBLE);
                        }
                        videoView.requestFocus();
                        videoView.seekTo(0);
                        videoView.start();
                    }
                }
            });

        }

        public void stopVideo() {
            videoView.pause();
        }

        public void onScrolled(RecyclerView recyclerView) {
            if (isViewNotVisible(videoPlayImageButton, recyclerView)) {
                stopVideo();
            }
        }

        public boolean isViewNotVisible(View view, RecyclerView recyclerView) {
            Rect scrollBounds = new Rect();
            recyclerView.getHitRect(scrollBounds);
            return view.getVisibility() == View.VISIBLE;
        }
    }

【问题讨论】:

  • 向我们展示您的代码
  • @SurajMakhija:我已经发布了关于 AdapterRecyclerView 的代码。

标签: android android-recyclerview android-videoview


【解决方案1】:

这是从 android 内部存储播放 mp4 视频的完整意图代码:

File mydir = activity.getDir("Videos", Context.MODE_PRIVATE);
File fileWithinMyDir = new File(mydir, headingsList.get(mPosition));
fileWithinMyDir.setReadable(true, false);
String videoResource = fileWithinMyDir.getPath();
Uri intentUri = Uri.fromFile(new File(videoResource));

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(intentUri, "video/mp4");
startActivity(intent);

希望对你有帮助。

【讨论】:

  • 非常感谢。但是如果我想列出android外部存储中的所有视频,我该如何将它导入RecyclerView并滚动,控制暂停状态,使用TextureView停止或者我必须使用其他东西?
  • 您可以点击此链接:stackoverflow.com/questions/30978030/…
  • 哦,伙计们。非常感谢h。祝你一切顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2012-12-21
  • 2017-04-20
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多