Временное создание растровых изображений в Android, а затем их удаление. - PullRequest
0 голосов
/ 30 мая 2018

Итак, я работаю над проектом, в котором, если менеджер регистрирует пользователя, он получает электронное письмо с QR-кодом (растровое изображение).QR-код сохраняется в кеше.Я хочу, чтобы QR-код был удален после отправки QR-кода пользователю, но папка «cache» создается (также отображается в галерее), и само изображение удаляется, но оно остается там (его не видно, но еготам как серый квадрат).Любая идея, как удалить созданную папку и созданное растровое изображение полностью?

Мой код:

 BitmapSaver(Context mContext){
    this.mContext=mContext;
    this.cache = new DiskBasedCache(mContext.getCacheDir(), 1024 * 1024);
}

public static File saveImageToExternalStorage(Context context, Bitmap finalBitmap) {
        destFolder =context.getCacheDir().getAbsolutePath();
    String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
//  myDir = new File(root + "/saved_images");
 //   myDir.mkdirs();
    long n = System.currentTimeMillis() / 1000L;
    fname = "Image-" + n + ".jpg";
    //file2 = new File(destFolder);
    file = new File(destFolder+"/"+fname);
    if (file.exists())
        file.delete();
    try {
        Log.i("path",destFolder+"/"+fname);
        FileOutputStream out = new FileOutputStream(destFolder+"/"+fname);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }


    MediaScannerConnection.scanFile(context, new String[]{file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                    url = Uri.parse(path);
                    Log.i("External",url.toString());
                }
            });

    return file;
}

В разделе «Активность после отправки электронного письма»:

BitmapSaver bms = new BitmapSaver(RegisterActivity.this);
     bms.saveImageToExternalStorage(RegisterActivity.this, bitmap);


bms.file.delete();

1 Ответ

0 голосов
/ 31 мая 2018

Прежде всего вам необходимо знать, что делает MediaScannerConnection.scanFile.Он обновит информацию о файле на текущем устройстве, поэтому другие приложения, такие как галерея, проводник и т. Д., Могут отображать правильную информацию о файле и его содержимое.

Из вашего кода при сохранении временного файла вытакже сканируют его, потому что ваше приложение изменило соответствующий файл, который создает файл, чтобы быть точным.Таким образом, файл будет доступен для других приложений сразу.Но, поскольку местоположение файла находится в каталоге кэша вашего приложения, оно не будет доступно для других приложений.Обычно вы должны перезагрузить устройство, чтобы обновить информацию о файле, если вы не звоните MediaScanner.scanFile.Если вы создаете временный файл, я думаю, вам не нужно звонить MediaScanner.scanFile, так как вы удалите его сразу.Затем, после удаления, вам также необходимо повторно отсканировать файл, чтобы другие приложения знали, что файл был удален.

Кроме того, несмотря на использование MediaScannerConnection.scanFile напрямую, если вы поддерживаете версию для Android Intent.ACTION_MEDIA_MOUNTED.И я также рекомендую вам передавать данные напрямую, потому что из моего опыта MediaScannerConnection.scanFile не удалось с одного из моих тестовых устройств.

Intent mediaScanIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(Uri.fromFile(new File(imagePath)));
} else {
    Uri fileUri = Uri.parse("file://" + imagePath);
    mediaScanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED, fileUri);
}
context.sendBroadcast(mediaScanIntent);
...