我正在尝试删除位于该路径的文件
/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" />
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
的 Android 版本上,您无法仅通过从 ContentResolver
中删除其信息来删除 Jelly Bean(4.3)
上的文件。KitKat(4.4)
之前的 Android 版本。为什么
contentResolver.delete(...)
是错误的?sd-card
sd-card
删除 ContentResolver
上的媒体文件时,实际媒体文件将保持不变,因为 contentResolver.delete(...)
方法仅删除信息(名称、日期、路径... .) 的媒体,最终您的 sd-card
上将会有未注册的媒体文件,ContentResolver
不再知道它们的存在,这就是为什么您在图库中看不到它们并且您认为它们已被删除使用这种方法,当用户每次尝试删除 sd-card
上的媒体文件时,它们仍然存在并填充 sd-card
。
2。媒体文件(图像、视频、GIF ...)将返回图库
有许多应用程序,特别是图库和文件管理器应用程序,它们会找到这些未注册的媒体文件,并按照正常行为再次将它们添加到
ContentResolver
,而用户假设他/她不需要的媒体文件已经消失。
当然,没有用户希望他/她假设已删除的图像或视频出现在演示过程中。
那么,删除
sd-card
上的媒体文件的正确方法是什么?DocumentProvider
在这里得到了回答。
从Android 4.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 */
}
}
}
}
使用
Environment.getExternalStorageDirectory().getAbsolutePath()
代替硬编码存储路径
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png");
boolean d = f.delete();