2017-04-24 182 views
0

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

@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; 
 
     } 
 
    }

+0

让我们看看您的代码 –

+0

@SurajMakhija:我发布了关于AdapterRecyclerView的代码。 –

回答

0

这里有意向的完整代码从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); 

我希望它会帮助你。

+1

非常感谢。但是,如果我想列出所有视频在Android的外部存储,我如何将它导入到RecyclerView和滚动,控制暂停的状态,通过使用TextureView停止或我必须使用别的东西? –

+0

你可以按照这个链接:http://stackoverflow.com/questions/30978030/playing-video-using-textureview-in-recyclerview –

+0

哦,男人。非常感谢你。祝你最好。 –