0

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

我发现(从日志中)我传递给我的 takePicture 方法的回调之一没有被调用。它是真正拯救它的那个。

我在 rawCallback 中得到的 data[] 在手机和模拟器上都是空的,但在模拟器上调用回调并且它可以工作

这是整个活动代码:

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");
        }
      };

    }

这是日志:

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
4

1 回答 1

4

您应该等待jpegCallback.onPictureTaken()被调用,然后才启动另一个活动:

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);
    }
};
于 2011-09-01T20:04:51.457 回答