所以我正在开发一个项目,如果经理注册用户,他会收到一封带有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();
答案 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);