Как удалить файл, используя путь - PullRequest
0 голосов
/ 05 апреля 2019

Я создаю приложение, которое позволяет пользователю сохранять растровое изображение или делиться им, не сохраняя его. 2-й функционал не совсем работает. Я понимаю, что приложению необходимо сохранить файл на устройстве, прежде чем делиться им в приложении для социальных сетей, поэтому моя идея заключалась в том, чтобы сразу же после успешного обмена файлом автоматически удалить файл с устройства. Я создал метод удаления, используя два разных подхода, но ни один из них не сработал:

Первый подход:

public void deleteFile(String path){
        File file = new File(path);
        try {
            file.getCanonicalFile().delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Второй подход:

public void deleteFile(String path){
    File file = new File(path);
    boolean deleted = file.delete();
}

И я звоню deleteFile(String) из метода обмена:

public void shareMeme(Bitmap bitmap) {
    String path = MediaStore.Images.Media.insertImage(Objects.requireNonNull(getContext()).getContentResolver(), bitmap, "Meme", null);
    Uri uri = Uri.parse(path);

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("image/*");
    share.putExtra(Intent.EXTRA_STREAM, uri);
    share.putExtra(Intent.EXTRA_TEXT, "This is my Meme");
    getContext().startActivity(Intent.createChooser(share, "Share Your Meme!"));

    deleteFile(path);
}

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Что касается заявленной вами проблемы, insertImage() возвращает строковое представление Uri. Это Uri не файл. Вызывать getPath() для него бессмысленно, и вы не можете ничего удалить по этому пути.

В более широком смысле, если вы хотите сразу удалить контент:

  • Не кладите его в MediaStore
  • Не делитесь им, так как вы будете удалять его до того, как другое приложение сможет что-то с ним сделать

Если вы хотите поделиться им, но затем удалить его:

  • Не кладите его в MediaStore
  • Удалите его на следующий день, или через несколько часов, или как-нибудь еще, так как у вас нет точного способа узнать, когда другое приложение завершает работу с содержимым

Чтобы поделиться изображением с другим приложением без использования MediaStore:

  • Сохраните изображение в файл в getCacheDir() (позвоните по номеру Context, например, Activity или Service)
  • Используйте FileProvider, чтобы сделать этот файл доступным для других приложений

Помимо этого:

  • Не используйте подстановочные знаки MIME в ACTION_SEND. Вы - это тот, кто предоставляет контент для отправки. Вы знаете фактический тип MIME. Используйте это.

  • Обратите внимание, что для действия ACTION_SEND не требуется соблюдение EXTRA_TEXT и EXTRA_STREAM. Большинство, кажется, делают это, но это поведение выходит за пределы спецификации ACTION_SEND.

  • Обратите внимание, что insertImage() устарела на Android Q.

0 голосов
/ 05 апреля 2019

Во-первых, вам нужно проверить, существует ли ваш file (возможно, вы указали неправильный путь?). Затем удалите file

        File file = new File(path);
        if (file.exists()){
            if (file.delete()) {
              Toast.makeText(this, "file Deleted :" + path, Toast.LENGTH_SHORT).show();
              } else {
              Toast.makeText(this, "file not Deleted :" + path, Toast.LENGTH_SHORT).show();

              }
        }
...