Удалить файл сразу после того, как он был опубликован в android

Я отправляю файл изображения в WhatsApp. Whatsapp не может читать частный файл, поэтому я сохранил его в общедоступном каталоге.

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

try {
   String uniqueName = System.currentTimeMillis() + "";
   File tempFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "ABBM-temp");
   if (!tempFile.exists()) {
       tempFile.mkdirs();
   }
   tempFile = new File(tempFile + uniqueName + ".png");

   FileOutputStream fOut = new FileOutputStream(tempFile);
   b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
   fOut.flush();
   fOut.close();

   final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tempFile));
   intent.setType("image/png");
   startActivity(Intent.createChooser(intent, "Share image via"));
   //tempFile.delete();

} catch (Exception e) {
   e.printStackTrace();
   Toast.makeText(getApplicationContext(), "Image not shared, please grant storage permission", Toast.LENGTH_SHORT).show();
}

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

Поделитесь файлом и удалите его.

Спасибо..


person CodingDevil    schedule 15.08.2019    source источник
comment
Я думаю, вы закрываете поток перед передачей временного файла намерению. попробуйте закрыть поток после того, как изображение будет передано намерению, например. после startActivity   -  person Emotional_Goose    schedule 15.08.2019
comment
@al_khalid Нет, ошибка не в этом. Ошибка в том, что он удаляет файл до того, как пользователь выберет WhatsApp и поделится файлом. Что ему нужно сделать, так это поделиться файлом, а затем удалить файл.   -  person Gaurav Mall    schedule 15.08.2019
comment
@al_khalid на самом деле код идеален для его обмена файлом, но где разместить код для удаления файла после обмена? Пользователь нажал кнопку «Поделиться изображением», выбрал WhatsApp, отправил изображение, удалил его.   -  person CodingDevil    schedule 15.08.2019


Ответы (1)


Ваш код немного неуклюжий и гарантированно будет содержать ошибки в последних версиях Android. Вот несколько наблюдений:

Решение 1

1. Используйте File Provider и пишите в личное хранилище.

Я знаю, что вы пишете в основное хранилище, поэтому другие приложения могут читать файл, но этого делать не следует. Используйте файлового провайдера и получите от него Uri. Вот документация: Документация поставщика файлов. Когда у вас настроен поставщик файлов (поверьте, это просто, вам просто нужно добавить фрагмент в свой манифест и добавить путь xml), вы можете записывать конфиденциально в память. Нравится:

FileOutputStream fOut = openFileOutput("the_name_of_file_here", Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();

Затем, используя getUriForFile, вы можете получить Uri, который будет использоваться любым приложением, которому вы даете доступ. Нравится:

File file = new File(getFilesDir(), "the_name_of_file_here");
Uri uri = getUriForFile(this, "com.yourpackagename.fileprovider", file);

2. Используйте ShareCompat

Когда вы настроите FileProvider, я предлагаю вам для совместного использования файлов использовать ShareCompat вместо обычного действия по совместному использованию. Преимущество ShareCompat в том, что он официально поддерживается Google, и вы также можете делиться с ним множеством файлов. Без необходимости предоставлять URI_PERMISSION другому приложению. Вот пример:

Intent shareIntent = ShareCompat.IntentBuilder.from(this)
                    .setType(type) //This is the MIME type
                    .setStream(uri) //This is the uri we got earlier
                    .getIntent();
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(shareIntent); //Starting the activity

Советую вам заглянуть в этот блог: Начало работы с Share -Compat для получения дополнительной информации. Надеюсь это поможет.

Решение 2

Традиционное решение:

Если вы по-прежнему хотите использовать свою функцию из-за ваших предпочтений или потому, что она лучше подходит вашему приложению, вот что вы можете сделать:

Вместо использования startActivity(Intent) используйте startActivityForResult(Intent, int). При этом вы можете передать целочисленное значение, которое будет работать как идентификатор. Затем, когда к файлу предоставлен доступ и вы вернетесь в свое приложение, функция onActivityResult() будет запущена. У него будет requestCode. Нравится:

//Create your share intent as you do in your code, then:
startActivityForResult(intent, 512); //I passed 512 you can pass anything you want

Затем переопределите эту функцию:

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    //Check if it is from the same code, if yes delete the temp file
    if(requestCode == 512) {
       tempFile.delete();
    }
}
person Gaurav Mall    schedule 15.08.2019
comment
спасибо за ваш ответ, но цель сохранения файлов в общедоступных каталогах, потому что в android 8.0 WhatsApp не получал файл изображения, он сказал, что формат файла не поддерживается, но в версии леденца все в порядке .. Поэтому я попытался поделиться изображением из общедоступных каталог, и это сработало. но вы знаете, что каждый раз, когда пользователь делится изображением, оно будет сохранено там и будет занимать память, поэтому я хочу удалить изображение сразу после того, как пользователь поделился им. Спасибо. - person CodingDevil; 15.08.2019
comment
Да, для этого посмотрите на второе решение. - person Gaurav Mall; 16.08.2019