2016-11-21 2 views
0

Мое приложение может открывать и обрабатывать определенные файлы. Таким образом, вы можете нажать на такой файл, например, в файловом менеджере, и моему приложению предложит его открыть. Фильтр намерений в файле манифеста настроен примерно так.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 (начиная с файла: //). В этом случае этот код работает отлично:

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

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

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

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

Откуда вы берете 'Uri'? – CommonsWare

+0

Посмотрите на DocumentFile :: deleteFile(). – greenapps

+0

Возможный дубликат [Удаление файлов через ContentResolver в отличие от их удаления через 'file.delete()'] (http://stackoverflow.com/questions/10925196/deleting-files-via-a-contentresolver-as -opposed-to-deleting-them-through-file-del) –

ответ

0

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

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

+0

Считаете ли вы, что класс DocumentFile предоставляет любое дополнение по сравнению с Context.getContentResolver(). Delete (getIntent(). GetData(), null, null); ? Кажется, класс, который будет использоваться на стороне поставщиков, а не на приемниках. (Я видел приложения, которые решили удалить как-то, удалив файлы, которые они были предоставлены. Я не смог.) –

+0

@ GáborDemkó: «Считаете ли вы, что класс DocumentFile предоставляет любое дополнение ...» - только для 'Uri ', полученных через структуру доступа к хранилищу (например,' ACTION_OPEN_DOCUMENT'). «Ури», который вы получаете другими способами, например, ваш '<фильтр-замысел>', не должен представлять что-то, что можно удалить любым способом. – CommonsWare

+0

@CommonsWare, 602k. Как вы это делаете? Шесть дней назад 601к. Тысяча очков в неделю. Я должен работать на это год.Думаю, это могут быть не только обширные информативные ответы. Богатые становятся богаче ... ;-). – greenapps

Смежные вопросы