【问题标题】:Camera2 API picture taken wont show at gallery apps拍摄的 Camera2 API 图片不会在图库应用中显示
【发布时间】:2016-07-03 11:36:00
【问题描述】:

我有一个相机项目,我正在使用camera2 API,尤其是来自这个链接 https://github.com/googlesamples/android-Camera2Basic

例如,我可以将拍摄的照片保存到位于DCIM/camera 的文件管理器中,但是当我打开我的画廊时,它不会显示我的最后一张照片。

谁能帮帮我?

还有一个问题,我想让我的相机可以是一个列表: 例如,当我打开“LINE”并想用相机拍照时,我希望我的相机出现并且可以选择。

这是我尝试将图片保存到自定义路径的示例代码:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mFile = new File("/storage/emulated/0/DCIM/Camera", "pic.jpg");
    int counter=1;
    while (mFile.exists()) {
        mFile = new File("/storage/emulated/0/DCIM/Camera", "pic" + String.format("%02d", counter) + ".jpg");
        counter++;
    }

}

【问题讨论】:

  • 打开图库后,浏览最近的照片并查看照片是否存在
  • 用一些代码编辑,
  • war_Hero: 不能,如果我打开文件管理器并转到我保存图片的路径,我可以找到我的图片,但是当我打开图库时,我的图片不会显示
  • stackoverflow.com/questions/15837485/… 应该是你想要的。
  • 还是不能兄弟 1Up

标签: android android-studio android-camera2


【解决方案1】:

Android 媒体库可能不会在您编写文件时立即检测到您的文件,但只会在稍后的扫描过程中检测到。要强制它进行扫描,您可以使用此代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Intent mediaScanIntent = new Intent(
                Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(Uri.fromFile(mFile));
    mContext.sendBroadcast(mediaScanIntent);
} else {
    mContext.sendBroadcast(new Intent(
    Intent.ACTION_MEDIA_MOUNTED,
    Uri.parse("file://" + Environment.getExternalStorageDirectory())));
    }
}

由于对每个添加的文件运行扫描是一项昂贵的操作,您可以使用此解决方案手动添加它

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, mFile);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

【讨论】:

  • 如何保存图片?因为这看起来像是在横向或纵向模式下拍照的问题,或者只是从图像字节缓冲区中读取错误?你能把那段代码添加到你的问题中吗?
  • 这里是完整的代码兄弟,我不能在这里发布,因为它的overword github.com/googlesamples/android-Camera2Basic/blob/master/…
  • 顺便说一句,我可以用它来保存它到画廊.. getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(mFile)));但是延迟太长了,将近 1 分钟
【解决方案2】:

要在图库中显示图像,您需要添加 ContentValues,例如:https://github.com/googlesamples/android-Camera2Basic 找到 ImageReader.OnImageAvailableListener。这是我的代码:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {

        // First I get the path to gallery and crate new Album to my app
        String pathD = Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM + "/";
        File mediaStorageDir = new File(pathD, "MyAlbum");
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("MyCameraApp", "failed to create directory");
            }
        }
        /*Second I cut mFile = new File(getActivity().getExternalFilesDir(null), "pic.jpg"); 
        from onActivityCreated and add here with the new path from my Album*/


        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
        mFile = new File(mediaStorageDir,"ImageName"+"_"+ timeStamp+".jpeg");

        //Then the contentValues
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, "ImageName");
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        values.put(MediaStore.Images.Media.ORIENTATION, ORIENTATIONS.get(rotation));
        values.put(MediaStore.Images.Media.CONTENT_TYPE,"image/jpeg");
        values.put("_data", mFile.getAbsolutePath());
        ContentResolver cr = getActivity().getContentResolver();
        cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
       //This line is already in the code
       mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));

    }
};

【讨论】:

  • 我知道这是一个很晚的评论,但是您知道对于使用 API 21 的设备是否有 SimpleDateFormat 的替代方案?我收到以下错误:'调用需要 API 级别 24(当前最小值为 21):android.icu.text.SimpleDateFormat#SimpleDateFormat'
  • @Zed 检查这个问题的标记答案stackoverflow.com/questions/39055963/…
  • 无论出于何种原因,它都不会出现在所有图库应用中;我该怎么办?
  • 找到了解决方案。看看这个:stackoverflow.com/questions/8667623/…
【解决方案3】:

如果您想将单个文件添加到库中,请尝试使用:

MediaScannerConnection.scanFile(context,
            new String[]{file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener()
            {
                public void onScanCompleted(String path, Uri uri)
                {
                    Log.d("onScanCompleted", "Scanned " + path + " and uri " + uri);
                }
            });

【讨论】:

  • 谢谢,但似乎这种方式在我的问题中效果不佳:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多