-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCameraView.java
More file actions
172 lines (154 loc) · 6.28 KB
/
CameraView.java
File metadata and controls
172 lines (154 loc) · 6.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package com.david.ametsitsi.--;
/**
* Created with IntelliJ IDEA.
* User: root
* Date: 3/23/13
* Time: 2:37 AM
*
* This is mainly a debug tool.
*
* Initializes/Destroys/Pauses the preview and recording functions.
*
* Saves previews to sdcard(which will be saved to a buffer in the future for analysis)
*
*/
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.text.format.Time;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
class CameraView extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "Preview";
private static final int resolx = 240; // Horizontal camera size
private static final int resoly = 320; // Vertical camera size
private static int fpsmin = 120000; // Min preview fps(scaled by 1000)
private static int fpsmax = 120000; // Max preview fps(scaled by 1000)
SurfaceHolder mHolder; // Declare surface holder(preview holder)
public Camera camera; // Declare new camera
/*
* Called when the CameraView is created
*
*/
CameraView(Context context) {
super(context);
//Intent AccelService = new Intent(this, Accelerometer.class);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
}//CameraView
/*
* Called when the application is initialized
*
*/
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(1280, 720);
camera.setParameters(parameters); // Set viewing size
parameters.setPictureSize(resoly, resolx); //S et preview size
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO); // Set camera mode for close viewing
//parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // Turn on torch (LED) for dark viewing(phone face down)
// Get supported fps values
List<int[]> fps = parameters.getSupportedPreviewFpsRange(); // Pull supported framerate
int[] fpsrange = fps.remove(0); // Save fps range(int[]) taken from fps
// If supported fps does not equal current fpsmax and fpsmin, set both to currently supported max
if(fpsrange[1] != fpsmax){
fpsmax = fpsrange[1];
fpsmin = fpsrange[1]; // Intended to force constant high framerate
}
//parameters.setPreviewFpsRange(20, 20);
Log.d("FPS", fpsrange[1] + "");
camera.setParameters(parameters);
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(String.format(
"/sdcard/%d.jpg", System.currentTimeMillis())); // Save each frame to sdcard.
outStream.write(data); // Write data
outStream.close(); // Close output stream
Log.d(TAG, "onPreviewFrame - wrote bytes: "
+ data.length);// Document save in log
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
CameraView.this.invalidate();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}//surfaceCreated
/*
* Called when the application exited/killed
*
*/
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
// Because the CameraDevice object is not a shared resource, it's very
// important to release it when the activity is paused.
camera.stopPreview();
//parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); // Turn flash off on Kill
camera = null;
}//surfaceDestroyed
/*
* Called when the application is put on hold
*
*/
public void Pause(){
Camera.Parameters parameters = camera.getParameters(); // Pull current parameters from camera
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); // Turn flash off on Pause(conserve energy)
Log.d("STATE", "paused..");
}//Pause
/*
* Called when the application is reinitialized
*
*/
public void Resume(){
camera = Camera.open(); // restart camera
Camera.Parameters parameters = camera.getParameters(); // Pull current parameters from camera
//parameters.setPreviewSize(320,240); // Set preview size
//parameters.setPictureSize(320,240); // Set picture size
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // reactivate Torch(LED)
//camera.setParameters(parameters); //reset parameters
Log.d("STATE", "resumed..");
}//Resume
/*
* Called when surface change is detected
*
*/
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
camera.startPreview();
}//surfaceChanged
/*
* Called on each save(time stamps each preview)
*
*/
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
Paint p = new Paint(Color.RED);
Log.d(TAG, "draw");
canvas.drawText(new Time(Time.getCurrentTimezone()).toString(), canvas.getWidth() / 2,
canvas.getHeight() / 2, p); // Write the system time on each preview
}//draw
}