如何删除从移动应用存储到Android设备中SD卡的图像

问题描述 投票:0回答:1

我正在尝试从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);
                }

[请帮助我解决此问题。谢谢

android xamarin.forms android-sdcard
1个回答
0
投票

首先,请不要使用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");

© www.soinside.com 2019 - 2024. All rights reserved.