Как удалить изображения с мобильного приложения на SD-карту на устройствах android - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь удалить изображения с SD-карты, сохраненные с помощью мобильного приложения.

Я использую contentresolver.Delete в формах xamarin, с помощью которых временно удаляет изображение.

В подробностях об изображении 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);
                }

Пожалуйста, помогите мне решить эту проблему. Спасибо

1 Ответ

0 голосов
/ 04 февраля 2020

Прежде всего, пожалуйста, не используйте contentresolver для удаления изображения. По этой причине вы можете обратиться к этой теме.

{ ссылка }

Пожалуйста, попробуйте использовать следующий метод, чтобы проверить разрешение еще раз. Прежде чем вы захотите удалить файл в 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);
        }
    }
   }
 }

Для удаления файла из внешнего хранилища можно использовать любой из стандартных API C#, например System.IO.File.Delete

System.IO.File.Delete("/storage/emulated/0/Android/data/com.companyname.app/files/count.txt");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...