【问题标题】:How to delete images stored from Mobile app to SD card in android devices如何删除从移动应用程序存储到 Android 设备 SD 卡的图像
【发布时间】:2020-02-03 21:51:17
【问题描述】:

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

请帮我解决这个问题。 谢谢

【问题讨论】:

  • 我在装有 OS 7 的 LG 手机上看到了这个问题

标签: android xamarin.forms android-sdcard


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多