我有一个应用程序,我可以在其中使用设备的相机拍照。我想做的是在不分配 EXTRA_OUTPUT 的情况下启动 ACTION_IMAGE_CAPTURE 意图,然后使用 file.renameTo 将在默认位置创建的文件移动到我自己的自定义位置。我的代码是这样的:
/* Start camera activity without EXTRA_OUTPUT */
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, _REQUESTCODE_ATTACH_CAMERA);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch(requestCode) {
case _REQUESTCODE_ATTACH_CAMERA:
/* Get path to most recently added image */
final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
String fullPath = "";
if(imageCursor.moveToFirst()){
fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
imageCursor.close();
}
File f = Environment.getExternalStorageDirectory();
f = new File(f.getAbsolutePath() + File.separator + "DCIM" + File.separator + MY_APP_NAME;
if(!f.exists()) {
f.mkdirs();
}
/* Create new file based on name of most recently created image */
File oldFile = new File(fullPath);
String newPath = f.getAbsolutePath() + File.separator + oldFile.getName() ;
/* Move file with renameTo */
oldFile.renameTo(new File(newPath));
break;
...
}
}
}
所有这些工作都很好,但是发生了一件奇怪的事情。在我的应用程序中,我有另一个按钮,允许从手机的图库中选择现有图像。该代码如下所示:
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("image/*");
activity.startActivityForResult(galleryIntent, _REQUESTCODE_ATTACH_GALLERY);
这也有效,但如果我使用上面发布的代码用相机拍照,然后尝试从图库中选择另一张图片,图库中将出现空白的“断开链接”类型的项目,其中不包含任何内容且无法选择. 这些似乎与使用 renameTo 拍摄和移动的照片相对应;如果我在 onActivityResult 中输入代码以将文件名发布到 LogCat,则记录的名称与它对应的先前移动文件的名称相同。尝试创建 File 对象或以任何方式访问该文件名,会导致 null 对象并强制关闭。
奇怪的是,Eclipse DDMS 中没有这些“断开的链接”文件的证据,如果我使用根浏览器,手机本身也没有证据,如果我重新安装 SD 卡,它们就会消失。
我在用相机拍摄图像后移动图像的全部原因是为了避免用不必要的图像填满手机的图库存储空间。虽然这些空的“断开链接”类型的文件似乎没有占用任何存储空间,但对于试图浏览其图库的最终用户来说,它们仍然非常烦人。有没有人对这里发生的事情或如何解决这个问题有任何想法?
编辑: 这是一张显示画廊外观的照片,其中显示了“断开的链接”类型的图像。使用我的应用程序拍摄的每张照片都会出现其中一张,如果我重新安装 SD 卡,它们都会消失。