英文:
Delete a file in Android when you have a path of form `/storage/1018-2710/Pictures/oLvCVPZrNxk.jpg`
问题
我正在尝试从Android外部存储中删除文件,问题是,我已经尝试多次以多种不同的方式获取路径。使用MediaStore Api,我已经非常接近了,但是无法弄清楚如何做到这一点。
我无法获取EXTERNAL_URI
,因为投影需要字符串,而MediaStore上的EXTERNAL_URI
返回的是URI而不是字符串。
这是我加载图像的方式,GalleryImage类只包含文件路径/storage/1018-2710/Pictures/oLvCVPZrNxk.jpg
,以及一些处理选择的布尔值。我尝试添加外部URI,但未能成功。
public class ImageLoader {
public ArrayList<GalleryImage> getAllShownImagesPath(Context context) {
Uri uri;
Cursor cursor;
int column_index_data, column_index_folder_name, column_index_content_uri;
ArrayList<GalleryImage> listOfAllImages = new ArrayList<GalleryImage>();
String absolutePathOfImage = null;
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaStore.MediaColumns.DATA,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
};
cursor = context.getContentResolver().query(uri, projection, null,
null, null);
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
column_index_folder_name = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(column_index_data);
// String externalURI = cursor.getString();
String externalURI = ""; //empty, beacuse I couldnt get it to work...
listOfAllImages.add(new GalleryImage(false, false , absolutePathOfImage, externalURI));
}
cursor.close();
return listOfAllImages;
}
}
这是我在片段中尝试删除图像的地方
if(item.getItemId() == R.id.delete_selected){
//Uri root = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String root = Environment.getExternalStorageDirectory().toString();
for(GalleryImage i : mViewModel.selectedImages){
File file = new File(root + i.getmImageUrl());
if (file.exists()) {
if (file.delete()) {
System.out.println("file Deleted :" + file.getPath());
} else {
System.out.println("file not Deleted :" + file.getPath());
}
}
}
}
我尝试了4、5种不同的组合,但似乎没有一个有效,我试图获取图像的正确路径,我看到可能使用EXTERNAL_URI
可能是一种方法,但我不知道如何将其放入我的GalleryImage中。非常感谢您的帮助!
英文:
So I am trying to delete a file from Android External storage, the problem is, I've tried getting the path multiple times in multiple different ways. Using MediaStore Api I've come really close but cannot figure out how to do it.
I cannot get the EXTERNAL_URI
because the projection requires Strings and EXTERNAL_URI
on MediaStore returns a URI not a String.
This is how I load images, the GalleryImage class just contains, file path /storage/1018-2710/Pictures/oLvCVPZrNxk.jpg
, and some booleans to handle selection. I tried adding external URI but failed to do so.
public class ImageLoader {
public ArrayList<GalleryImage> getAllShownImagesPath(Context context) {
Uri uri;
Cursor cursor;
int column_index_data, column_index_folder_name, column_index_content_uri;
ArrayList<GalleryImage> listOfAllImages = new ArrayList<GalleryImage>();
String absolutePathOfImage = null;
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaStore.MediaColumns.DATA,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
};
cursor = context.getContentResolver().query(uri, projection, null,
null, null);
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
column_index_folder_name = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(column_index_data);
// String externalURI = cursor.getString();
String externalURI = ""; //empty, beacuse I couldnt get it to work...
listOfAllImages.add(new GalleryImage(false, false , absolutePathOfImage, externalURI));
}
cursor.close();
return listOfAllImages;
}
}
And here in my fragment is where I am trying to delete the Images
if(item.getItemId() == R.id.delete_selected){
//Uri root = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String root = Environment.getExternalStorageDirectory().toString();
for(GalleryImage i : mViewModel.selectedImages){
File file = new File(root + i.getmImageUrl());
if (file.exists()) {
if (file.delete()) {
System.out.println("file Deleted :" + file.getPath());
} else {
System.out.println("file not Deleted :" + file.getPath());
}
}
}
}
I tried like 4,5 different combinations but none of which seemed to work, I am trying to get the proper Path of the image, I saw that maybe using the EXTERNAL_URI
would be the way to go but I don't know how to get it into my GalleryImage. Any help is appreciated!
答案1
得分: 1
public void deleteSelectedImages(){
for(GalleryImage img : selectedImages){
File file = new File(img.getmImageUrl());
if(!file.exists()) {
return;
}
String canonicalPath;
ContentResolver contentResolver = getApplication().getContentResolver();
try {
canonicalPath = file.getCanonicalPath();
} catch (IOException e) {
canonicalPath = file.getAbsolutePath();
}
final Uri uri = MediaStore.Files.getContentUri("external");
final int result = contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA + "=?", new String[]{canonicalPath});
if (result == 0) {
final String absolutePath = file.getAbsolutePath();
if (!absolutePath.equals(canonicalPath)) {
contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
}
}
images.remove(img);
}
imagesLiveData.setValue(images);
selectedImages.clear();
Toast.makeText(getApplication().getApplicationContext(), "Succesfully deleted image(s)", Toast.LENGTH_SHORT).show();
}
英文:
public void deleteSelectedImages(){
for(GalleryImage img : selectedImages){
File file = new File(img.getmImageUrl());
if(!file.exists()) {
return;
}
String canonicalPath;
ContentResolver contentResolver = getApplication().getContentResolver();
try {
canonicalPath = file.getCanonicalPath();
} catch (IOException e) {
canonicalPath = file.getAbsolutePath();
}
final Uri uri = MediaStore.Files.getContentUri("external");
final int result = contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA + "=?", new String[]{canonicalPath});
if (result == 0) {
final String absolutePath = file.getAbsolutePath();
if (!absolutePath.equals(canonicalPath)) {
contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
}
}
images.remove(img);
}
imagesLiveData.setValue(images);
selectedImages.clear();
Toast.makeText(getApplication().getApplicationContext(), "Succesfully deleted image(s)", Toast.LENGTH_SHORT).show();
}
Hopefully it will help someone
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论