I am working on a video player app. I'm able to retrieve all folders containing video files on the phone and also I displayed the title and the duration for each video in each folders but the thumbnail for each video doesn't display.
this the model class.
package com.example.videoplayer;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.annotation.SuppressLint;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import java.util.ArrayList;
public class VideoFilesActivity extends AppCompatActivity {
RecyclerView recyclerView;
private ArrayList<MediaFiles> videoFilesArraylist = new ArrayList<>();
VideoFilesAdapter videoFilesAdapter;
String folder_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_files);
folder_name = getIntent().getStringExtra("foldername");
getSupportActionBar().setTitle(folder_name);
recyclerView = findViewById(R.id.videos_rv);
showVideoFiles();
}
private void showVideoFiles() {
videoFilesArraylist = fetchMedia(folder_name);
videoFilesAdapter = new VideoFilesAdapter(videoFilesArraylist, this);
recyclerView.setAdapter(videoFilesAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
videoFilesAdapter.notifyDataSetChanged();
}
@SuppressLint("Range")
private ArrayList<MediaFiles> fetchMedia(String folderName) {
ArrayList<MediaFiles> videoFiles = new ArrayList<>();
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Video.Media.DATA + " like?";
String [] selectionArg = new String[]{"%" + folderName + "%"};
Cursor cursor = getContentResolver().query(uri, null, selection, selectionArg, null);
if(cursor != null && cursor.moveToNext()){
do{
String id = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media._ID));
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME));
String size = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.SIZE));
String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
String dateAdded = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATE_ADDED));
MediaFiles mediaFiles = new MediaFiles(id, title, displayName, size, duration, path, dateAdded);
videoFiles.add(mediaFiles);
}while(cursor.moveToNext());
}
return videoFiles;
}
}
this is the adapter
package com.example.videoplayer;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.io.File;
import java.util.ArrayList;
public class VideoFilesAdapter extends RecyclerView.Adapter<VideoFilesAdapter.ViewHolder> {
private ArrayList<MediaFiles> videoList;
private Context context;
public VideoFilesAdapter(ArrayList<MediaFiles> videoList, Context context) {
this.videoList = videoList;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.video_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.videoName.setText(videoList.get(position).getDisplayName());
String size = videoList.get(position).getSize();
holder.videoSize.setText(android.text.format.Formatter.formatFileSize(context, Long.parseLong(size)));
//Video duration in milliseconds
double videoDuration_in_ms = Double.parseDouble(videoList.get(position).getDuration());
holder.videoDuration.setText(timeConversion((long) videoDuration_in_ms));
// Getting the thumbnail
Glide.with(context).load(new File(videoList.get(position).getPath())).into(holder.thumbnail);
holder.menu_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Menu more", Toast.LENGTH_LONG).show();
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, VideoPlayerActivity.class);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return videoList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView thumbnail;
ImageView menu_more;
TextView videoName;
TextView videoSize;
TextView videoDuration;
public ViewHolder(@NonNull View itemView) {
super(itemView);
thumbnail = itemView.findViewById(R.id.thumbnail);
menu_more = itemView.findViewById(R.id.video_menu_more);
videoName = itemView.findViewById(R.id.video_name);
videoSize = itemView.findViewById(R.id.video_size);
videoDuration = itemView.findViewById(R.id.video_duration);
}
}
//Convert from millisecond to minute and second
public String timeConversion(long value){
String videoTime;
int duration = (int) value;
//convert milliseonds to hour
int hours = (duration/3600000);
//convert milliseonds to minutes
int minutes = (duration/60000) % 60000;
//convert milliseonds to seconds
int seconds = (duration % 60000) / 60000;
if(hours > 0){
videoTime = String.format("%02d:%02d:%02d", hours, minutes, seconds);
} else {
videoTime = String.format("%02d:%02d", minutes, seconds);
}
return videoTime;
}
}
this is the MediaFiles class
package com.example.videoplayer;
public class MediaFiles {
private String id;
private String title;
private String displayName;
private String size;
private String duration;
private String path;
private String dateAdded;
public MediaFiles(String id, String title, String displayName, String size, String duration, String path, String dateAdded) {
this.id = id;
this.title = title;
this.displayName = displayName;
this.size = size;
this.duration = duration;
this.path = path;
this.dateAdded = dateAdded;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getDateAdded() {
return dateAdded;
}
public void setDateAdded(String dateAdded) {
this.dateAdded = dateAdded;
}
}
I looked for some solutions and I found that one possible solution is to downgrade my targetSdk and compileSdk version. But it still does not appear.