拍照并将其放置在画廊中
Posted
技术标签:
【中文标题】拍照并将其放置在画廊中【英文标题】:taking a photo and placing it in the Gallery 【发布时间】:2014-01-18 21:45:59 【问题描述】:我有一个应用程序,它显示了自己的 SurfaceView
子类和相机预览,并有自己的捕获按钮。我使用Camera.takePicture
拍照,并在onPictureTaken
回调中,将图像数据直接馈入MediaStore.Images.Media.insertImage
。 (这似乎比将图像写入文件然后将其添加到图库更简单,但也许这是个坏主意。)
图片出现在图库中!然而,它在画廊的尽头,这使得它很难找到。我希望它显示在图库的开头,就像使用常规相机应用拍摄的照片一样。
据我所知,问题在于股票相机应用程序将文件命名为IMG_YYYYMMDD_[time].jpg
,而我的照片最终命名为[unix timestamp].jpg
。但我不知道如何告诉MediaStore
来解决这个问题。
代码如下:
public void capture()
mCamera.takePicture(null, null, mPicture);
final PictureCallback mPicture = new PictureCallback()
public void onPictureTaken(byte[] data, Camera camera)
MediaStore.Images.Media.insertImage(getContentResolver(),
BitmapFactory.decodeByteArray(data, 0, data.length),
null, null);
;
【问题讨论】:
我认为如果您更改命名约定,您的问题将得到解决。 转到这个问题:http://***.com/questions/455830/android-getting-file-name-from-camera/472919#472919 您只需要更改一个命名约定。 那么...是否记录了正确的命名约定?我害怕只是复制我在手机上看到的内容,因为其他人可能会有所不同。 【参考方案1】:实际的解决方案是添加日期元数据。最终结果(仍然包含方向错误)是
final PictureCallback mPicture = new PictureCallback()
public void onPictureTaken(byte[] data, Camera camera)
// Create a media file name
String title = "IMG_"+ new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String DCIM = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString();
String DIRECTORY = DCIM + "/Camera";
String path = DIRECTORY + '/' + title + ".jpg";
FileOutputStream out = null;
try
out = new FileOutputStream(path);
out.write(data);
catch (Exception e)
Log.e("pictureTaken", "Failed to write data", e);
finally
try
out.close();
catch (Exception e)
Log.e("pictureTaken", "Failed to close file after write", e);
// Insert into MediaStore.
ContentValues values = new ContentValues(5);
values.put(ImageColumns.TITLE, title);
values.put(ImageColumns.DISPLAY_NAME, title + ".jpg");
values.put(ImageColumns.DATE_TAKEN, System.currentTimeMillis());
values.put(ImageColumns.DATA, path);
// Clockwise rotation in degrees. 0, 90, 180, or 270.
values.put(ImageColumns.ORIENTATION, activity.getWindowManager().getDefaultDisplay()
.getRotation() + 90);
Uri uri = null;
try
uri = activity.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values);
catch (Throwable th)
// This can happen when the external volume is already mounted, but
// MediaScanner has not notify MediaProvider to add that volume.
// The picture is still safe and MediaScanner will find it and
// insert it into MediaProvider. The only problem is that the user
// cannot click the thumbnail to review the picture.
Log.e("pictureTaken", "Failed to write MediaStore" + th);
;
【讨论】:
以上是关于拍照并将其放置在画廊中的主要内容,如果未能解决你的问题,请参考以下文章
Android:我需要拍照并将其存储在 sqlite 数据库中,然后将其填充到回收站视图中