2015-04-13 5 views
-3

Получил следующий код из различных учебных пособий, которые я не могу выполнить, Может кто-то помочь мне исправить ошибки? Я пытался отладить приложение, чтобы проверить, почему объект камера возвращается нуль, но не мог понять, спасибо заранееОбъект камеры является нулевым указателем

Video.java

public class Video extends Activity { 

    private Camera mCamera; 
    private MediaRecorder mediaRecorder; 
    private Context myContext; 
    private LinearLayout cameraPreview; 
    private Camera_Preview mPreview; 
    Button s; 
    boolean recording = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.video); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     myContext = this; 
     initialize(); 
     capture(); 

    } 

    private void initialize() { 
     // TODO Auto-generated method stub 

     cameraPreview = (LinearLayout) findViewById(R.id.camera_preview); 

     mPreview = new Camera_Preview(myContext, mCamera); 

     cameraPreview.addView(mPreview); 




    } 

    private void capture() { 
     // TODO Auto-generated method stub 


     if (recording) { 
      // stop recording and release camera 
      mediaRecorder.stop(); // stop the recording 
      releaseMediaRecorder(); // release the mediaRecoder object 
      Toast.makeText(Video.this, "Video Captured", Toast.LENGTH_LONG).show(); 
      recording = false; 
     } 
     else 
     { 
      if (!prepareMediaRecorder()) 
      { 
       Toast.makeText(Video.this, "Fail in prepareMediaRecorder()!", 
         Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
      // work on Ui thread for better performance 
      runOnUiThread(new Runnable() { 
       public void run() { 
        // If there are stories, add them to the table 

        try { 
         mediaRecorder.start(); 
        } catch (final Exception ex) { 
         // Log.i("---","Exception in thread"); 

        } 
       } 
      }); 
      recording = true; 
     } 

    } 

    private boolean prepareMediaRecorder() { 
     // TODO Auto-generated method stub 

     mediaRecorder = new MediaRecorder(); 

     mCamera.open(); 
     mediaRecorder.setCamera(mCamera); 

     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

     mediaRecorder.setProfile(CamcorderProfile 
       .get(CamcorderProfile.QUALITY_720P)); 

     mediaRecorder.setOutputFile("/sdcard/myvideo.mp4"); 
     mediaRecorder.setMaxDuration(200000); // Set max duration 20 sec. 
     // mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M 

     try { 
      mediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      releaseMediaRecorder(); 
      return false; 
     } catch (IOException e) { 
      releaseMediaRecorder(); 
      return false; 
     } 
     return true; 

    } 

    private void releaseMediaRecorder() { 
     // TODO Auto-generated method stub 

     if (mediaRecorder != null) { 
      mediaRecorder.reset(); // clear recorder configuration 
      mediaRecorder.release(); // release the recorder object 
      mediaRecorder = null; 
      mCamera.lock(); // lock camera for later use 
     } 
    } 

} 

Camera_Preview.java

import java.io.IOException; 

import android.content.Context; 
import android.hardware.Camera; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class Camera_Preview extends SurfaceView implements SurfaceHolder.Callback { 

    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public Camera_Preview(Context context, Camera camera) { 
     super(context); 
     // TODO Auto-generated constructor stub 

     mCamera = camera; 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

     try { 
      // create the surface and start camera preview 
      if (mCamera == null) { 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 
      } 
     } catch (IOException e) { 
      Log.d(VIEW_LOG_TAG, "Error setting camera preview: " + e.getMessage()); 
     } 

    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

     refreshCamera(mCamera); 
    } 

    private void refreshCamera(Camera camera) { 
     // TODO Auto-generated method stub 

     if (mHolder.getSurface() == null) { 
      // preview surface does not exist 
      return; 
     } 
     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e) { 
      // ignore: tried to stop a non-existent preview 
     } 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 
     // start preview with new settings 
     setCamera(camera); 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } catch (Exception e) { 
      Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage()); 
     } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    public void setCamera(Camera camera) { 
     //method to set a camera instance 
     mCamera = camera; 
    } 

} 

video.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:orientation="vertical" > 
    </LinearLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.69" 
     android:background="#8cc172" > 

     <Button 
      android:id="@+id/button_stop" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="33dp" 
      android:text="STOP" /> 

    </RelativeLayout> 

</LinearLayout> 

LogCat:

04-13 12:18:42.368: E/AndroidRuntime(28442): FATAL EXCEPTION: main 
04-13 12:18:42.368: E/AndroidRuntime(28442): Process: com.example.sp_2, PID: 28442 
04-13 12:18:42.368: E/AndroidRuntime(28442): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sp_2/com.example.sp_2.Video}: java.lang.NullPointerException: camera object is a NULL pointer 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.ActivityThread.access$800(ActivityThread.java:144) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.os.Handler.dispatchMessage(Handler.java:102) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.os.Looper.loop(Looper.java:136) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.ActivityThread.main(ActivityThread.java:5146) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at java.lang.reflect.Method.invokeNative(Native Method) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at java.lang.reflect.Method.invoke(Method.java:515) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at dalvik.system.NativeStart.main(Native Method) 
04-13 12:18:42.368: E/AndroidRuntime(28442): Caused by: java.lang.NullPointerException: camera object is a NULL pointer 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.media.MediaRecorder.setCamera(Native Method) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at com.example.sp_2.Video.prepareMediaRecorder(Video.java:94) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at com.example.sp_2.Video.capture(Video.java:64) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at com.example.sp_2.Video.onCreate(Video.java:33) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.Activity.performCreate(Activity.java:5231) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
04-13 12:18:42.368: E/AndroidRuntime(28442): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) 
04-13 12:18:42.368: E/AndroidRuntime(28442): ... 11 more 

DEBUGGER:

mCamera=null 
+1

Нигде в коде вы назначите камеры в переменную mCamera. Объекты камеры должны поступать из вызова Camera.open(), но этот вызов выполняется после кода, который уже использует вашу переменную mCamera (которая является нулевой). Вы должны немного перестроить свой код, чтобы вызвать Camera.open(), прежде чем использовать переменную mCamera в других вызовах. Также не забудьте добавить mCamera = Camera.open() и проверить исключения (камера уже используется и т. Д.), Когда вы это сделаете, или приложение закрывается на исключение. – Ma3x

+0

@ Ma3x Не могли бы вы рассказать мне, где мне позвонить Camera.open()? Я попытался позвонить в Oncreate(), но мне не удалось подключиться к службе камеры. – Sid

+1

Где угодно, прежде чем вы используете переменную mCamera. Например, вы используете здесь уже «новую Camera_Preview (myContext, mCamera)», и здесь она по-прежнему равна нулю. Проверьте http://developer.android.com/guide/topics/media/camera.html правильные шаги при получении камеры и как проверить исключения. – Ma3x

ответ

1

В вашем Video.java в методе Initialize вы делаете это:

mPreview = new Camera_Preview(myContext, mCamera); 

Однако вам никогда не назначайте ничего для переменной камеры. Посмотрите на эту документацию, он должен сказать вам все, что вам нужно: http://developer.android.com/training/camera/cameradirect.html#TaskOpenCamera

удачи

+0

Спасибо, я разрешил проблему, но теперь я получаю ошибку 100 – Sid

+0

Попробуйте google, если вы не можете найти решение: Задайте другой вопрос –

0

Добавить следующие строки в файле manifeast

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

Возможно, вы захотите предоставить хотя бы одну или две строки **, почему ** это должно разрешить NPE. – GhostCat

+0

@Fortran Я добавил следующие строки в файл манифеста Sid

Смежные вопросы