Reputation: 1596
How to get list of video files stored in a specific folder using mediastore? currently i'm using this code
package com.example.videolisttest;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private Cursor videocursor;
private int video_column_index;
ListView videolist;
int count;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init_phone_video_grid();
}
private void init_phone_video_grid() {
System.gc();
String[] proj = { MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.SIZE };
videocursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
proj, null, null, null);
count = videocursor.getCount();
videolist = (ListView) findViewById(R.id.PhoneVideoList);
videolist.setAdapter(new VideoAdapter(getApplicationContext()));
videolist.setOnItemClickListener(videogridlistener);
}
private OnItemClickListener videogridlistener = new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position,
long id) {
System.gc();
video_column_index = videocursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
videocursor.moveToPosition(position);
String filename = videocursor.getString(video_column_index);
/* Intent intent = new Intent(MainActivity.this, ViewVideo.class);
intent.putExtra("videofilename", filename);
startActivity(intent);*/
Toast.makeText(getApplicationContext(), filename, Toast.LENGTH_SHORT).show();
}
};
public class VideoAdapter extends BaseAdapter {
private Context vContext;
public VideoAdapter(Context c) {
vContext = c;
}
public int getCount() {
return count;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
System.gc();
TextView tv = new TextView(vContext.getApplicationContext());
String id = null;
if (convertView == null) {
video_column_index = videocursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
videocursor.moveToPosition(position);
id = videocursor.getString(video_column_index);
video_column_index = videocursor
.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);
videocursor.moveToPosition(position);
id += " Size(KB):" + videocursor.getString(video_column_index);
tv.setText(id);
} else
tv = (TextView) convertView;
return tv;
}
}
}
But this method scans the whole sdcard. i want to scan a specific folder. i don't want to use the filefilter method. please share any method using mediastore.
Upvotes: 7
Views: 29945
Reputation: 31
LOAD ALL VIDEOS ON YOUR DEVICE
String[] projection = {MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DURATION};
String sortOrder = MediaStore.Video.Media.DATE_ADDED + " DESC";
Cursor cursor = getApplication().getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
projection, null, null, sortOrder);
LOAD SPECIFIC FOLDER VIDEOS ONLY
String selection=MediaStore.Video.Media.DATA +" like?";
String[] selectionArgs=new String[]{"%Videoder%"};
Cursor cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
projection,selection,selectionArgs, MediaStore.Video.Media.DATE_TAKEN + " DESC");
Upvotes: 2
Reputation: 17
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public void getVideos() {
ContentResolver contentResolver = getContentResolver();
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Video.Media.DATA +" like?";
String[] selectionArgs = new String[]{"%/" + "Download" + "/%"};
Cursor cursor = contentResolver.query(uri, null, selection, selectionArgs , null);
//looping through all rows and adding to list
if (cursor != null && cursor.moveToFirst()) {
do {
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
VideoModel videoModel = new VideoModel();
videoModel.setVideoTitle(title);
videoModel.setVideoUri(Uri.parse(data));
videoModel.setVideoDuration(timeConversion(Long.parseLong(duration)));
videoArrayList.add(videoModel);
} while (cursor.moveToNext());
}
VideoAdapter adapter = new VideoAdapter(this, videoArrayList);
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new VideoAdapter.OnItemClickListener() {
@Override
public void onItemClick(int pos, View v) {
Intent intent = new Intent(getApplicationContext(), VideoPlayActivity.class);
intent.putExtra("pos", pos);
startActivity(intent);
}
});
}
It's works perfectly For me.
Full Code https://github.com/PSOjha/PlayVideoFromSDCardFolder
Upvotes: 0
Reputation: 590
you can use this code for get videos from specific folder as:
String selection=MediaStore.Video.Media.DATA +" like?";
String[] selectionArgs=new String[]{"%FolderName%"};
videocursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
parameters, selection, selectionArgs, MediaStore.Video.Media.DATE_TAKEN + " DESC");
Its works for me like a charm.
Upvotes: 17
Reputation: 2740
private List<String> path_vid;
public void searchVid(File dir) {
String pattern = ".mp4";
//Get the listfile of that flder
final File listFile[] = dir.listFiles();
if (listFile != null) {
for (int i = 0; i < listFile.length; i++) {
final int x = i;
if (listFile[i].isDirectory()) {
walkdir(listFile[i]);
} else {
if (listFile[i].getName().endsWith(pattern)) {
// Do what ever u want, add the path of the video to the list
path_vid.add(listFile[i]);
}
}
}
}
}
This function is recursive, and search vids setting it into a list, the vids are searched from an especified folder, if u want to search vids into the sdCard, use:
File sdCard = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
//For example:
//File vidsFolder= new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Videos");
searchVid(sdCard);
if(path_vid.size()>0){
//Convert list into array
String[] array = path_vid.toArray(new String[path_vid.size()]);
//Create Adapter
ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_list_item, array);
//Set adapter to videlist
videolist.setAdapter(adapter);
}else{
//No vids found
exit();
}
Upvotes: 3