Android 简单的照相机程序的实例代码
程序员文章站
2023-11-16 17:29:28
复制代码 代码如下:class surface extends surfaceview implements surfaceholder.callback { &...
复制代码 代码如下:
class surface extends surfaceview implements surfaceholder.callback {
surfaceholder sfholder;
camera camera;
bitmap bitmap;
public surface(context context) {
super(context);
// todo auto-generated constructor stub
sfholder = getholder();
sfholder.addcallback(this);
sfholder.settype(surfaceholder.surface_type_push_buffers);
}
public void surfacechanged(surfaceholder holder, int format, int width,
int height) {
// todo auto-generated method stub
camera.parameters parameters = camera.getparameters();
parameters.setpictureformat(pixelformat.jpeg);
parameters.setpreviewsize(320, 480);
parameters.setpicturesize(320, 480);
camera.setparameters(parameters);
camera.startpreview();
}
public void surfacecreated(surfaceholder holder) {
// todo auto-generated method stub
try {
camera = camera.open();
camera.setpreviewdisplay(sfholder);
} catch (exception e) {
camera.release();
camera = null;
}
}
public void surfacedestroyed(surfaceholder holder) {
// todo auto-generated method stub
camera.stoppreview();
camera = null;
}
//拍照
public void takepicture()
{
if (camera != null)
{
camera.takepicture(null, null, jpegcallback);
}
}
//拍照并且保存的回调函数
private picturecallback jpegcallback = new picturecallback() {
public void onpicturetaken(byte[] data, camera camera) {
// todo auto-generated method stub
try
{
bitmap = bitmapfactory.decodebytearray(data, 0, data.length);
file file = new file("/sdcard/camera1.jpg");
bufferedoutputstream bos = new bufferedoutputstream(new fileoutputstream(file));
bitmap.compress(bitmap.compressformat.jpeg, 80, bos);
bos.flush();
bos.close();
canvas canvas= sfholder.lockcanvas();
canvas.drawbitmap(bitmap, 0,0, null);
sfholder.unlockcanvasandpost(canvas);
}
catch(exception e)
{
e.printstacktrace();
}
}
}
}
这个是一个拍照的类,使用的是surfaceview来实现的,如果想要在一部分上显示,并且使用按钮操作的话,可以修改一下这个类,而且这个是拍照之后停留在拍照页面的,如果需要在拍照后不停留在拍照页面的,可以自行修改和添加参数。
此程序也演示了,如何在拍完照之后,将照片保存到sd卡上。
实际使用时的操作如何,使用的是按键进行拍照的,其实也可以改为使用按钮进行拍照的,只要对这个类进行简单的修改即可。调用如下:
复制代码 代码如下:
@override
public boolean onkeydown(int keycode, keyevent event) {
// todo auto-generated method stub
if (keycode == keyevent.keycode_dpad_center)
sf.takepicture();
return super.onkeydown(keycode, event);
}
要使用相机和操作sd卡,则需要添加以下权限:
复制代码 代码如下:
android:name="android.permission.write_external_storage">
第一条是可以使用扩展存储设备的权限
第二条是可以使用照相机设备
如果没有这两条权限的话,会报错,具体错误可以在ddms中查看 。欢迎交流!
希望对大家有所帮助 !
此平台使用提android2.2 v8的系统,如果使用1.5或者是其它的,权限可能会不一样!
当然更好的方法是首先检查sd卡是否存在,此程序中没有进行检测,因为我只是在练习相机的使用。
检测代码如下:
复制代码 代码如下:
if (environment.getexternalstoragestate().equals(android.os.environment.media_mounted)) {
file sdcardpath = environment.getexternalstoragedirectory();
settitle(sdcardpath.getname()); //将sd卡路径名字设置为标题,只是为了让大家看的更明白些
} else {
toast.maketext(recordtest.this, "没有sd卡", 1000).show();
}