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

照相机takePicture()无法处理我的JB

薛英卫
2023-03-14

嗯,我又更新了我的问题,这次完全更新了。

我已经在Galaxy Nexus(JB)、Moto XX(GB)、SAMSUNG(Froyo)上逐个测试了以下代码,出现了不同的问题/异常

public class MainActivity extends Activity {
    @SuppressLint("NewApi")
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

          ShutterCallback shutterCallback = new ShutterCallback() {
           public void onShutter() {
                  System.out.println("shutterCallback");
           }
          };

          PictureCallback rawCallback = new PictureCallback() {
           public void onPictureTaken(byte[] data, Camera camera) {
                  System.out.println("onPictureTaken");
           }
          };

          PictureCallback jpegCallback = new PictureCallback() {
           public void onPictureTaken(byte[] data, Camera camera) {
                  System.out.println("jpegCallback");
                  FileOutputStream outStream = null;
                  try {
                  System.out.println("jpegCallback begin");
                     camera.startPreview();
                     File storagePath =  new File("/mnt/sdcard/");
                     File myImage = new File(storagePath, "example2.jpg");
                     outStream = new FileOutputStream(myImage); 
                     outStream.write(data);
                     outStream.close();
                    } catch (FileNotFoundException e) {
                          System.out.println("jpegCallback FileNotFoundException");
                     e.printStackTrace();
                    } catch (IOException e) {
                          System.out.println("jpegCallback IOException");
                     e.printStackTrace();
                    } finally {
                     camera.stopPreview();
                     camera.release();
                    }
            }
          };

          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
              for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
              Camera.CameraInfo info = new Camera.CameraInfo();
              Camera.getCameraInfo(i, info);
              if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                     try{
                             Camera camera = Camera.open(i);
                             Camera.Parameters parameters = camera.getParameters();
                             camera.setParameters(parameters);
                              camera.startPreview();
                             camera.setPreviewDisplay(null);
                              System.out.println("takePicture ahead");
                             camera.takePicture(null, rawCallback, jpegCallback);
                              System.out.println("takePicture finish");
                            }
                            catch (Exception e){
                                  System.out.println("printStackTrace");
                                     e.printStackTrace();
                            }
                    }
                }
            }  
    }

在Android4.1中

11-26 00:36:29.144: D/DOMX(132): ERROR: failed check:status >= 0 - returning error: 0x81000 - Can't connect
11-26 00:36:29.144: D/DOMX(132): ERROR: failed check:eRPCError == RPC_OMX_ErrorNone - returning error: 0x80001001 - Error initializing RPC
11-26 00:36:29.144: D/DOMX(132): ERROR: failed check:hRPCCtx != NULL - returning error: 0x81001 - NULL context handle supplied to RPC Deinit
11-26 00:36:29.144: D/DOMX(132): ERROR: rror in Initializing Proxy
11-26 00:36:29.144: E/CameraHAL(132): OMX_GetHandle() failed, error: 0x80001001

2.由“camera.startPreview();”引起

11-26 00:36:30.488: D/DOMX(132): ERROR: failed check:(eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore) - returning error: 0x80001005 - Error returned from OMX API in ducati
11-26 00:36:30.488: E/CameraHAL(132): Error while configuring rotation 0x80001005

3.caused"camera.take图片()"

11-26 00:36:30.495: E/CameraHAL(132): Adapter state switch INTIALIZED_STATE Invalid Op! event = 0x13
11-26 00:36:30.738: D/DOMX(132): ERROR: failed check:(eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore) - returning error: 0x80001005 - Error returned from OMX API in ducati
11-26 00:36:30.738: E/CameraHAL(132): Exiting function UseBuffersCapture because of ret 0 eError=80001005

因此,结果是,即使在Galaxy Nexus i9250等常见设备上,图片也不会在Jelly Bean中拍摄。

接下来,在Android2.3中,有两部分例外:
1。由“摄像头=摄像头打开(i);”引起

E/CameraSettings(1235): Param type 53 not supported        
E/CameraSettings(1235): Param type 51 not supported        
E/CameraSettings(1235): Param type 50 not supported  

2.尽管如此,camera.takePicture()仍然可以执行。结果显示图片已拍摄。除了一个问题:“E/MemoryHeapBase(1235): mmap(fd=50, size=0)失败(无效参数)”

11-26 01:28:33.835: I/AwesomePlayer(1235): prepareAsync_l
11-26 01:28:33.835: D/CameraHal(1235): Capture size 2048x1536, res enum 3
11-26 01:28:33.835: I/AwesomePlayer(1235): prepareAsync_l
11-26 01:28:33.835: D/CameraHal(1235): Setting capture format 0 header 2
11-26 01:28:33.835: I/HPAndroidHAL(1235): APILOG: SetCaptureDataFormat (1 2 0)
11-26 01:28:33.835: D/CameraHal(1235): Thumbnail enabled
11-26 01:28:33.843: E/MemoryHeapBase(1235): mmap(fd=50, size=0) failed (Invalid argument)
11-26 01:28:33.843: D/CameraHal(1235): Initializing capture memory raw: 0x42ee6000 (6295552), jpg: 0x434e7000 (3147776), pv 0xffffffff (0)
11-26 01:28:33.843: I/HPAndroidHAL(1235): APILOG: InitializeCaptureMemory(3 3147776 0x434e7000 6295552 0x42ee6000 0 0xffffffff)
11-26 01:28:33.843: I/HPAndroidHAL(1235): APILOG: InitializeCaptureMemoryBuffers(3 1 0_0x42de5d9c 6295552_0x42de5dc0 3147776_0x42de5d94 0_0x42de5dc8)
11-26 01:28:33.843: I/HPAndroidHAL(1235): APILOG: SetCaptureS2 with finish3A = 1
11-26 01:28:33.843: I/VorbisDecoder(1235): mNumChannels=1, mSampleRate=44100
11-26 01:28:33.843: E/OMXCodec(1235): Successfully allocated software codec 'VorbisDecoder'
11-26 01:28:33.843: I/VorbisDecoder(1235): mNumChannels=1, mSampleRate=44100
11-26 01:28:33.843: E/OMXCodec(1235): Successfully allocated software codec 'VorbisDecoder'
11-26 01:28:33.851: I/AwesomePlayer(1235): play_l
11-26 01:28:33.851: I/AwesomePlayer(1235): play_l
11-26 01:28:33.874: I/AwesomePlayer(1235): pause_l 1
11-26 01:28:33.874: I/AwesomePlayer(1235): reset_l
11-26 01:28:33.874: I/ExtendFileSource(1235): release pFilename = 0xfb690
11-26 01:28:33.874: I/AwesomePlayer(1235): reset_l
11-26 01:28:33.874: I/AwesomePlayer(1235): reset_l
11-26 01:28:33.882: I/AwesomePlayer(1235): pause_l 1
11-26 01:28:33.882: I/AwesomePlayer(1235): reset_l
11-26 01:28:33.882: I/ExtendFileSource(1235): release pFilename = 0xf9098
11-26 01:28:33.882: I/AwesomePlayer(1235): reset_l
11-26 01:28:33.882: I/AwesomePlayer(1235): reset_l

因此,在Android2.3中,在拍摄图片后,不会调用ShutterCallback、rawCallback和jpegCallback中的任何一个。

之后,在Android2.2中,拍摄图片后调用ShutterCallback和rawCallback。但是它们都不能为我提供数据(字节流)。正如http://developer.android.com/reference/android/hardware/Camera.html#takePicture(android.hardware.Camera. ShutterCallback,android.hardware.Camera. Picture Callback,android.hardware.Camera. Picture Callback)中介绍的,如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为空。而且我确实在rawCallback中获得了空数据。

所有这些人员是硬件不兼容还是代码错误造成的?
请帮助

共有3个答案

范飞翰
2023-03-14

尝试放置一个if语句来测试您使用的filepath是否是这样的真实目录

if(file.isDirectory()){

    Log.w("file test---->","filepath is good");

}else{

    Log.w("file test---->","filepath is bad");

 }

仅仅说“SD卡”通常是个坏主意,因为它在多个设备上是不同的。最好创建自己的目录来存储文件。

葛承嗣
2023-03-14

好的,这是一个否定的答案,但我不能发表评论,所以我将以这种形式尝试:我可以确认你在我的Galaxy Nexus上得到的例外。

除此之外,但可能有点帮助,我必须添加一个线程。如果我想让我的照片不是黑色的,请在start Preview和takPicture之间睡眠(500)。

也就是说,我正在读取两个相机(按顺序,因为同时尝试不起作用),有时一个相机工作,另一个产生错误,有时两者都工作,有时什么都不工作。

  1. 要解决未调用回调的问题:释放相机并重试。它通常有效。
  2. 要解决旋转问题0x80001005:重启应用程序/服务
  3. RPC_OMX问题:这似乎与我第一次购买这款手机时的经历非常相似。它安装了4.0.2,偶尔相机会“迷路”——就好像我不在那里一样。在这种情况下,只有手机重启才有帮助。
萧渝
2023-03-14

希望您现在已经解决了问题,但我认为您遇到的问题是,您正在将相机预览设置为空,并且需要有效的SurfaceView作为预览来打开闪光灯(至少在Galaxy Nexus和其他一些三星设备上…)

罪魁祸首:

 camera.setPreviewDisplay(null);

可能的解决方案:

将SurfaceView添加到布局中,并将其大小指定为1px x x 1px。看起来它必须至少有那么大(0的大小会产生不同的错误)。可能需要将SurfaceView(表面视图)屏幕关闭(滚动或相对视图(RelativeLayout))或其他内容)

 类似资料:
  • 我真的希望我不是在做一个重复--但我读了一吨不同的相机-问题在这里,并执行他们的所有答案,结果是一样的:什么都没有发生! 没有错误,应用程序没有崩溃,没有任何问题--只是没有任何迹象的摄像头,它应该被激活!我的目标是在ViewDidIncure或viewDidLoad中激活它,但我也尝试过通过将代码连接到一个按钮来测试它--结果是一样的;什么都没有。在我自己的设备上和模拟器上都是:什么都没有! 我

  • 问题内容: 让我们开始考虑两种类型的相机旋转: 摄像机绕点旋转(轨道): 相机旋转目标(FPS) 然后是一个更新函数,其中从眼睛/目标/上摄像机矢量中计算出投影/视图矩阵: 当摄像机的视图方向与上轴平行(在此处为z-up)时,出现这些旋转功能的问题…在那时,摄像机的行为确实令人讨厌,因此我将遇到以下故障: 所以我的问题是,我该如何调整以上代码,使相机完整旋转,而最终结果在某些边缘点上看起来并不奇怪

  • 在我的应用程序中,当我通过以下方式调用相机意图时: 它不调用方法。 我的应用程序中的问题是,有时它调用这个方法,但在捕获照片后的一段时间,它再次来到照片捕获屏幕。

  • 摘要:对于某些图片尺寸,显式将相机图片大小设置为支持的大小会导致在调用Camera.takePicture()后不调用回调。 详情: 我正在开发一个简单的相机应用程序,它使用相机API来捕获图像。它遵循相机类留档中描述的指南,并在各种设备上可靠地工作。 呼叫摄像头后。open()应用程序调用camera。getParameters()获取相机。Parameters对象,然后调用此对象的getSup

  • uniapp 自定义相机进行连续拍照 1.使用live-pusher 在进行拍照的时候 snapshot提示未定义 2.video 和 canvas 但是视频流没有显示出来 video显示的圈 结果 自定义相机可以单拍也可以连续拍多张

  • 我是GLM新手,正在尝试编写fps风格的相机类 移动鼠标时是否需要重新计算上方向向量? 然而,在我改变向上向量后,一切看起来都很奇怪 但是当我保持向上向量时我的程序看起来有问题 文件:FPSCAMER。cpp公司 您可以在此处下载源代码和二进制文件 https://docs.google.com/file/d/0B9givuJvSet8ekRReWtRM29ldzg/edit?usp=sharin