Android Camera Sample
Android Camera Sample
Requirements
- Not use external Intent(Call Camera API)
- Use preview(cover all view)
Sample
View xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/camera"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
UI is just SurfaceView.
SurfaceView is used for Camera Preview.
Camera view is displayed on time
Code
public class CameraActivity extends AppCompatActivity {
private SurfaceView surfaceView;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
surfaceView = (SurfaceView)findViewById(R.id.camera);
surfaceView.setOnClickListener(new ClickSurfaceListener());
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new SurfaceCallback());
}
// Callback
private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// Camera open
camera = Camera.open();
// Portrait
camera.setDisplayOrientation(90);
// Set output to Surface
try {
camera.setPreviewDisplay(holder);
}
catch (IOException oops) {
oops.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// Get camera sizes
Camera.Parameters params = camera.getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
// Get optimal size
Camera.Size optimalSize = getOptimalPreviewSize(sizes, width, height);
params.setPreviewSize(optimalSize.width,optimalSize.height);
camera.setParameters(params);
// Start preview
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// Release
camera.release();
camera = null;
}
}
// Click SurfaceView
private class ClickSurfaceListener implements View.OnClickListener {
@Override
public void onClick(View view){
if (camera != null) {
// AutoFocus
camera.autoFocus(new AutoFocusListener());
}
}
}
// Autofocus callback
private class AutoFocusListener implements Camera.AutoFocusCallback {
@Override
public void onAutoFocus(boolean success, Camera camera) {
//camera.takePicture();
camera.setOneShotPreviewCallback(new OneShotPreviewListener());
}
}
// OneshotPreview callback
private class OneShotPreviewListener implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Bitmap bmp = ImageUtils.getBitmapImageFromYUV(data, camera, 80);
Matrix m = new Matrix();
m.setRotate(90);
Bitmap rotated_bmp = Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),m,true);
// Save image?
String uri = MediaStore.Images.Media.insertImage(getContentResolver(), rotated_bmp, "", null);
Toast.makeText(getApplicationContext(), "Pick Picture", Toast.LENGTH_SHORT).show();
}
}
// Get optmize preview size
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
if (sizes == null) return null;
final double ASPECT_TOLERANCE = 0.1;
double targetRatio=(double)h / w;
Camera.Size optimalSize = null;
double mindiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < mindiff) {
optimalSize = size;
mindiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
mindiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < mindiff) {
optimalSize = size;
mindiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
}
[/java]
<h3>Flash</h3>
<strong>On</strong>
[java]
Camera.Parameters params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera is android.hardware.Camera instance.
Off
Camera.Parameters params = camera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); camera.setParameters(params);
