在Android中使用takePicture时PictureCallback不叫 [英] PictureCallback not called when using takePicture in Android

查看:221
本文介绍了在Android中使用takePicture时PictureCallback不叫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用我自己的相机拍照,并试图将结果保存到文件系统(/data/data/package.name/file/captured_photo1.jpeg)。当我尝试在仿真器(Android 2.2的),它似乎工作 - 创建大小为8733字节的文件,并显示它(模拟器的默认照片)。问题是,当我尝试它在我的GalaxyS(Android版2.2.1)文件系统上的图像为0字节

我发现(从日志),我传递给我的takePicture方法回调的一个不叫。和它的实际保存它的人。

数据[]我在rawCallback得到的是空两个手机和仿真器上,但模拟器上的回调被调用,它的工作原理

这是整个活动code:

 公共类SolveCaptureActivity延伸活动{
      公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.solve_capture);        preVIEW =新的preVIEW(本);
        ((的FrameLayout)findViewById(R.id. preVIEW))addView(preVIEW)。        buttonClick =(按钮)findViewById(R.id.buttonCapture);
        buttonClick.setOnClickListener(新OnClickListener(){
          公共无效的onClick(视图v){
            preview.camera.takePicture(shutterCallback,rawCallback,jpegCallback);
            意图gotoImage preVIEW =新意图(v.getContext(),CapturedImage preview.class);
            startActivityForResult(gotoImage preVIEW,0);
          }
        });        buttonFocus =(按钮)findViewById(R.id.buttonFocus);
        buttonFocus.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
              preview.camera.autoFocus(新AutoFocusCallback(){
                @覆盖
                公共无效onAutoFocus(布尔成功,相机摄像头){
                    Camera.Parameters camParam = camera.getParameters();
                    camParam.setFocusMode(Parameters.FOCUS_MODE_AUTO);
                    camera.setParameters(camParam);
                }
              });
            }
        });        Log.d(TAGonCreate'd);
      }      //快门打开时调用
      ShutterCallback shutterCallback =新ShutterCallback(){
        公共无效onShutter(){
          Log.d(TAGonShutter'd);
        }
      };      PictureCallback rawCallback =新PictureCallback(){
        公共无效onPictureTaken(字节[]数据,相机摄像头){
          Log.d(TAGonPictureTaken - 原始);
        }
      };      PictureCallback jpegCallback =新PictureCallback(){//&所述8是氢;
        公共无效onPictureTaken(字节[]数据,相机摄像头){
          FileOutputStream中outStream = NULL;
          如果(数据== NULL){
              Log.d(@@ - 数据 - @@,味精,= NULL);
          }
          尝试{
            Log.d(@@ - DIR - @@,Environment.getExternalStorageDirectory()getAbsolutePath());
            Log.d(@@ - 大小 - @@,Integer.toString(da​​ta.length));
            。outStream = getApplicationContext()openFileOutput(SolveCaptureActivity.FILE_NAME,Context.MODE_WORLD_READABLE);            outStream.write(数据);
            outStream.flush();
            outStream.close();
            Log.d(TAGonPictureTaken - 写字节:+ data.length);
          }赶上(FileNotFoundException异常五){//< 10>
            e.printStackTrace();
          }赶上(IOException异常五){
            e.printStackTrace();
          } {最后
          }
          Log.d(TAGonPictureTaken - JPEG);
        }
      };    }

这是日志:

  09-01 18:44:38.403:WARN / CameraService(6488):takePicture(PID 6585)
09-01 18:44:38.403:信息/ ShotSingle(6488):ShotSingle :: takePicture启动
09-01 18:44:38.403:ERROR / CameraHardwareSec(6488):停止preVIEW()
09-01 18:44:38.403:ERROR / SecCamera(6488):cancelAutofocus()
09-01 18:44:38.403:ERROR / SecCamera(6488):cancelAutofocus()结束,0,4
09-01 18:44:38.409:ERROR / SecCamera(6488):停止preVIEW()
09-01 18:44:38.409:ERROR / SecCamera(6488):fimc_v4l2_streamoff()
09-01 18:44:38.433:ERROR / CameraHardwareSec(6488):停止preVIEW()结束
09-01 18:44:38.433:信息/ ShotSingle(6488):ShotSingle :: takePicture结束
09-01 18:44:38.433:信息/ ActivityManager(3135):启动活动:意向{CMP = cs.workshop.solvedroid / .CapturedImage preVIEW}
09-01 18:44:38.437:WARN / CameraService(6488):集previewCallbackFlag(PID 6585)
09-01 18:44:38.437:DEBUG / preVIEW(6585):在previewFrame叫在:1314891878438
09-01 18:44:38.457:DEBUG / SecCamera(6488):通过FMT = 1498831189发现的像素格式[3]:YUV 4:2:2的包装,CbYCrY
09-01 18:44:38.467:WARN / CameraService(6488):宽度(640),高度(480),格式:JPEG
09-01 18:44:38.523:WARN / System.err的(6585):java.io.FileNotFoundException:/data/data/cs.workshop.solvedroid/files/captured_photo2.jpeg(没有这样的文件或目录)
09-01 18:44:38.542:WARN / System.err的(6585):在org.apache.harmony.luni.platform.OSFileSystem.openImpl(本机方法)
09-01 18:44:38.542:WARN / System.err的(6585):在org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
09-01 18:44:38.542:WARN / System.err的(6585):在java.io.FileInputStream中的<&初始化GT;(FileInputStream.java:82)
09-01 18:44:38.542:WARN / System.err的(6585):在android.app.ContextImpl.openFileInput(ContextImpl.java:448)
09-01 18:44:38.542:WARN / System.err的(6585):在android.content.ContextWrapper.openFileInput(ContextWrapper.java:152)
09-01 18:44:38.542:WARN / System.err的(6585):在cs.workshop.solvedroid.CapturedImage preview.onCreate(CapturedImage preview.java:29)
09-01 18:44:38.542:WARN / System.err的(6585):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-01 18:44:38.543:WARN / System.err的(6585):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
09-01 18:44:38.543:WARN / System.err的(6585):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-01 18:44:38.545:WARN / System.err的(6585):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125)
09-01 18:44:38.545:WARN / System.err的(6585):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)
09-01 18:44:38.547:WARN / System.err的(6585):在android.os.Handler.dispatchMessage(Handler.java:99)
09-01 18:44:38.547:WARN / System.err的(6585):在android.os.Looper.loop(Looper.java:123)
09-01 18:44:38.549:WARN / System.err的(6585):在android.app.ActivityThread.main(ActivityThread.java:4627)
09-01 18:44:38.549:WARN / System.err的(6585):在java.lang.reflect.Method.invokeNative(本机方法)
09-01 18:44:38.551:WARN / System.err的(6585):在java.lang.reflect.Method.invoke(Method.java:521)
09-01 18:44:38.553:WARN / System.err的(6585):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
09-01 18:44:38.553:WARN / System.err的(6585):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
09-01 18:44:38.555:WARN / System.err的(6585):在dalvik.system.NativeStart.main(本机方法)
09-01 18:44:38.643:WARN / CameraService(6488):停止preVIEW(PID 6585)
09-01 18:44:38.643:ERROR / CameraHardwareSec(6488):停止preVIEW()
09-01 18:44:38.643:ERROR / SecCamera(6488):cancelAutofocus()
09-01 18:44:38.643:ERROR / SecCamera(6488):cancelAutofocus()结束,0,4
09-01 18:44:38.643:ERROR / SecCamera(6488):停止preVIEW()
09-01 18:44:38.645:ERROR / SecCamera(6488):停止preVIEW:m_flag_camera_start为零
09-01 18:44:38.645:ERROR / CameraHardwareSec(6488):停止preVIEW()结束
09-01 18:44:38.645:WARN / CameraService(6488):停止preVIEW(),硬件停止OK


解决方案

您应该等待 jpegCallback.onPictureTaken()来调用,然后才推出的另一项活动:

  PictureCallback jpegCallback =新PictureCallback(){
    公共无效onPictureTaken(字节[]数据,相机摄像头){
        //数据保存到文件,如果一切正常
        意图gotoImage preVIEW =新意图(v.getContext(),CapturedImage preview.class);
        startActivityForResult(gotoImage preVIEW,0);
    }
};

I'm taking a picture using my own camera and trying to save the result to the file system (/data/data/package.name/file/captured_photo1.jpeg). When i try it on the emulator (Android 2.2) it seems to work - creates a file with size 8733 bytes and displays it (emulator's default photo). The problem is that when i try it on my GalaxyS (Android 2.2.1) the image on the file system is 0 bytes

i found out (from the log) that one of the callbacks i pass to my takePicture method isn't called. and it's the one that actually saves it.

the data[] that i get in the rawCallback is null both on the phone and the emulator, but on the emulator the callback is called and it works

this is the whole Activity code:

public class SolveCaptureActivity extends Activity {
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.solve_capture);

        preview = new Preview(this);
        ((FrameLayout) findViewById(R.id.preview)).addView(preview);

        buttonClick = (Button) findViewById(R.id.buttonCapture);
        buttonClick.setOnClickListener(new OnClickListener() {
          public void onClick(View v) { 
            preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            Intent gotoImagePreview = new Intent(v.getContext(), CapturedImagePreview.class);
            startActivityForResult(gotoImagePreview, 0);
          }
        });

        buttonFocus = (Button) findViewById(R.id.buttonFocus);
        buttonFocus.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
              preview.camera.autoFocus(new AutoFocusCallback() {
                @Override
                public void onAutoFocus(boolean success, Camera camera) {
                    Camera.Parameters camParam = camera.getParameters();
                    camParam.setFocusMode(Parameters.FOCUS_MODE_AUTO);
                    camera.setParameters(camParam);
                }
              });
            }
        });

        Log.d(TAG, "onCreate'd");
      }

      // Called when shutter is opened
      ShutterCallback shutterCallback = new ShutterCallback() {
        public void onShutter() {
          Log.d(TAG, "onShutter'd");
        }
      };

      PictureCallback rawCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
          Log.d(TAG, "onPictureTaken - raw");
        }
      };

      PictureCallback jpegCallback = new PictureCallback() { // <8>
        public void onPictureTaken(byte[] data, Camera camera) {
          FileOutputStream outStream = null;
          if (data == null){
              Log.d("@@--DATA--@@, msg","=NULL");
          }
          try {         
            Log.d("@@--DIR--@@", Environment.getExternalStorageDirectory().getAbsolutePath());
            Log.d("@@--Size--@@", Integer.toString(data.length));
            outStream = getApplicationContext().openFileOutput(SolveCaptureActivity.FILE_NAME, Context.MODE_WORLD_READABLE);

            outStream.write(data);
            outStream.flush();
            outStream.close();
            Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
          } catch (FileNotFoundException e) { // <10>
            e.printStackTrace();
          } catch (IOException e) {
            e.printStackTrace();
          } finally {
          }
          Log.d(TAG, "onPictureTaken - jpeg");
        }
      };

    }

this is the log:

09-01 18:44:38.403: WARN/CameraService(6488): takePicture (pid 6585)
09-01 18:44:38.403: INFO/ShotSingle(6488): ShotSingle::takePicture start
09-01 18:44:38.403: ERROR/CameraHardwareSec(6488): stopPreview()
09-01 18:44:38.403: ERROR/SecCamera(6488): cancelAutofocus()
09-01 18:44:38.403: ERROR/SecCamera(6488): cancelAutofocus() end, 0, 4
09-01 18:44:38.409: ERROR/SecCamera(6488): stopPreview()
09-01 18:44:38.409: ERROR/SecCamera(6488): fimc_v4l2_streamoff()
09-01 18:44:38.433: ERROR/CameraHardwareSec(6488): stopPreview() end
09-01 18:44:38.433: INFO/ShotSingle(6488): ShotSingle::takePicture end
09-01 18:44:38.433: INFO/ActivityManager(3135): Starting activity: Intent { cmp=cs.workshop.solvedroid/.CapturedImagePreview }
09-01 18:44:38.437: WARN/CameraService(6488): setPreviewCallbackFlag (pid 6585)
09-01 18:44:38.437: DEBUG/Preview(6585): onPreviewFrame called at: 1314891878438
09-01 18:44:38.457: DEBUG/SecCamera(6488): passed fmt = 1498831189 found pixel format[3]: YUV 4:2:2 packed, CbYCrY
09-01 18:44:38.467: WARN/CameraService(6488): width(640), height(480), format:jpeg
09-01 18:44:38.523: WARN/System.err(6585): java.io.FileNotFoundException: /data/data/cs.workshop.solvedroid/files/captured_photo2.jpeg (No such file or directory)
09-01 18:44:38.542: WARN/System.err(6585):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
09-01 18:44:38.542: WARN/System.err(6585):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
09-01 18:44:38.542: WARN/System.err(6585):     at java.io.FileInputStream.<init>(FileInputStream.java:82)
09-01 18:44:38.542: WARN/System.err(6585):     at android.app.ContextImpl.openFileInput(ContextImpl.java:448)
09-01 18:44:38.542: WARN/System.err(6585):     at android.content.ContextWrapper.openFileInput(ContextWrapper.java:152)
09-01 18:44:38.542: WARN/System.err(6585):     at cs.workshop.solvedroid.CapturedImagePreview.onCreate(CapturedImagePreview.java:29)
09-01 18:44:38.542: WARN/System.err(6585):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-01 18:44:38.543: WARN/System.err(6585):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
09-01 18:44:38.543: WARN/System.err(6585):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-01 18:44:38.545: WARN/System.err(6585):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-01 18:44:38.545: WARN/System.err(6585):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-01 18:44:38.547: WARN/System.err(6585):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-01 18:44:38.547: WARN/System.err(6585):     at android.os.Looper.loop(Looper.java:123)
09-01 18:44:38.549: WARN/System.err(6585):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-01 18:44:38.549: WARN/System.err(6585):     at java.lang.reflect.Method.invokeNative(Native Method)
09-01 18:44:38.551: WARN/System.err(6585):     at java.lang.reflect.Method.invoke(Method.java:521)
09-01 18:44:38.553: WARN/System.err(6585):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
09-01 18:44:38.553: WARN/System.err(6585):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
09-01 18:44:38.555: WARN/System.err(6585):     at dalvik.system.NativeStart.main(Native Method)
09-01 18:44:38.643: WARN/CameraService(6488): stopPreview (pid 6585)
09-01 18:44:38.643: ERROR/CameraHardwareSec(6488): stopPreview()
09-01 18:44:38.643: ERROR/SecCamera(6488): cancelAutofocus()
09-01 18:44:38.643: ERROR/SecCamera(6488): cancelAutofocus() end, 0, 4
09-01 18:44:38.643: ERROR/SecCamera(6488): stopPreview()
09-01 18:44:38.645: ERROR/SecCamera(6488): stopPreview: m_flag_camera_start is zero
09-01 18:44:38.645: ERROR/CameraHardwareSec(6488): stopPreview() end
09-01 18:44:38.645: WARN/CameraService(6488): stopPreview(), hardware stopped OK

解决方案

You should wait jpegCallback.onPictureTaken() to be called and only then launch another activity:

PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        // save data to file and if everything's OK
        Intent gotoImagePreview = new Intent(v.getContext(), CapturedImagePreview.class);
        startActivityForResult(gotoImagePreview, 0);
    }
};

这篇关于在Android中使用takePicture时PictureCallback不叫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆