【问题标题】:camera for picture and video not working图片和视频的相机不工作
【发布时间】:2013-09-09 09:15:44
【问题描述】:

我在 Android 应用中使用相机拍摄照片和视频。我正在使用以下代码,但它强制应用程序关闭。 LogCat 和代码如下所示。如果有人可以提供帮助,将不胜感激。

LogCat:

        09-09 14:32:08.246: E/AndroidRuntime(4764): FATAL EXCEPTION: main
        09-09 14:32:08.246: E/AndroidRuntime(4764): java.lang.NullPointerException
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at com.example.cameravideo.VideoCaptureActivity.initRecorder(VideoCaptureActivity.java:72)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at com.example.cameravideo.VideoCaptureActivity.surfaceCreated(VideoCaptureActivity.java:100)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.SurfaceView.updateWindow(SurfaceView.java:571)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.SurfaceView.access$000(SurfaceView.java:86)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:833)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1860)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.Choreographer.doFrame(Choreographer.java:532)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.os.Handler.handleCallback(Handler.java:730)
        09-09 14:32:08.246: E/AndroidRuntime(4764):     at android.os.Handler.dispatchMessage(Handler.java:92)

代码:

        public class VideoCaptureActivity extends Activity implements
                SurfaceHolder.Callback {

            private final String VIDEO_PATH_NAME = "/mnt/sdcard/VGA_30fps_512vbrate.mp4";
            private MediaRecorder mMediaRecorder;
            private Camera mCamera;
            private SurfaceView mSurfaceView;
            private SurfaceHolder mHolder;
            private View mToggleButton;
            private boolean mInitSuccesful;

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);

mHolder = mSurfaceView.getHolder();
     mHolder.addCallback(this);
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     mToggleButton = (ToggleButton) findViewById(R.id.toggleButton);
     mToggleButton.setOnClickListener(new OnClickListener()
     {
        public void onClick(View v) {
                if (((ToggleButton) v).isChecked()) {
                    mMediaRecorder.start();
                    try {
                        Thread.sleep(10 * 1000);
                    }
        catch (Exception e) {
                e.printStackTrace();
                    }
                    finish();
                        }
                        else {
                    mMediaRecorder.stop();
                    mMediaRecorder.reset();
            try {

initRecorder(mHolder.getSurface());
                            }
        catch (IOException e) {
            e.printStackTrace();
                    }
                }
        }
                });
            }

            private void initRecorder(Surface surface) throws IOException {
                if (mCamera == null) {
                    mCamera = Camera.open();
                    mCamera.unlock();
                }
                if (mMediaRecorder == null)
                mMediaRecorder = new MediaRecorder();
                mMediaRecorder.setPreviewDisplay(surface);
                mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);          mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
                mMediaRecorder.setVideoFrameRate(30);
                mMediaRecorder.setVideoSize(640, 480);
                mMediaRecorder.setOutputFile(VIDEO_PATH_NAME);

                try {
                    mMediaRecorder.prepare();
                }
                catch (IllegalStateException e) {
                    e.printStackTrace();
                }
                mInitSuccesful = true;
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    if (!mInitSuccesful)
                    initRecorder(mHolder.getSurface());
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                shutdown();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
            }

            private void shutdown() {
                mMediaRecorder.reset();
                mMediaRecorder.release();
                mCamera.release();
                mMediaRecorder = null;
                mCamera = null;
            }
        }

【问题讨论】:

  • 您是否在没有定义Camera 的模拟器上进行测试?检查模拟器的属性。
  • 我正在手机和平​​板电脑上测试它.. 但它不工作
  • 您的所有测试设备是否都有后置摄像头?
  • 我正在使用只有前置摄像头的选项卡。但手机有前置和后置摄像头。
  • 你有SonyNexus 电话吗?因为我在这些手机上使用Camera 时也遇到了同样的问题。

标签: android video android-camera


【解决方案1】:

异常的原因可能是因为Camera.open()返回null!

       if (mCamera == null) {
            mCamera = Camera.open();
            mCamera.unlock();
        }

您的清单文件中有以下内容吗?

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

如果您的 api 级别 >= 2.3,请尝试使用 Camera.open(int cameraId);

【讨论】:

  • 是 mCamera = Camera.open();在 VideoCaptureActivity.java 第 72 行?如果不是,第 72 行是什么?
  • Google camera.unlock 返回 null 。您可能会找到与您的问题相关的解决方案
  • 如果您的 api 级别 >= 2.3,请尝试使用 Camera.open(int) 并告诉我结果!
  • 我的 api 级别是 4.3 .. 我使用了这个但它给出了错误“令牌“int”的语法错误,无效的 ArgumentList”
  • 我的意思是方法 open(int id) where id = camera id!使用 Camera.open(0);
【解决方案2】:

尝试以下代码以了解您的手机上有哪些CameraIds,然后使用Camera.open(id) 中的Id 之一

    private void knowIfCameraIsAvailable() {

    int camNumber = Camera.getNumberOfCameras();
    System.out.println("Number of Camera = " + camNumber);

    for (int i = 0; i < camNumber; i++) {
        try {
            Log.e("Camera ID", "ID  ==  " + i);
            Camera cam = Camera.open(i);
            System.out.println("Camera object = " + cam);
            Camera.Parameters camParameter = cam.getParameters();
            System.out.println("camParameter.getMaxZoom() = "
                    + camParameter.getMaxZoom());
            cam.unlock();
            cam.release();
        } catch (NullPointerException e) {
            Log.i("NullPointer", "Object NULL");
            e.printStackTrace();
        } catch (IllegalStateException e) {
            Log.i("IllegalState", "Illegal State");
            e.printStackTrace();
        } catch (Exception e) {
            Log.i("Exception", "Other Exception");
            e.printStackTrace();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多