拍照并将其放置在画廊中

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的内部存储中

Android:我需要拍照并将其存储在 sqlite 数据库中,然后将其填充到回收站视图中

拍照并将其传递给另一个活动[关闭]

我如何从客户端(html)拍照并将其保存到服务器端(Python)

用相机拍照并获取图片路径android