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

无意识地捕获图像,在不同的设备上提供不同的输出

鲜于华容
2023-03-14

我的要求是既不显示相机预览,也不使用图像捕捉相机的意图。

在那里,我找到了一种适用于我的第一台测试设备(Galaxy tab 7)的方法。

我的捕获图像功能如下所示

private void CaptureImage() {
        int FrontCameraFound = getCameraID();
        if (FrontCameraFound != -1) {
            mCamera = Camera.open(FrontCameraFound);

            parameters = mCamera.getParameters();

            mCamera.setParameters(parameters);
            mCamera.startPreview();

            Camera.PictureCallback mCall = new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {

                    bmp = BitmapFactory.decodeByteArray(data, 0, data.length);

                    // set bitmap tp image view just to check 
                    // if image capture proper, testing purpose
                    iv_image.setImageBitmap(bmp);

                    mCamera.stopPreview();
                    mCamera.release();
                    mCamera = null;
                }
            };
            mCamera.takePicture(null, null, mCall);
        }
    }

和< code>getCameraID功能如下

private int getCameraID() {
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

    for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        // for capture image from back camera
        // If want to capture from front 
        // then change it to CAMERA_FACING_FRONT
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
            try {
                return camIdx;
            } catch (RuntimeException e) {

            }
        }
    }
    return -1;
}

现在我面临着在不同设备上成功运行上述代码的困难。

  • 三星Galaxy S(2.3.6):前置摄像头始终返回绿色图像,但编码后置摄像头工作正常。
  • 三星Galaxy Nexus (4.1):编码不适用于前置相机和后置摄像头

三星Galaxy Nexus的Logcat :

09-21 09:37:42.125: E/AndroidRuntime(4647): Caused by: java.lang.RuntimeException: takePicture failed
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.hardware.Camera.native_takePicture(Native Method)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.hardware.Camera.takePicture(Camera.java:1061)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.hardware.Camera.takePicture(Camera.java:1006)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at fortyonepost.com.pwop.TakePictureDemoActivity.CaptureImage(TakePictureDemoActivity.java:63)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at fortyonepost.com.pwop.TakePictureDemoActivity.onCreate(TakePictureDemoActivity.java:36)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.app.Activity.performCreate(Activity.java:5008)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

不可能检查每个设备的代码,我只是在5个设备上测试我的代码,2个设备导致问题,所以是否有任何标准方法可以从相机获取图像而没有意图

请注意,我包括在清单中

更新:在4.1 Nexus Galaxy从Camera.java类的第1061行获取图片失败,这里是类链接,它给了我native_takePicture(msgType)的信息;Camera.java中的函数确实抛出了那个

共有3个答案

胡曾笑
2023-03-14

您需要使用Camera.setOneShotPreviewCallback方法然后处理图像

尝试使用YuvImage并在将它传递给bitmapfactory之前进行压缩,如下所示:

YuvImage yuvimage = new YuvImage(byteArr, ImageFormat.NV21, width, height, null);
    Rect rect = new Rect(0, 0, width, height);
    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
    yuvimage.compressToJpeg(rect, 100, outstr);
    Bitmap bm = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());

编辑:

您必须使用表面视图,但表面视图可以隐藏在另一个视图下方,因此它在屏幕上不可见,但仍然存在并处于活动状态。

孔山
2023-03-14

经过几次搜索,我发现相机的预览是必要的,我想知道我的代码如何在某些设备上运行良好,即使它有故障。

任何解决办法都是,

我们需要相机预览保持在表面视图,我们可以隐藏在任何其他视图后面的表面视图,我在framelayout中拍摄表面视图(我知道它已弃用),在它上面我拍摄图像视图,对于表面视图,我只拍摄80*80 dp表面视图,因为像30*30 dp这样的小表面视图不起作用,并且再次通过错误。

袁元明
2023-03-14

android设备中的相机处理是主要的问题——不同的设备(甚至同一设备上的android版本)可能并且肯定会有不同的行为。基本上你是在和设备上的一些恶魔进程说话,它们彼此是不同的。

我没有解决所有问题的方法,但这是我迄今为止的发现

  • 并非所有分辨率都能正常工作,即使它们在摄像机参数中有广告。您必须在设置摄像机时测试它们,以防出现问题。
  • 预览数据通过映射的内存区域提供给您。
  • NV21格式始终提供,并且应为默认格式,但我会询问摄像机设置。当您打开相机时,它可以具有之前使用相机的其他应用程序的一些设置。(据说,当您打开相机时,相机将被重置为默认值。)

我已经开发了一些为JavaOCR项目开发的相机管理东西,它适用于大多数设备。随意使用这个作为灵感:

http://SourceForge . net/p/javaocr/code/240/tree/trunk/demos/camera-utils/src/main/Java/net/SF/javaocr/demos/Android/utils/camera/camera manager . Java

 类似资料:
  • 我正在尝试实现ESAPI编码以防止在我的spring-mvc项目中进行XSS攻击。我的方法是在发送回响应中的输入之前,我将使用 ESAPI.encoder() 对其进行编码,以便在页面响应中对输入属性进行编码。 我的假设是,当我返回编码的响应时,在我的页面响应中,我将得到编码的字符,而在我的输入字段中,我会得到普通的字符,但我的输入域也设置了编码的字符。 下面是我在发送响应之前在控制器中编写的示例

  • 但是为了全屏显示相机预览,我将TextureView更改为match_parent。这样做,输出就改变了。现在预览的相机是不同的图像捕获。 请检查这里附上的图像。 1、相机预览:-相机预览截图 我也尝试在camera preview builder和image reader中设置CaptureRequest.Scaler_Crop_Region,但它没有像预期的那样工作。

  • 我正在尝试使用Intent打开文件。操作\u获取\u类似于此帖子的内容: Android打开一个文件与ACTION_GET_CONTENT结果到不同的Uri的 但是这里只是一个解决方案,如何使用不同的SDK/文件夹获取文件名,而不是不同的设备。获得Uri的意图也保持不变。 我想开门。png文件。 Uri.getPath()为两个设备(都. png文件存储在下载文件夹): 因此,问题是,如果我使用

  • 现在,我有下面的代码,它只是测试标准库中的< code>std::set_difference: 当我用Clang/GCC编译它时,我得到了输出: 更新我想实际使用的源代码案例(假设是我将要做的一些操作。因此,这些操作将按的顺序发生): 好吧,这看起来不错,它实际上对应于标准::set_difference,检查链接:但是当我选择MSVC时,我得到了不同的输出(检查链接:https://godbo

  • 我有相同的图像和相同大小的画布,但是输出是不同的。我想要同样的输出,该怎么做呢?

  • 代码: 这就是我初始化相机的方式。 I',试图获得设备的分辨率,并在此基础上设置相机的宽度和高度。 问题是。 我认为精灵不会在更高分辨率的设备上缩放。 根据我的知识和引擎本机缩放相机和精灵。 那么为什么精灵在这种情况下不会被缩放呢? 我应该如何根据分辨率放大精灵? 我也试过FillResolutionPolicy。同样的事情。 我用的是TexturePackerExtension of anden