问题描述
我用它来扫描 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
对象是否存在,然后继续。