android的camera
Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Camera程序。由于自写Camera需要对Camera API了解很充分,而且对于通用的拍照和摄像应用只需要借助系统Camera App程序就能满足要求了,为此先从调用系统Camera App应用开始来对Android Camera做个简单的使用小结。
1.在androidmanifest.xml中加入权限
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 照相权限 -->
<uses-feature android:name="android.hardware.camera" />
<!-- 聚焦 -->
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.代码书写
//调用摄像头
Button camera=(Button)findViewById(R.id.camera);
camera.setOnClickListener(newOnClickListener() {
@Override
public voidonClick(View v) {
// TODO Auto-generated method stub
Intentintent=newIntent(MainActivity.this,Cameradome.class);
startActivity(intent);
}
});
}
跳转类
package com.example.a3;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public classCameradome extendsActivity {
/*
* author 杨
*/
private SurfaceView surface;
private Button paizhao;
private SurfaceHolder Holder;
private Camera cam;// 导入硬件的包
private View layout1, layout2;
private int i = 0;
private boolean focus = false;
private boolean previewRunning = true;// 判断回调
private int count = 0;// 计算点击的次数
private long firsttime;
private long lasttime;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏显示
setContentView(R.layout.activity_camera);
paizhao = (Button)findViewById(R.id.camera);
surface = (SurfaceView)findViewById(R.id.surface);
layout1 = findViewById(R.id.buttonlayout);
layout2 = findViewById(R.id.stoplayout);
Holder = surface.getHolder();
Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 增加缓冲区处理
Holder.setKeepScreenOn(true);// 保持持续拍照
Holder.addCallback(newMySurfaceViewCallback());// 添加操作
Holder.setFixedSize(1280,720);// 设置像素
this.paizhao.setOnClickListener(new onclicklistener());
}
@Override
public booleanonTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() ==MotionEvent.ACTION_DOWN) {
if (firsttime != 0 && System.currentTimeMillis()- firsttime> 500) {
count = 0;
}
count++;
if (count == 1) {
firsttime = System.currentTimeMillis();
// 单击
layout1.setVisibility(ViewGroup.VISIBLE);// 显示,显示为0不显示为8
Toast.makeText(this, "对焦", Toast.LENGTH_SHORT).show();
cam.autoFocus(newAutoFocusCallbackimpl());// 聚焦 focus = false;
}elseif(count== 2) {
lasttime = System.currentTimeMillis();
if (lasttime - firsttime < 500) {
// 双击
layout1.setVisibility(ViewGroup.GONE);
Toast.makeText(this, "double Touch",1).show();
}
count = 0;
firsttime = 0;
lasttime = 0;
}
}
return true;
}
public void changecamera(View v) {
// 换摄像头
if (i == 0) {
i = 1;
}else{
i = 0;
}
cam.stopPreview();// 停掉原来摄像头的预览
cam.release();// 释放资源
cam = null;// 取消原来摄像头
cam = Camera.open(i);// 打开当前选中的摄像头
try {
cam.setPreviewDisplay(Holder);// 通过surfaceview显示取景画面
}catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cam.startPreview();// 开始预览
previewRunning = true;
/*
* cam.stopPreview();// 停止预览
* layout1.setVisibility(ViewGroup.GONE);//显示,显示为0不显示为8
* layout2.setVisibility(ViewGroup.VISIBLE);//显示,显示为0不显示为8
*/
}
private class onclicklistener implements OnClickListener{
// 拍照
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (cam != null) {
cam.autoFocus(newAutoFocusCallbackimpl());
if (focus == true) {
cam.takePicture(sc, pc, jpgcall);
focus = false;
}
}
}
}
// 操作
private class MySurfaceViewCallback implementsSurfaceHolder.Callback {
@Override
public voidsurfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
// 预览打开camera
cam = Camera.open(i);// 取得后摄像头
WindowManagermanager = (WindowManager) Cameradome.this
.getSystemService(Context.WINDOW_SERVICE);// 取得手机的宽度和高度进行内容填充
Displaydisplay = manager.getDefaultDisplay();// 通过display得到相机的一些屏幕参数
Parametersparam = cam.getParameters();
param.setPreviewSize(display.getWidth(),display.getHeight());// 设置预览大小
param.setPreviewFrameRate(5);// 一秒5帧帧数越高越清晰;
param.setPictureFormat(PixelFormat.JPEG);// 图片形式
param.set("jpen-quality",85);// 图片质量
cam.setParameters(param);
try {
cam.setPreviewDisplay(Holder);
}catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cam.startPreview();// 进行预览
previewRunning = true;
}
@Override
public voidsurfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public voidsurfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (cam != null) {
if (previewRunning) {
cam.stopPreview();// 停止预览
previewRunning = false;
}
cam.release();// 释放摄像头
}
}
}
private class AutoFocusCallbackimpl implementsAutoFocusCallback {
@Override
public void onAutoFocus(boolean success,android.hardware.Camera camera) {
// TODO Auto-generated method stub
if (success) {
// 对焦成功
focus = true;
// cam.takePicture(sc, pc, jpgcall);//拍照
}
}
}
private PictureCallback jpgcall = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data,android.hardware.Camera camera) {
// TODO Auto-generated method stub
// 图片存储操作
Bitmapbmp = BitmapFactory.decodeByteArray(data, 0, data.length);
StringfileName = Environment.getExternalStorageDirectory()
.toString()
+File.separator
+"mldnphoto"
+File.separator
+"MLDN_"+ System.currentTimeMillis() + ".jpg";// +System.currentTimeMillis()
// 获取系统时间
Filefile = newFile(fileName);
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();// 创建文件夹
}
try {
BufferedOutputStreambos = newBufferedOutputStream(
newFileOutputStream(file));
bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);// 向缓冲区之中压缩图片
bos.flush();
bos.close();
Toast.makeText(Cameradome.this,
"拍照成功,照片保存在" + fileName + "文件夹中", 1).show();
}catch(FileNotFoundException e) {
// TODO Auto-generated catch block
Toast.makeText(Cameradome.this, "拍照失败", 1).show();
e.printStackTrace();
}catch(IOException e) {
// TODO Auto-generated catch block
Toast.makeText(Cameradome.this, "拍照失败", 1).show();
e.printStackTrace();
}
Cameradome.this.cam.stopPreview();
Cameradome.this.cam.startPreview();
}
};
private ShutterCallback sc = new ShutterCallback() {
@Override
public void onShutter() {
// TODO Auto-generated method stub
// 按下快门的操作
}
};
private PictureCallback pc = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data,android.hardware.Camera camera) {
// TODO Auto-generated method stub
}
};
}
更多相关文章
- android拍照与读取相册
- Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
- android用户界面-组件Widget-地图视图MapView
- Android中使Dialog显示时背景不变暗
- android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0
- [Android]在App中使用相机
- Android(安卓)屏幕设置
- scrollview 滚动条
- android 中使用TextView实现分段显示不同颜色的字符串