如何在安卓系统中获取特定文件夹中视频文件列表?

7
如何使用MediaStore获取存储在特定文件夹中的视频文件列表?目前,我正在使用以下代码:
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;
        }
    }
}    

但是这种方法会扫描整个sdcard。我想要扫描特定的文件夹。我不想使用filefilter方法。请分享使用mediastore的任何方法。

5个回答

16

您可以使用以下代码从特定文件夹中获取视频:

  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");

它对我来说就像一个魅力一样。


它完美地工作。兄弟,你能解释一下这些代码吗:- "like?",参数,"DESC"和"%"符号。 - Sujith S Manjavana
2
String[] parameters = { MediaStore.Video.Media._ID } 是一个用于指定参数的字符串数组,类似于 SQL 语句中的 where 子句,可以指定媒体数据的位置。Desc 表示按照最近的顺序显示在列表中。 - Deepak Jangir
但我们不能信任这个,因为它是一个搜索机制。如果您有两个几乎相同名称的目录,它将合并结果。 - Sujith S Manjavana
1
以上代码在文件夹已经通过编程方式创建的情况下无法工作。可以使用以下代码:File mediaStorageDir = new File("/storage/emulated/0/MediaRecorderLocation"); - Joyson
1
@DeepakJangir,如果文件夹是通过编程方式创建的,并且计数为0,则您的代码无法正常工作。 - Sagar
显示剩余3条评论

3
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]);
                }
            }
        }
    }
}

这个函数是递归的,它会搜索 vid 并将其放入一个列表中。vids 是从指定文件夹中搜索的,如果你想在 sdCard 中搜索 vids,请使用:

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();
}

谢谢您的回答,但我的问题是如何使用Mediastore来实现这个? - Sujith S Manjavana
这个答案可能对你有帮助:https://dev59.com/1GPVa4cB1Zd3GeqP7Jrq - Leonardo Sapuy

2

将所有视频加载到您的设备上

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);

仅加载特定文件夹中的视频

            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");
           

1
如果您知道特定的文件夹,请使用:

.getExternalFilesDir

0

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

public void getVideos() {

@要求API(api = Build.VERSION_CODES.JELLY_BEAN)

公共无返回值方法 获取视频() {

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

}

对我来说它完美地工作。

完整代码 https://github.com/PSOjha/PlayVideoFromSDCardFolder


@DavidLee 你可以查看我的Github代码库,我在那里制作了一些小的演示示例。[ https://github.com/PSOjha/PlayVideoFromSDCardFolder ] - piYush ojha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接