.setPreviewDisplay(holder) throwing null pointer exception

喜你入骨 提交于 2019-12-14 02:12:51

问题


I am developing a custom camera application.Given below is my Activity class.

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}

       }
       }

Given below is my 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>

And this is my CameraPreview class

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

Here

   mCamera.setPreviewDisplay(holder); 

code is throwing null pointer exception...i cant fix that.please tell me why it is throwing exception and how can i fix that?


回答1:


Release the camera in your surfaceDestroyed function

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

and make sure you add camera permission in your manifest file.

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



回答2:


I was having the same bug.

I used this Q&A to help solve my issue. Specifically, reference the adding of the function getBestPreviewSize(...) invoked prior to params.setPreviewSize(...) being set in surfaceChanged.

Android - cam.setPreviewDisplay(holder) running into IOError

As a side note (because this was my next bug), if you start doing any more customization of the Layout (e.g. removing the title bar), any "requests" to the UI to make changes should be made prior to setContentView(...), noted in the link below.

requestFeature() must be called before adding content




回答3:


Most probably your problem would be that your emulator's camera settings. Go to AVD manager, edit your emulator and set your camera , may be to emulated. restart the emulator and launch your app.



来源:https://stackoverflow.com/questions/8984542/setpreviewdisplayholder-throwing-null-pointer-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!