我正在尝试从SD卡中删除通过移动应用程序保存的图像。
我正在使用xamarin形式的contentresolver.Delete通过它临时删除图像。
在sd卡中,图像详细信息路径不同,并且在文件管理器中,用于sd卡的图像保存在其他路径中。
如果我使用
File.delete(file)
它抛出一个异常,说我无权删除该位置(SD卡映像路径)中的文件
以下是在Android清单中添加的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
找到SD卡路径的代码:
var file1 = new Java.IO.File("storage/");
listOfStorages = file1.ListFiles();
if (listOfStorages[1].Name.Contains("emulated") || listOfStorages[0].Name.Contains("-"))
{
isSDPresent = true;
var sdfilepath = listOfStorages[0].AbsolutePath + "/DCIM/Camera/";
bool status = Android.OS.Environment.IsExternalStorageEmulated;
List<string> sdimagelist = Directory.GetFiles(sdfilepath).Where(x => new FileInfo(x).CreationTime.Date == DateTime.Today.Date).ToList();
foreach (var filpath in sdimagelist)
{
if (!currentDCIMImagesList.Contains(filpath))
{
currentDCIMImagesList.Add(filpath);
}
}
}
从SD卡删除图像的代码:
var query = afterDCIMImagesList.Where(item => !currentDCIMImagesList.Contains(item));
foreach (string file in query)
{
Java.IO.File aFile = new Java.IO.File(file);
string where = MediaStore.MediaColumns.Data + "=?";
string[] selectionArgs = new string[] { aFile.AbsolutePath };
ContentResolver contentResolver = context.ContentResolver;
Android.Net.Uri filesUri = MediaStore.Files.GetContentUri("external");
if (aFile.Exists())
{
//Android.Net.Uri uri = Android.Net.Uri.Parse(file);
//contentResolver.Delete(uri, null, null);
contentResolver.Delete(filesUri, where, selectionArgs);
}
[请帮助我解决此问题。谢谢
首先,请不要使用contentresolver
删除图像。因此,您可以引用此线程。
https://stackoverflow.com/a/45406158/10627299
请尝试使用以下方法再次检查权限。要在Api 23或更高版本中删除文件之前。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Support.V4.App;
using Android.Views;
using Android.Widget;
namespace DeleteFile.Droid
{
class PermisionUtils
{
// Storage Permissions
private static int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.Permission.ReadExternalStorage,
Manifest.Permission.WriteExternalStorage};
/**
* Checks if the app has permission to write to device storage
* If the app does not has permission then the user will be prompted to
* grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity)
{
// Check if we have write permission
Permission permission = ActivityCompat.CheckSelfPermission(activity,
Manifest.Permission.WriteExternalStorage);
if (permission != Android.Content.PM.Permission.Granted)
{
// We don't have permission so prompt the user
ActivityCompat.RequestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}
}
}
[Any of the standard C# APIs can be used to delete a file from external storage,例如System.IO.File.Delete
System.IO.File.Delete("/storage/emulated/0/Android/data/com.companyname.app/files/count.txt");