.setPreviewDisplay(держатель) выдает исключение нулевого указателя

Я разрабатываю собственное приложение для камеры. Ниже приведен мой класс Activity.

public class MyCustomCam extends Activity {
private Camera mCamera;    
private CameraPreview mPreview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mCamera = getCameraInstance();       
    mPreview = new CameraPreview(this, mCamera);        
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);       
    preview.addView(mPreview);
}
    public static Camera getCameraInstance(){    
        Camera c = null;    
        try {
        c = Camera.open(); // attempt to get a Camera instance    
        }   
        catch (Exception e){        
            // Camera is not available (in use or does not exist)    
            }    
        return c; // returns null if camera is unavailable}

       }
       }

Ниже приведен мой main.xml

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical"    
  android:layout_width="fill_parent"   
   android:layout_height="fill_parent"    > 
 <FrameLayout 
   android:id="@+id/camera_preview"    
   android:layout_width="fill_parent"
       android:layout_height="fill_parent" 
          android:layout_weight="1"    /> 
        <Button    android:id="@+id/button_capture"  
          android:text="Capture"   
         android:layout_width="wrap_content"    
   android:layout_height="wrap_content"    
    android:layout_gravity="center" 
   /></LinearLayout>

А это мой класс CameraPreview

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {    
private SurfaceHolder mHolder;    
private Camera mCamera;    
public CameraPreview(Context context, Camera camera) {        
    super(context);        
    mCamera = camera;        // Install a SurfaceHolder.Callback so we get notified when the       
    // underlying surface is created and destroyed.        
    mHolder = getHolder();       
    mHolder.addCallback(this); 
    // deprecated setting, but required on Android versions prior to 3.0        
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
    }   
public void surfaceCreated(SurfaceHolder holder) {       
    // The Surface has been created, now tell the camera where to draw the preview.        
    try {            
        mCamera.setPreviewDisplay(holder);            
        mCamera.startPreview();        
    } catch (IOException e) {            

        Log.d("", "Error setting camera preview: " + e.getMessage());       
        }   
    } 
public void surfaceDestroyed(SurfaceHolder holder) {
            // empty. Take care of releasing the Camera preview in your activity.   
    }    
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.        
        // Make sure to stop the preview before resizing or reformatting it.        
        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   
        try {            
            mCamera.setPreviewDisplay(mHolder);         
            mCamera.startPreview();       
        } catch (Exception e){           
            Log.d("", "Error starting camera preview: " + e.getMessage()); 
           }  
}
   }

Здесь

   mCamera.setPreviewDisplay(holder); 

код выдает исключение нулевого указателя... я не могу это исправить. Пожалуйста, скажите мне, почему он выдает исключение и как я могу это исправить?


person andro-girl    schedule 24.01.2012    source источник
comment
У меня такая же ошибка. Как вы это исправили. не могли бы вы направить.   -  person sanjana    schedule 11.12.2013


Ответы (3)


Отпустите камеру в вашей функции surfaceDestroyed

public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;   
} 

и убедитесь, что вы добавили разрешение камеры в файл манифеста.

<uses-permission android:name="android.permission.CAMERA" />
person Fazil Uruniyengal    schedule 27.01.2014

У меня была такая же ошибка.

Я использовал эти вопросы и ответы, чтобы помочь решить мою проблему. В частности, укажите добавление функции getBestPreviewSize(...), вызванной до установки params.setPreviewSize(...) в SurfaceChanged.

Android – cam.setPreviewDisplay(holder), работающий с IOError

В качестве примечания (поскольку это была моя следующая ошибка), если вы начнете делать какие-либо дополнительные настройки макета (например, удалить строку заголовка), любые «запросы» к пользовательскому интерфейсу для внесения изменений должны быть сделаны до setContentView(.. .), указанный в ссылке ниже.

requestFeature() должен вызываться перед добавлением контента

person Vanessa Wallis    schedule 30.04.2012
comment
вы только что стали моим личным героем, решение помогло мне продвинуться вперед, в официальной документации нет упоминания об этом, за исключением единственной строки, в которой говорится, что выберите лучший размер предварительного просмотра. Еще раз, спасибо - person Mightian; 27.06.2014

Скорее всего, ваша проблема заключается в том, что настройки камеры вашего эмулятора. Перейдите в диспетчер AVD, отредактируйте свой эмулятор и установите камеру, возможно, для эмуляции. перезапустите эмулятор и запустите приложение.

person sanjeeb    schedule 30.07.2013