Last active
June 22, 2016 15:15
-
-
Save aykuttasil/5c1b84aecd08d642172c10812a5998e1 to your computer and use it in GitHub Desktop.
CameraPreviewFragment
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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 permissions.dispatcher.sample.camera; | |
import android.content.Context; | |
import android.hardware.Camera; | |
import android.util.Log; | |
import android.view.Surface; | |
import android.view.SurfaceHolder; | |
import android.view.SurfaceView; | |
import java.io.IOException; | |
/** | |
* Camera preview that displays a {@link Camera}. | |
* | |
* Handles basic lifecycle methods to display and stop the preview. | |
* <p> | |
* Implementation is based directly on the documentation at | |
* http://developer.android.com/guide/topics/media/camera.html | |
*/ | |
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { | |
private static final String TAG = "CameraPreview"; | |
private SurfaceHolder mHolder; | |
private Camera mCamera; | |
private Camera.CameraInfo mCameraInfo; | |
private int mDisplayOrientation; | |
public CameraPreview(Context context, Camera camera, Camera.CameraInfo cameraInfo, | |
int displayOrientation) { | |
super(context); | |
// Do not initialise if no camera has been set | |
if (camera == null || cameraInfo == null) { | |
return; | |
} | |
mCamera = camera; | |
mCameraInfo = cameraInfo; | |
mDisplayOrientation = displayOrientation; | |
// Install a SurfaceHolder.Callback so we get notified when the | |
// underlying surface is created and destroyed. | |
mHolder = getHolder(); | |
mHolder.addCallback(this); | |
} | |
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(); | |
Log.d(TAG, "Camera preview started."); | |
} catch (IOException e) { | |
Log.d(TAG, "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 | |
Log.d(TAG, "Preview surface does not exist"); | |
return; | |
} | |
// stop preview before making changes | |
try { | |
mCamera.stopPreview(); | |
Log.d(TAG, "Preview stopped."); | |
} catch (Exception e) { | |
// ignore: tried to stop a non-existent preview | |
Log.d(TAG, "Error starting camera preview: " + e.getMessage()); | |
} | |
int orientation = calculatePreviewOrientation(mCameraInfo, mDisplayOrientation); | |
mCamera.setDisplayOrientation(orientation); | |
try { | |
mCamera.setPreviewDisplay(mHolder); | |
mCamera.startPreview(); | |
Log.d(TAG, "Camera preview started."); | |
} catch (Exception e) { | |
Log.d(TAG, "Error starting camera preview: " + e.getMessage()); | |
} | |
} | |
/** | |
* Calculate the correct orientation for a {@link Camera} preview that is displayed on screen. | |
* | |
* Implementation is based on the sample code provided in | |
* {@link Camera#setDisplayOrientation(int)}. | |
*/ | |
public static int calculatePreviewOrientation(Camera.CameraInfo info, int rotation) { | |
int degrees = 0; | |
switch (rotation) { | |
case Surface.ROTATION_0: | |
degrees = 0; | |
break; | |
case Surface.ROTATION_90: | |
degrees = 90; | |
break; | |
case Surface.ROTATION_180: | |
degrees = 180; | |
break; | |
case Surface.ROTATION_270: | |
degrees = 270; | |
break; | |
} | |
int result; | |
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { | |
result = (info.orientation + degrees) % 360; | |
result = (360 - result) % 360; // compensate the mirror | |
} else { // back-facing | |
result = (info.orientation - degrees + 360) % 360; | |
} | |
return result; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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 permissions.dispatcher.sample.camera; | |
import android.hardware.Camera; | |
import android.os.Bundle; | |
import android.support.v4.app.Fragment; | |
import android.util.Log; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.FrameLayout; | |
import permissions.dispatcher.sample.R; | |
/** | |
* Displays a {@link CameraPreview} of the first {@link Camera}. | |
* An error message is displayed if the Camera is not available. | |
* <p> | |
* This Fragment 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 CameraPreviewFragment extends Fragment { | |
private static final String TAG = "CameraPreview"; | |
/** | |
* Id of the camera to access. 0 is the first camera. | |
*/ | |
private static final int CAMERA_ID = 0; | |
private CameraPreview mPreview; | |
private Camera mCamera; | |
public static CameraPreviewFragment newInstance() { | |
return new CameraPreviewFragment(); | |
} | |
@Override | |
public View onCreateView(LayoutInflater inflater, ViewGroup container, | |
Bundle savedInstanceState) { | |
// Open an instance of the first camera and retrieve its info. | |
mCamera = getCameraInstance(CAMERA_ID); | |
Camera.CameraInfo cameraInfo = null; | |
if (mCamera != null) { | |
// Get camera info only if the camera is available | |
cameraInfo = new Camera.CameraInfo(); | |
Camera.getCameraInfo(CAMERA_ID, cameraInfo); | |
} | |
View root = inflater.inflate(R.layout.fragment_camera, null); | |
// Get the rotation of the screen to adjust the preview image accordingly. | |
final int displayRotation = getActivity().getWindowManager().getDefaultDisplay() | |
.getRotation(); | |
// Create the Preview view and set it as the content of this Activity. | |
mPreview = new CameraPreview(getActivity(), mCamera, cameraInfo, displayRotation); | |
FrameLayout preview = (FrameLayout) root.findViewById(R.id.camera_preview); | |
preview.addView(mPreview); | |
return root; | |
} | |
@Override | |
public void onPause() { | |
super.onPause(); | |
// Stop camera access | |
releaseCamera(); | |
} | |
/** A safe way to get an instance of the Camera object. */ | |
public static 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.d(TAG, "Camera " + cameraId + " is not available: " + e.getMessage()); | |
} | |
return c; // returns null if camera is unavailable | |
} | |
private void releaseCamera() { | |
if (mCamera != null) { | |
mCamera.release(); // release the camera for other applications | |
mCamera = null; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment