Android: удалить файл через uri контента

Мое приложение может открывать и обрабатывать определенные файлы. Таким образом, вы можете нажать на такой файл, например, в файловом менеджере, и мое приложение предложит его открыть. Фильтр намерений в файле манифеста настроен примерно так.

<intent-filter>
  <action android:name="android.intent.action.VIEW" />

  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />

  <data android:mimeType="text/plain" />
</intent-filter>

Чтение и обработка файла, как это работает нормально:

Context.getContentResolver().openInputStream(getIntent().getData());

Проблема в том, что я хочу удалить файл после его обработки. (Если пользователь устанавливает для него флажок) Пользователям обычно больше не нужен файл после его открытия в моем приложении.

В настоящее время я могу сделать это только в том случае, если файл предоставлен мне как файл uri (начиная с file://). В этом случае этот код работает нормально:

new File(contentUri.getPath()).delete();

Но я не знаю, как удалить файл, если он предоставляется как uri контента. (начиная с содержания://)

Например, это возвращает null и ничего не делает:

Context.getContentResolver().delete(getIntent().getData(), null, null);

person Twindek    schedule 21.11.2016    source источник
comment
Откуда вы берёте Uri?   -  person CommonsWare    schedule 21.11.2016
comment
Взгляните на DocumentFile::deleteFile().   -  person greenapps    schedule 21.11.2016
comment
Возможный дубликат Удаление файлов через 'ContentResolver', а не их удаление через 'file.delete()'   -  person M. Tarek    schedule 21.11.2016
comment
@CommonsWare Это сложная часть: uri может исходить из любого приложения, которое пользователь использует для выбора файла для открытия.   -  person Twindek    schedule 22.11.2016
comment
@М. Тарек Да, в основном, копия этого. Но, как я пытался, getContentResolver().delete() обычно не удаляет файл, поэтому ответ у меня не работает.   -  person Twindek    schedule 22.11.2016
comment
uri может исходить из любого приложения, которое пользователь использует для выбора файла для открытия — нет, я имею в виду программно. Что-то в вашем коде заставляет вас получить это Uri. Что это? Частью вашего минимально воспроизводимого примера должно быть то, как вы получаете Uri, указывающий на некоторый контент, который вы хотите удалить.   -  person CommonsWare    schedule 22.11.2016
comment
@CommonsWare Я добавил фильтр намерений манифеста, позволяющий любому приложению отправлять данные. Затем getIntent().getData() в действии получает uri.   -  person Twindek    schedule 22.11.2016


Ответы (2)


Я решил это, используя приведенный ниже код.

DocumentFile.fromSingleUri(getApplicationContext(),fileUri ).delete();

Это прекрасно работает. Попытайся.

person Tanveer Dayan    schedule 11.12.2018

У вас нет надежного способа удалить этот контент. Это не ваш контент, и, насколько вам известно, его удалить технически невозможно. Ответственность за его удаление лежит на приложении, вызвавшем вашу ACTION_VIEW активность, а не на вас.

Если вы хотите иметь возможность удалять контент, инвертируйте поток. В Android 4.4+ вы можете использовать ACTION_OPEN_DOCUMENT, чтобы позволить пользователю выбрать часть контента. Затем полученное вами Uri может позволить вам удалить его с помощью DocumentFile.

person CommonsWare    schedule 21.11.2016
comment
Считаете ли вы, что класс DocumentFile предоставляет какое-либо дополнение по сравнению с Context.getContentResolver().delete(getIntent().getData(), null, null); ? Похоже, что класс будет использоваться на стороне провайдеров, а не на получателях. (Я видел, как приложения каким-то образом решали удаление, удаляя файлы, которые им были предоставлены, но я не мог.) - person Twindek; 22.11.2016
comment
@GáborDemkó: Считаете ли вы, что класс DocumentFile предоставляет какие-либо дополнения ... -- только для Uri, полученного с помощью Storage Access Framework (например, ACTION_OPEN_DOCUMENT). Uri, которое вы получаете другими способами, например, <intent-filter>, не обязательно должно представлять что-то, что можно удалить любым способом. - person CommonsWare; 22.11.2016
comment
@CommonsWare, 602k. Как ты это делаешь? Шесть дней назад 601к. Тысяча очков за неделю. Я должен работать для этого год. Я думаю, что это не может быть только обширными информативными ответами. Богатые становятся еще богаче... ;-). - person greenapps; 22.11.2016