在Android中临时创建位图然后删除它们

时间:2018-05-30 10:31:57

标签: android caching bitmap delete-file

所以我正在开发一个项目,如果经理注册用户,他会收到一封带有QR码(位图)的电子邮件。 QR码保存在缓存中。我想在将QR码发送给用户后删除QR码,但是"缓存"文件夹被创建(也显示在图库中),图像本身被删除但它仍然存在(你无法看到它,但它在那里作为灰色方块)。 知道如何删除创建的文件夹和创建的位图吗?

我的代码:

 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 :(得分:0)

首先,您需要了解MediaScannerConnection.scanFile的作用。它会将文件信息更新到当前设备,因此其他应用程序(如图库,文件浏览器等)可以显示正确的文件信息和内容。

从您的代码中,当您保存临时文件时,您也在扫描它,因为您的应用程序已更改相应的文件,这正是创建文件的确切位置。因此该文件将立即供其他应用程序使用。但是,由于文件位置位于应用程序缓存目录中,因此其他应用程序无法访问它。通常,如果您不致电MediaScanner.scanFile,则必须重新启动设备才能更新文件信息。如果您要创建临时文件,我认为您不需要致电MediaScanner.scanFile ,因为您会立即将其删除。 删除后,您还需要重新扫描该文件,以便其他应用程序知道该文件已被删除。

此外,尽管直接使用MediaScannerConnection.scanFile,但如果您支持Android版本< KitKat,您应该使用意图操作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);