如何防止使用媒体存储外部 uri 扫描路径

问题描述

我用它来扫描 android 上的所有视频文件

public class Filebrowser extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.file_browser);

        
        TextView lists = findViewById(R.id.file_managerTextView);
        
        List<File> files = getAllMediaFilesOnDevice(Filebrowser.this);
        
        for(int i=0;i<files.size();i++){
            lists.append(files.get(i).getAbsolutePath() + "\n");
        }
        
    }
    public static List<File> getAllMediaFilesOnDevice(Context context) {
        List<File> files = new ArrayList<>();
        try {
            Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,null,null);
                
            cursor.movetoFirst();
            files.clear();
            while (!cursor.isAfterLast()){
                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                int lastPoint = path.lastIndexOf(".");
                path = path.substring(0,lastPoint) + path.substring(lastPoint).toLowerCase();
                files.add(new File(path));
                cursor.movetoNext();
            }
        } catch (Exception e) {
            e.printstacktrace();
        }
        return files;
    }
}

它的工作,但问题是输出来自路径 /storage/emulated/0//sdcard 所以这个函数返回重复的文件,因为 /storage/emulated/0//sdcard 中的文件是相同的 所以,我的问题是如何防止这两条路径中的任何一条被 mediastore 扫描

解决方法

一个简单的解决方案是插入一个 if 条件:

String filepath = files.get(i).getAbsolutePath();
if(!filepath.startsWith("/sdcard"))
{
    lists.append(filepath + "\n");
}

您可以将 /sdcard 替换为 /storage/emulated/0,具体取决于您要使用的路径。警告 - 某些手机具有不同的内部存储路径,使用这 2 个中的一个可能无法正常工作。为此,您需要先检查 File 对象是否存在,然后继续。