title: Surface View with Camera not functioning on Android API 23 (android 6+)
body: <p>I want to make a background with the camera on a SurfaceView, and I succeed at android API lower than 23. Altough im previously requesting camera permission in app on API 23, the following error still appearing on my Nexus 5 with Android 6: </p>
  
  <p><em>java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewDisplay(android.view.SurfaceHolder)' on a null object reference
                                                                          at com.package.name.CameraPreview.surfaceCreated(CameraPreview.java:31)</em></p>
  
  <p>My code is:</p>
  
  <pre><code>import android.content.Context;
  import android.hardware.Camera;
  import android.util.Log;
  import android.view.SurfaceHolder;
  import android.view.SurfaceView;
  
  import java.io.IOException;
  
  /** A basic Camera preview 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 activity_hologram where to draw the preview.
          try {
              mCamera.setPreviewDisplay(holder);
              mCamera.startPreview();
              mCamera.setDisplayOrientation(90);
          } catch (IOException e) {
              Log.d("", "Error setting activity_hologram 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 activity_hologram preview: " + e.getMessage());
          }
      }
  
  }
  </code></pre>
  
  <p>The error jumps at mCamera.setPreviewDisplay(holder);</p>
  
  <p>My main activity code:</p>
  
  <pre><code>public class MainActivity extends AppCompatActivity {
  
  private static Context mContext;
  
  private Camera mCamera;
  private CameraPreview mPreview;
  
  private FrameLayout layout;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      mContext = getApplicationContext();
  
      layout = (FrameLayout) findViewById(R.id.camera_preview);
  
      mCamera = getCameraInstance();
      mPreview = new CameraPreview(this, mCamera);
      layout.addView(mPreview);
  }
  
  
  /** A safe way to get an instance of the Camera object. */
  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 activity_hologram is unavailable
  }
  
  }
  </code></pre>
  
  <p>My manifest got:</p>
  
  <pre><code>&lt;uses-feature android:name="android.hardware.camera" /&gt;
  &lt;uses-permission android:name="android.permission.CAMERA" /&gt;
  </code></pre>
  
  <p>Any ideas to resolve this problem on Android 6?</p>
  
  <p>Thanks for your time, cheers.</p>