我有一个应用程序,它对用户从图库中选择的图像执行处理,处理完修改后的图像后,将其保存回原始图像的文件夹,文件名已修改。在特定设备(主要是三星)上,新的KitKat权限限制严重限制了非系统应用程序可以写入的位置,例如外部SD卡或返回典型的画廊位置。 文档建议写入通过
获取的私有包特定文件夹getExternalFilesDir(null)
这很好,图像保存正确,但随后调用
MediaScannerConnection.scanFile
无法正确更新中央媒体数据库,因为修改后的图像不会出现在图库中,即使设备重新启动应强制对所有媒体进行全面扫描也不会触发图像显示。
换句话说,以下代码不起作用:
File appDir = MyActivity.this.getExternalFilesDir(null);
File file = new File(appDir, "new_image.jpeg");
// Process image and write file away...
MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i(LOG_TAG, String.format("Scanned file: %s", path));
}
});
onScanCompleted方法会触发,但图库不会显示新图像。
有没有人看到过这种行为,MediaScanner是否会扫描私密'应用程序文件夹,如果是这样,我怎么让图库检测并显示新图像。
答案 0 :(得分:2)
如果您想要图库拾取图像,则应将它们放在适当的公共位置。您可以使用Environment.getExternalStoragePublicDirectory()获取正确的位置。