TestingCamera.java revision b28605e5d09a08c915183772819cb1c7c53cdb34
148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala/* 248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * 448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * you may not use this file except in compliance with the License. 648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * You may obtain a copy of the License at 748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * 848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * 1048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * See the License for the specific language governing permissions and 1448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * limitations under the License. 1548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala */ 1648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 1748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalapackage com.android.testingcamera; 1848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 1948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.app.Activity; 2048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.app.Dialog; 2148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.graphics.Bitmap; 2248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.graphics.BitmapFactory; 2348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.hardware.Camera; 2448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.os.Bundle; 2548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.view.View; 2648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.view.SurfaceHolder; 2748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.view.SurfaceView; 2848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.AdapterView; 2948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.ArrayAdapter; 3048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.Button; 3148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.ImageView; 3248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.LinearLayout.LayoutParams; 3348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.Spinner; 3448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.CompoundButton; 3548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.TextView; 3648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.ToggleButton; 3748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.util.Log; 3848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 3948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.io.IOException; 4048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.ArrayList; 4148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.Comparator; 4248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.List; 4348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.TreeSet; 4448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 4548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala/** 4648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * A simple test application for the camera API. 4794d24977868e0713cf03f7cec4d6de051f411dcaEino-Ville Talvala * 4894d24977868e0713cf03f7cec4d6de051f411dcaEino-Ville Talvala * The goal of this application is to allow all camera API features to be 4994d24977868e0713cf03f7cec4d6de051f411dcaEino-Ville Talvala * excercised, and all information provided by the API to be shown. 5048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala */ 51b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvalapublic class TestingCamera extends Activity implements SurfaceHolder.Callback { 5248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 5348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala /** UI elements */ 5448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private SurfaceView mPreviewView; 5548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private SurfaceHolder mPreviewHolder; 5648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 5748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Spinner mCameraSpinner; 5848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Spinner mPreviewSizeSpinner; 5948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private ToggleButton mPreviewToggle; 6048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Button mTakePictureButton; 61b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala 62b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala private TextView mSnapshotText; 63b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala private ImageView mSnapshotImg; 6448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 6548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala /** Camera state */ 6648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private int mCameraId = 0; 6748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Camera mCamera; 6848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Camera.Parameters mParams; 6948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private List<Camera.Size> mPreviewSizes; 7048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private int mPreviewSize = 0; 7148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 7248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private static final int CAMERA_UNINITIALIZED = 0; 7348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private static final int CAMERA_OPEN = 1; 7448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private static final int CAMERA_PREVIEW = 2; 7548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private static final int CAMERA_TAKE_PICTURE = 3; 7648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private int mState = CAMERA_UNINITIALIZED; 7748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 7848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala /** Misc variables */ 7948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 8048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private static final String TAG = "TestingCamera"; 8148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 8248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala // Activity methods 8348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala @Override 8448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onCreate(Bundle savedInstanceState) { 8548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala super.onCreate(savedInstanceState); 8648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 8748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala setContentView(R.layout.main); 8848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 8948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewView = (SurfaceView)findViewById(R.id.preview); 9048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewView.getHolder().addCallback(this); 9148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 9248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCameraSpinner = (Spinner) findViewById(R.id.camera_spinner); 9348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCameraSpinner.setOnItemSelectedListener(mCameraSpinnerListener); 9448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 9548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSizeSpinner = (Spinner) findViewById(R.id.preview_size_spinner); 9648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSizeSpinner.setOnItemSelectedListener(mPreviewSizeListener); 9748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 9848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle = (ToggleButton) findViewById(R.id.start_preview); 9948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle.setOnClickListener(mPreviewToggleListener); 10048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 10148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mTakePictureButton = (Button) findViewById(R.id.take_picture); 10248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mTakePictureButton.setOnClickListener(mTakePictureListener); 10348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 10448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int numCameras = Camera.getNumberOfCameras(); 10548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala String[] cameraNames = new String[numCameras]; 10648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala for (int i = 0; i < numCameras; i++) { 10748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala cameraNames[i] = "Camera " + i; 10848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 10948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 11048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCameraSpinner.setAdapter( 11148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala new ArrayAdapter<String>(this, 11248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala R.layout.spinner_item, cameraNames)); 11348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 11448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 11548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala @Override 11648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onResume() { 11748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala super.onResume(); 11848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewHolder = null; 11948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala setUpCamera(); 12048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 12148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 12248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala @Override 12348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onPause() { 12448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala super.onPause(); 12548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 12648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.release(); 12748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_UNINITIALIZED; 12848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 12948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 130b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala protected Dialog onCreateDialog(int id) { 131b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala Dialog dialog = new Dialog(this); 132b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala dialog.setContentView(R.layout.snapshot_dialog); 133b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala dialog.setTitle("Snapshot"); 134b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala 135b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala mSnapshotText = 136b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala (TextView) dialog.findViewById(R.id.snapshot_text); 137b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala mSnapshotText.setText("Snapshot title"); 138b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala 139b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala mSnapshotImg = 140b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala (ImageView) dialog.findViewById(R.id.snapshot_image); 141b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala 142b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala return dialog; 143b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala } 144b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala 14548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala // SurfaceHolder.Callback methods 14648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala @Override 14748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void surfaceChanged(SurfaceHolder holder, 14848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int format, 14948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int width, 15048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int height) { 15148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mPreviewHolder != null) return; 15248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 15348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Surface holder available: " + width + " x " + height); 15448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewHolder = holder; 15548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala try { 15648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.setPreviewDisplay(holder); 15748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } catch (IOException e) { 15848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.e(TAG, "Unable to set up preview!"); 15948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 16048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala resizePreview(mPreviewSizes.get(mPreviewSize).width, 16148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSizes.get(mPreviewSize).height); 16248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 16348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 16448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala @Override 16548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void surfaceCreated(SurfaceHolder holder) { 16648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 16748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 16848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 16948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala @Override 17048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void surfaceDestroyed(SurfaceHolder holder) { 17148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 17248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 17348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 17448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala // UI listeners 17548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 17648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private AdapterView.OnItemSelectedListener mCameraSpinnerListener = 177b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala new AdapterView.OnItemSelectedListener() { 178b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala public void onItemSelected(AdapterView<?> parent, 17948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala View view, int pos, long id) { 180b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala if (mCameraId != pos) { 18148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCameraId = pos; 18248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala setUpCamera(); 183b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala } 18448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 18548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 186b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala public void onNothingSelected(AdapterView parent) { 1874ae1a87883045d820ffd6e1b8a95c13b1919e00aEino-Ville Talvala 18848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 189b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala }; 19048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 19148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private AdapterView.OnItemSelectedListener mPreviewSizeListener = 19248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala new AdapterView.OnItemSelectedListener() { 19348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onItemSelected(AdapterView<?> parent, 19448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala View view, int pos, long id) { 19548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (pos == mPreviewSize) return; 19648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Switching preview sizes"); 19748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 19848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mState == CAMERA_PREVIEW) { 19948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.stopPreview(); 20048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 20148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 20248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSize = pos; 20348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int width = mPreviewSizes.get(mPreviewSize).width; 20448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int height = mPreviewSizes.get(mPreviewSize).height; 20548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mParams.setPreviewSize(width, height); 20648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 20748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.setParameters(mParams); 20848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala resizePreview(width, height); 20948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 21048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mState == CAMERA_PREVIEW) { 21148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.startPreview(); 21248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 21348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 21448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 21548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onNothingSelected(AdapterView parent) { 21648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 21748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 21848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 21948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 22048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private View.OnClickListener mPreviewToggleListener = 22148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala new View.OnClickListener() { 22248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onClick(View v) { 22348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mState == CAMERA_TAKE_PICTURE) { 22448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.e(TAG, "Can't change preview state while taking picture!"); 22548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala return; 22648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 22748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mPreviewToggle.isChecked()) { 22848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Starting preview"); 22948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 23048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.startPreview(); 23148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_PREVIEW; 23248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 23348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mTakePictureButton.setEnabled(true); 23448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } else { 23548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Stopping preview"); 23648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.stopPreview(); 23748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_OPEN; 23848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 23948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mTakePictureButton.setEnabled(false); 24048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 24148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 24248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 24348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 24448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private View.OnClickListener mTakePictureListener = 24548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala new View.OnClickListener() { 24648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onClick(View v) { 24748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Taking picture"); 24848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mState == CAMERA_PREVIEW) { 24948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_TAKE_PICTURE; 25048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 25148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mTakePictureButton.setEnabled(false); 25248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle.setEnabled(false); 25348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle.setChecked(false); 25448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 25548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.takePicture(mShutterCb, mRawCb, mPostviewCb, mJpegCb); 25648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } else { 25748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.e(TAG, "Can't take picture while not running preview!"); 25848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 25948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 26048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 26148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 26248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Camera.ShutterCallback mShutterCb = new Camera.ShutterCallback() { 26348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onShutter() { 26448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Shutter cb fired"); 26548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 26648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 26748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 26848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Camera.PictureCallback mRawCb = new Camera.PictureCallback() { 26948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onPictureTaken(byte[] data, Camera camera) { 27048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Raw cb fired"); 27148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 27248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 27348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 27448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Camera.PictureCallback mPostviewCb = new Camera.PictureCallback() { 27548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onPictureTaken(byte[] data, Camera camera) { 27648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Postview cb fired"); 27748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 27848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 27948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 28048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala private Camera.PictureCallback mJpegCb = new Camera.PictureCallback() { 28148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala public void onPictureTaken(byte[] data, Camera camera) { 28248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "JPEG cb fired"); 283b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala 284b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala showDialog(1); 28548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 28648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Bitmap img = BitmapFactory.decodeByteArray(data, 0, data.length); 287b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala mSnapshotImg.setImageBitmap(img); 28848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 28948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle.setEnabled(true); 29048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 29148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_OPEN; 29248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 29348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala }; 29448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 29548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala // Internal methods 29648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 29748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala void setUpCamera() { 29848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Setting up camera " + mCameraId); 29948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mState >= CAMERA_OPEN) { 30048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Closing old camera"); 30148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.release(); 30248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_UNINITIALIZED; 30348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 30448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Opening camera " + mCameraId); 30548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera = Camera.open(mCameraId); 30648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_OPEN; 30748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 30848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mParams = mCamera.getParameters(); 30948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSizes = mParams.getSupportedPreviewSizes(); 31048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 31148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala String[] availableSizeNames = new String[mPreviewSizes.size()]; 312b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala for (int i = 0; i < mPreviewSizes.size(); i++) { 313b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala availableSizeNames[i] = 314b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala Integer.toString(mPreviewSizes.get(i).width) + " x " + 315b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala Integer.toString(mPreviewSizes.get(i).height); 31648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 31748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSizeSpinner.setAdapter( 31848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala new ArrayAdapter<String>( 31948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala this, R.layout.spinner_item, availableSizeNames)); 32048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 32148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewSize = 0; 32248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 32348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int width = mPreviewSizes.get(mPreviewSize).width; 32448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int height = mPreviewSizes.get(mPreviewSize).height; 32548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mParams.setPreviewSize(width, height); 32648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 32748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.setParameters(mParams); 32848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 32948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mPreviewHolder != null) { 33048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala try { 33148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.setPreviewDisplay(mPreviewHolder); 33248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } catch(IOException e) { 33348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.e(TAG, "Unable to set up preview!"); 33448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 33548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 33648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 33748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle.setEnabled(true); 33848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewToggle.setChecked(false); 33948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mTakePictureButton.setEnabled(false); 34048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 34148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala resizePreview(width, height); 34248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mPreviewToggle.isChecked()) { 34348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala Log.d(TAG, "Starting preview" ); 34448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mCamera.startPreview(); 34548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mState = CAMERA_PREVIEW; 34648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 34748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 34848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 34948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala void resizePreview(int width, int height) { 35048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala if (mPreviewHolder != null) { 35148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int viewHeight = mPreviewView.getHeight(); 35248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala int viewWidth = (int)(((double)width)/height * viewHeight); 35348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 35448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala mPreviewView.setLayoutParams( 35548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala new LayoutParams(viewWidth, viewHeight)); 35648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 35748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala 35848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala } 35948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala}