在Android中调用摄像头进行拍照有两种方式,一种是使用系统的拍照Activity,另一种是使用Camera对象自己实现拍照功能。
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
|
public class Main extends Activity implements OnClickListener
{
public ImageView imageView;
private ImageView ivFocus;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTakePicture = (Button) findViewById(R.id.btnTakePicture);
btnTakePicture.setOnClickListener(this);
imageView = (ImageView) findViewById(R.id.imageview);
ivFocus = new ImageView(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == 1)
{
if (resultCode == Activity.RESULT_OK)
{
Bitmap cameraBitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(cameraBitmap);
// 存成320*240和50*50 如果是垂直方向,需要对cameraBitmap旋转90度
MediaStore.Images.Media.insertImage(getContentResolver(), cameraBitmap, null, null);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onClick(View view)
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/test.jpg")));
ListView a;
startActivityForResult(intent, 1);
}
}
|
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
|
public class CameraPreview extends Activity
{
private Preview preview;
private ImageView ivFocus;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
preview = new Preview(this);
setContentView(preview);
ivFocus = new ImageView(this);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
preview.takePicture();
return super.onTouchEvent(event);
}
class Preview extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder holder;
private Camera camera;
// 创建一个PictureCallback对象,并实现其中的onPictureTaken方法
private PictureCallback pictureCallback = new PictureCallback()
{
// 该方法用于处理拍摄后的照片数据
public void onPictureTaken(byte[] data, Camera camera)
{
// data参数值就是照片数据,将这些数据以key-value形式保存,以便其他调用该Activity的程序可
// 以获得照片数据
getIntent().putExtra("bytes", data);
setResult(20, getIntent());
// 停止照片拍摄
camera.stopPreview();
camera = null;
// 关闭当前的Activity
finish();
}
};
// Preview类的构造方法
public Preview(Context context)
{
super(context);
// 获得SurfaceHolder对象
holder = getHolder();
// 指定用于捕捉拍照事件的SurfaceHolder.Callback对象
holder.addCallback(this);
// 设置SurfaceHolder对象的类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
// 开厹拍照时调用该方法
public void surfaceCreated(SurfaceHolder holder)
{
// 获得Camera对象
camera = Camera.open();
try
{
// 设置用于显示拍照摄像的SurfaceHolder对象
camera.setPreviewDisplay(holder);
}
catch (IOException exception)
{
// 释放手机摄像头
camera.release();
camera = null;
}
}
// 停止拍照时调用该方法
public void surfaceDestroyed(SurfaceHolder holder)
{
// 释放手机摄像头
camera.release();
}
// 拍照状态变化时调用该方法
public void surfaceChanged(final SurfaceHolder holder, int format,
int w, int h)
{
try
{
Camera.Parameters parameters = camera.getParameters();
// 设置照片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 根据屏幕方向设置预浏尺寸
if (getWindowManager().getDefaultDisplay().getOrientation() == 0)
parameters.setPreviewSize(h, w);
else
parameters.setPreviewSize(w, h);
// 设置拍摄照片的实际分辨率,在本例中的分辨率是1024*768
parameters.setPictureSize(1024, 768);
// 设置保存的图像大小
camera.setParameters(parameters);
// 开始拍照
camera.startPreview();
// 准备用于表示对焦状态的图像(类似对焦符号)
ivFocus.setImageResource(R.drawable.focus1);
LayoutParams layoutParams = new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
ivFocus.setScaleType(ScaleType.CENTER);
addContentView(ivFocus, layoutParams);
ivFocus.setVisibility(VISIBLE);
// 自动对焦
camera.autoFocus(new AutoFocusCallback()
{
public void onAutoFocus(boolean success, Camera camera)
{
if (success)
{
// success为true表示对焦成功,改变对焦状态图像(一个绿色的png图像)
ivFocus.setImageResource(R.drawable.focus2);
}
}
});
}
catch (Exception e)
{
}
}
// 停止拍照,并将拍摄的照片传入PictureCallback接口的onPictureTaken方法
public void takePicture()
{
if (camera != null)
{
camera.takePicture(null, null, pictureCallback);
}
}
}
}
|
|
<uses-permission android:name="android.permission.CAMERA" />
|