content: /*
  * Copyright 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
  
  package com.example.android.basicpermissions.camera;
  
  import android.app.Activity;
  import android.hardware.Camera;
  import android.os.Bundle;
  import android.util.Log;
  import android.widget.FrameLayout;
  
  import com.example.android.basicpermissions.R;
  
  /**
   * Displays a {@link CameraPreview} of the first {@link Camera}.
   * An error message is displayed if the Camera is not available.
   * <p>
   * This Activity is only used to illustrate that access to the Camera API has been granted (or
   * denied) as part of the runtime permissions model. It is not relevant for the use of the
   * permissions API.
   * <p>
   * Implementation is based directly on the documentation at
   * http://developer.android.com/guide/topics/media/camera.html
   */
  public class CameraPreviewActivity extends Activity {
      private static final String TAG = "CameraPreviewActivity";
      /**
       * Id of the camera to access. 0 is the first camera.
       */
      private static final int CAMERA_ID = 0;
  
      private Camera mCamera;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          // Open an instance of the first camera and retrieve its info.
          mCamera = getCameraInstance(CAMERA_ID);
          Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
          Camera.getCameraInfo(CAMERA_ID, cameraInfo);
  
          if (mCamera == null) {
              // Camera is not available, display error message
              setContentView(R.layout.activity_camera_unavailable);
          } else {
  
              setContentView(R.layout.activity_camera);
  
              // Get the rotation of the screen to adjust the preview image accordingly.
              int displayRotation = getDisplay().getRotation();
  
              // Create the Preview view and set it as the content of this Activity.
              CameraPreview cameraPreview = new CameraPreview(this, null,
                      0, mCamera, cameraInfo, displayRotation);
              FrameLayout preview = findViewById(R.id.camera_preview);
              preview.addView(cameraPreview);
          }
      }
  
      @Override
      public void onPause() {
          super.onPause();
          // Stop camera access
          releaseCamera();
      }
  
      /**
       * A safe way to get an instance of the Camera object.
       */
      private Camera getCameraInstance(int cameraId) {
          Camera c = null;
          try {
              c = Camera.open(cameraId); // attempt to get a Camera instance
          } catch (Exception e) {
              // Camera is not available (in use or does not exist)
              Log.e(TAG, "Camera " + cameraId + " is not available: " + e.getMessage());
          }
          return c; // returns null if camera is unavailable
      }
  
      /**
       * Release the camera for other applications.
       */
      private void releaseCamera() {
          if (mCamera != null) {
              mCamera.release();
              mCamera = null;
          }
      }
  }
  