View difference between Paste ID: 2KPuBy2q and rpJYWuL3
SHOW: | | - or go back to the newest paste.
1
/*
2
	 * Camera management
3
	 */
4
5
	/**
6
	 * Selects the last used camera or a front-facing one
7
	 */
8
	public void selectCamera()
9
	{
10
		int cameraID = preferences.getInt("cameraID", -1);
11
		if (cameraID == -1)
12
		{
13
			// no camera was selected previously, select a front-facing one
14
			int nCameras = Camera.getNumberOfCameras();
15
16
			CameraInfo cameraInfo = new CameraInfo();
17
			for (int i = 0; i < nCameras; i++)
18
			{
19
				Camera.getCameraInfo(i, cameraInfo);
20
				if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT)
21
				{
22
					cameraID = i;
23
				}
24
			}
25
26
			// there's no front camera
27
			if (cameraID == -1)
28
			{
29
				cameraID = 0;
30
			}
31
		}
32
33
		setPreviewSurface(previewSurface);
34
		setupCamera(cameraID);
35
	}
36
37
	/**
38
	 * Sets the camera used for face detection
39
	 * 
40
	 * @param cameraID the ID of the camera to use
41
	 */
42
	public void setupCamera(int cameraID)
43
	{
44
		// release previous one
45
		if (camera != null)
46
		{
47
			camera.release();
48
			camera = null;
49
		}
50
51
		// save selection
52
		Editor editor = preferences.edit();
53
		editor.putInt("cameraID", cameraID);
54
		editor.commit();
55
56
		try
57
		{
58
			// open camera
59
			camera = Camera.open(cameraID);
60
61
			// get smallest available preview size
62
			Parameters params = camera.getParameters();
63
			List<Size> psizes = params.getSupportedPreviewSizes();
64
			Collections.sort(psizes, new Comparator<Size>()
65
			{
66
				@Override
67
				public int compare(Size size1, Size size2)
68
				{
69
					long pixels1 = size1.height * size1.width;
70
					long pixels2 = size2.height * size2.width;
71
72
					return (pixels1 < pixels2) ? -1 : (pixels1 > pixels2) ? 1 : 0;
73
				}
74
			});
75
			Size smallest = psizes.get(0);
76
			params.setPreviewSize(smallest.width, smallest.height);
77
78
			// set preferred preview format
79
			params.setPreviewFormat(ImageFormat.NV21);
80
81
			// save parameters
82
			camera.setParameters(params);
83
84
			// set preview display
85
			camera.setPreviewDisplay(previewSurface.getHolder());
86
87
			// set orientation
88
			CameraInfo info = new CameraInfo();
89
			Camera.getCameraInfo(cameraID, info);
90
			WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
91
			int _rotation = wm.getDefaultDisplay().getRotation();
92
			int degrees = 0;
93
			switch (_rotation)
94
			{
95
				case Surface.ROTATION_0:
96
					degrees = 0;
97
					break;
98
				case Surface.ROTATION_90:
99
					degrees = 90;
100
					break;
101
				case Surface.ROTATION_180:
102
					degrees = 180;
103
					break;
104
				case Surface.ROTATION_270:
105
					degrees = 270;
106
					break;
107
			}
108
109
			int result = (360 + info.orientation - degrees) % 360;
110
			rotation = degrees;
111
112
			camera.setDisplayOrientation(result);
113
			swapMetrics = (result % 180 == 0);
114
115
			// set camera in imageprocessor
116
			if (processor != null)
117
				processor.setCamera(camera, result);
118
119
			calculator.loadSettings();
120
			
121
			// start preview
122
			camera.startPreview();
123
		}
124
		catch (Exception e)
125
		{
126
			// TODO Auto-generated catch block
127
			e.printStackTrace();
128
		}
129
	}