Видеокамера Android: NullPointerException - PullRequest
1 голос
/ 27 января 2012

Я разрабатываю приложение для Android для записи видео с помощью Руководства разработчика Android . Весь код в моей программе такой же, как на этой странице.

Я определил разрешение за пределами тега <application>.

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

При запуске приложения предварительный просмотр камеры работает. Но когда я нажимаю кнопку записи, выдается исключение NullPointerException. Исключение:

E/VIDEO_RECORDER(4782): Camera creating error :Fail to connect to camera service
D/AndroidRuntime(4782): Shutting down VM
W/dalvikvm(4782): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
E/AndroidRuntime(4782): FATAL EXCEPTION: main
java.lang.NullPointerException
at com.timico.video.CameraActivity.prepareVideoRecorder(CameraActivity.java:115)
at com.timico.video.CameraActivity.access$5(CameraActivity.java:110)
at com.timico.video.CameraActivity$1.onClick(CameraActivity.java:69)
at android.view.View.performClick(View.java:2538)
at android.view.View$PerformClick.run(View.java:9152)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3691)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)

115 строка mCamera.unlock ();

Подскажите, пожалуйста, в чем причина этого (проверено на Samsung galaxy s2 и Nexus s)? Спасибо

public static Camera getCameraInstance(){
        Camera c = null;
        try{
            c = Camera.open();
        } catch(Exception e){
            Log.e(TAG, "Camera creating error :" + e.getMessage());
        }
        return c;
    }

    private boolean prepareVideoRecorder(){

        mCamera = getCameraInstance();      
        mCamera.unlock();

        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
        mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
        mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

        try {
            mMediaRecorder.prepare();
        } catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder();
            return false;
        }
        return true;
    }

Так создается моя поверхность.

public void surfaceCreated(SurfaceHolder holder) {             
       try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
       } catch (IOException e) {
                Log.d(TAG, "Error setting camera preview: " + e.getMessage());
       }
}

Ответы [ 2 ]

2 голосов
/ 10 сентября 2013

Я знаю, что уже поздно, но это поможет вам.

Используйте mCamera = Camera.open(0); перед mcamera.unlock(); и протестируйте его на устройстве, а не на эмуляторе.

1 голос
/ 08 февраля 2013

Попробуйте освободить экземпляр mCamera перед вызовом prepareVideoRecorder ()

, то есть в SurfaceCreated вы используете mCamera, поэтому я предполагаю, что вы создали экземпляр Camera где-то раньше.Затем вы создаете второй экземпляр Camera в prepareVideoRecorder () - первой строкой этого метода является mCamera = getCameraInstance ();

Я считаю, что это является причиной вашей проблемы.Вы должны избегать создания более одного экземпляра Camera.

...