无法以编程方式从 android 中的外部存储中删除文件
can't delete file from external storage in android programmatically
我正在尝试删除位于路径
的文件
/storage/714D-160A/Xender/image/Screenshot_commando.png
到目前为止我做了什么:
try{
String d_path = "/storage/714D-160A/Xender/image/Screenshot_commando.png";
File file = new File(d_path);
file.delete();
}catch(Exception e){
e.printStackTrace();
}
文件仍在原处(未删除 :( )
此外,我已在清单文件中授予权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
使用Environment.getExternalStorageDirectory().getAbsolutePath()
代替硬编码存储路径
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png");
boolean d = f.delete();
public static boolean delete(final Context context, final File file) {
final String where = MediaStore.MediaColumns.DATA + "=?";
final String[] selectionArgs = new String[] {
file.getAbsolutePath()
};
final ContentResolver contentResolver = context.getContentResolver();
final Uri filesUri = MediaStore.Files.getContentUri("external");
contentResolver.delete(filesUri, where, selectionArgs);
if (file.exists()) {
contentResolver.delete(filesUri, where, selectionArgs);
}
return !file.exists();
}
使用ContentResolver
删除媒体文件是错误的,会给用户带来很多问题。
您无法删除 sd-card
上的文件,只需从高于 Jelly Bean(4.3)
.
的 Android 版本的 ContentResolver
中删除其信息即可
它仅适用于 KitKat(4.4)
.
之前的 Android 版本
这就是 Android 团队提供 DocumentProvider 的原因。
为什么contentResolver.delete(...)
是错误的?
1。填写 sd-card
当您尝试通过 ContentResolver
在 Android 大于 4.3 的版本上删除 sd-card
上的媒体文件时,实际的媒体文件将保持不变,因为 contentResolver.delete(...)
方法只会删除媒体的信息(名称、日期、路径...),您最终将在 sd-card
上拥有未注册的媒体文件,ContentResolver
不再知道它们的存在,这就是为什么您不能'在您的画廊中看不到它们,并且您认为它们已经被这种方法删除,而它们仍然存在并且每次用户尝试删除 sd-card
上的媒体文件时都会填满 sd-card
。
2。媒体文件(图片、视频、gif ...)将返回到图库
有许多应用程序,尤其是图库和文件管理器,它们会找到这些未注册的媒体文件,并会像正常行为一样将它们再次添加到 ContentResolver
,而用户认为 his/her 不需要的媒体文件已经消失.
当然,没有用户希望 his/her 假设已删除的图像或视频出现在演示过程中。
那么,删除 sd-card
上的媒体文件的正确方法是什么?
好吧,这已经通过使用 DocumentProvider
.
得到了回答 here
从Android4.4开始,您无法使用正常方式写入SD卡文件(App目录除外)。为此,您必须使用 DocumentFile
的存储访问框架。
以下代码适用于我:
private void deletefile(Uri uri, String filename) {
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, uri);
DocumentFile file = pickedDir.findFile(filename);
if(file.delete())
Log.d("Log ID", "Delete successful");
else
Log.d("Log ID", "Delete unsuccessful");
}
其中filename
是要删除的文件名,uri
是ACTION_OPEN_DOCUMENT_TREE
返回的URI:
private static final int LOCATION_REQUEST = 1;
private void choosePath() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(intent, LOCATION_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == LOCATION_REQUEST && resultCode == Activity.RESULT_OK) {
if (resultData != null) {
Uri uri = resultData.getData();
if (uri != null) {
/* Got the path uri */
}
}
}
}
我正在尝试删除位于路径
的文件/storage/714D-160A/Xender/image/Screenshot_commando.png
到目前为止我做了什么:
try{
String d_path = "/storage/714D-160A/Xender/image/Screenshot_commando.png";
File file = new File(d_path);
file.delete();
}catch(Exception e){
e.printStackTrace();
}
文件仍在原处(未删除 :( )
此外,我已在清单文件中授予权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
使用Environment.getExternalStorageDirectory().getAbsolutePath()
代替硬编码存储路径
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png");
boolean d = f.delete();
public static boolean delete(final Context context, final File file) {
final String where = MediaStore.MediaColumns.DATA + "=?";
final String[] selectionArgs = new String[] {
file.getAbsolutePath()
};
final ContentResolver contentResolver = context.getContentResolver();
final Uri filesUri = MediaStore.Files.getContentUri("external");
contentResolver.delete(filesUri, where, selectionArgs);
if (file.exists()) {
contentResolver.delete(filesUri, where, selectionArgs);
}
return !file.exists();
}
使用ContentResolver
删除媒体文件是错误的,会给用户带来很多问题。
您无法删除 sd-card
上的文件,只需从高于 Jelly Bean(4.3)
.
的 Android 版本的 ContentResolver
中删除其信息即可
它仅适用于 KitKat(4.4)
.
之前的 Android 版本
这就是 Android 团队提供 DocumentProvider 的原因。
为什么contentResolver.delete(...)
是错误的?
1。填写 sd-card
当您尝试通过 ContentResolver
在 Android 大于 4.3 的版本上删除 sd-card
上的媒体文件时,实际的媒体文件将保持不变,因为 contentResolver.delete(...)
方法只会删除媒体的信息(名称、日期、路径...),您最终将在 sd-card
上拥有未注册的媒体文件,ContentResolver
不再知道它们的存在,这就是为什么您不能'在您的画廊中看不到它们,并且您认为它们已经被这种方法删除,而它们仍然存在并且每次用户尝试删除 sd-card
上的媒体文件时都会填满 sd-card
。
2。媒体文件(图片、视频、gif ...)将返回到图库
有许多应用程序,尤其是图库和文件管理器,它们会找到这些未注册的媒体文件,并会像正常行为一样将它们再次添加到 ContentResolver
,而用户认为 his/her 不需要的媒体文件已经消失.
当然,没有用户希望 his/her 假设已删除的图像或视频出现在演示过程中。
那么,删除 sd-card
上的媒体文件的正确方法是什么?
好吧,这已经通过使用 DocumentProvider
.
从Android4.4开始,您无法使用正常方式写入SD卡文件(App目录除外)。为此,您必须使用 DocumentFile
的存储访问框架。
以下代码适用于我:
private void deletefile(Uri uri, String filename) {
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, uri);
DocumentFile file = pickedDir.findFile(filename);
if(file.delete())
Log.d("Log ID", "Delete successful");
else
Log.d("Log ID", "Delete unsuccessful");
}
其中filename
是要删除的文件名,uri
是ACTION_OPEN_DOCUMENT_TREE
返回的URI:
private static final int LOCATION_REQUEST = 1;
private void choosePath() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(intent, LOCATION_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == LOCATION_REQUEST && resultCode == Activity.RESULT_OK) {
if (resultData != null) {
Uri uri = resultData.getData();
if (uri != null) {
/* Got the path uri */
}
}
}
}