当前位置: 首页 > 知识库问答 >
问题:

一些图片大小导致相机。takePicture()失败

墨阳羽
2023-03-14

摘要:对于某些图片尺寸,显式将相机图片大小设置为支持的大小会导致在调用Camera.takePicture()后不调用回调。

详情:

我正在开发一个简单的相机应用程序,它使用相机API来捕获图像。它遵循相机类留档中描述的指南,并在各种设备上可靠地工作。

呼叫摄像头后。open()应用程序调用camera。getParameters()获取相机。Parameters对象,然后调用此对象的getSupportedPictureSizes()。它迭代支持的图片大小,并选择一个符合某些标准的大小对。然后调用setPictureSize(),传入所选的宽度和高度。最后通过调用camera来设置摄像头参数。SetParameters(),传入摄影机。参数对象。

我遇到了HTC Desire 620的问题。此设备上报告的支持图片大小之一是1184x1184。如果我设置图片大小,然后调用相机。takePicture(),不会调用任何回调(shutter、raw或jpeg),相机对象似乎处于无效状态。如果我显式地将图片大小设置为任何其他支持的大小(方形或矩形纵横比),则调用回调。但对于1184x1184,情况并非如此。

有人遇到过这样的事情吗?有没有办法提前知道支持的图片大小是否会导致此类问题?我错过了什么?

编辑:错字

共有2个答案

孔磊
2023-03-14

这是我的代码,我用来拍照,并将它们保存在数据库中,而不改变其质量。也许这不是你想要的,但它可以帮助你。

首先,您需要以下变量:

 private static final int CAMERA_PIC_REQUEST = 2500;
private Rect Padding = new Rect(-1,-1,-1,-1);
private Matrix matrix = new Matrix();
private Bitmap rotatedBitmap = null;
private Bitmap bm = null;
private Bitmap scaledBitmap= null;
private ExifInterface exif ;
private int rotation=0;
private final BitmapFactory.Options options = new BitmapFactory.Options();

然后根据您的应用程序(我的应用程序使用按钮)从按钮、活动或片段设置请求

btn_camera.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {

              Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
              startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

          }
    }
    );

现在,当我从一个片段请求CAMERA \u PIC\u请求时,我在OnActivityResult()上实现了这段代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_PIC_REQUEST)
        if (data != null) {
        imageuri = data.getData();
        //Bitmap image = (Bitmap) data.getExtras().get("data");

        try {
            options.inSampleSize = 2;
            exif = new ExifInterface(getRealPathFromURI(imageuri));
            rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            rotation = exifToDegrees(rotation);

            bm = BitmapFactory.decodeStream(
                    getActivity().getContentResolver().openInputStream(imageuri),Padding,options);

            scaledBitmap = Bitmap.createScaledBitmap(bm, 400,400, true);

            if (rotation != 0)
            {matrix.postRotate(rotation);}
            //matrix.postRotate(180);
            rotatedBitmap = Bitmap.createBitmap(scaledBitmap , 0, 0, scaledBitmap .getWidth(), scaledBitmap .getHeight(), matrix, true);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        mIvFoto.setImageBitmap(rotatedBitmap);


     }
 }

旋转和矩阵用于将拍摄的图片缩放到ImageView,以便在保存前预览照片。这不会影响图片的质量。这只是预览位图。因此,在ScaledBitmap变量中,如您所见,在创建ScaledBitmap时,我放置图片的尺寸,到400400,您可以放置您想要获得的图片的尺寸,确保旋转位图,这样您就可以获得正确的图片,即使您在肖像模式下拍照。

最后是旋转和从相机保存的路径中获取图片的方法。

private static int exifToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; }
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {  return 180; }
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {  return 270; }
    return 0;
}

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor =getActivity().getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

我希望这对你有帮助。

张财
2023-03-14

我没有HTC Desire 620,所以我无法验证你的发现。但在我从事Android相机开发的职业中,我见过不少设备。你描述的问题是确实发生的情况之一。我宁愿忘记蜂窝2.3的日子,在那个日子里,每个受支持的设备都需要自己的一套变通方法。但即使在后来,事情也从来没有完美过。

例如,Galaxy Nexus设备声称支持带有getSupport dPreviewSize()的QVGA。但事实并非如此。将预览大小设置为320x240仍然会在onPreviewFrame()中产生640x480字节数组。

很多bug都与视频和预览大小有关。纵向方向会出现一些错误。等等

正如您所注意到的,有问题的设置通常只会导致回调永远无法到达。但始终包裹摄影机仍然是一种很好的做法。setParameters()和其他相机调用,并使用try…catch。

注意奇怪的依赖关系:例如,夜景不能与连续对焦共存。不幸的是,我们所知的Camera API无法提供此类信息。

如果您浏览处理各种相机设备的开源项目,您会发现它们会跟踪不成功的设置(参数集),并且只失败一次。

更新我遇到的一个不明显的依赖关系是设置预览大小和设置图片大小之间的依赖关系。E、 g.当后者为16:9纵横比时,图片无法设置为4:3。

更新,这里是一个关于三星Galaxy S3中错误的“支持”图片大小的故事。使用它会导致相机错误1001。

 类似资料:
  • 在hazelcast IMap中查找谓词结果大小的最佳方法是什么? MapProxyImpl中不支持直接大小。java和size()将根据返回的集合进行计算,在这种情况下,这是不需要的。 你有什么建议吗? 谢谢

  • 嗯,我又更新了我的问题,这次完全更新了。 我已经在Galaxy Nexus(JB)、Moto XX(GB)、SAMSUNG(Froyo)上逐个测试了以下代码,出现了不同的问题/异常。 在Android4.1中 2.由“camera.startPreview();”引起 3.caused"camera.take图片()" 因此,结果是,即使在Galaxy Nexus i9250等常见设备上,图片也不

  • 我不熟悉android camera API,代码中调用了PictureCallback,其中包含: 对这一行指出的例外情况是: 因为我是Android世界的新手,我不知道这个环境到底在哪里。getExternalStorageDirectory()指出。 例外说明: JAVA木卫一。FileNotFoundException:/storage/emulated/0 est。jpg:打开失败:EA

  • 当我用quarkus构建我的应用程序的本机映像时,我得到一个大小为150MB的可执行文件(关联的jar大小为12MB,我怀疑底层VM是否能弥补所有空间)。这是正常的还是我做错了什么?有没有办法像记录本机映像中加载的内容那样进行调查?

  • 我拍摄了一个由用户Sinisake编辑的简单的w3学校幻灯片,编辑了样式以删除幻灯片计数器和标题,编辑了prev和next按钮以占据幻灯片每边的一半,光标改变为点击。 唯一的问题是,当您在第一张幻灯片上单击“previousElementSibling”时,previousElementSibling调用了一个不在那里的元素,整个幻灯片将消失。我知道这是因为我改变了前一个和下一个位置,但我不知道为

  • 本文向大家介绍Javascript检查图片大小不要让大图片撑破页面,包括了Javascript检查图片大小不要让大图片撑破页面的使用技巧和注意事项,需要的朋友参考一下 如何用Javascript判断图片大小,其实只要写一个简单的函数就可以了,当然这么判断要怎么写很多人可能不知道。发觉用 ASP 判断图片大小比数牛毛还繁复, 且判断了就判断了, 还要逻辑显示。..烦。 用 Javascript 判断