Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助IntentMediaStroe调用系统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

}

};

}

更多相关文章

  1. android拍照与读取相册
  2. Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
  3. android用户界面-组件Widget-地图视图MapView
  4. Android中使Dialog显示时背景不变暗
  5. android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0
  6. [Android]在App中使用相机
  7. Android(安卓)屏幕设置
  8. scrollview 滚动条
  9. android 中使用TextView实现分段显示不同颜色的字符串

随机推荐

  1. android触控,先了解MotionEvent(一)
  2. android SlidingDrawer左右滑动 上下滑动
  3. Android持久化之SharedPreferences
  4. Android批量打包提速 - 1分钟900个市场不
  5. Android中FontMetrics的几个属性全面讲解
  6. android存储路径问题
  7. android studio系列之获取数字签名
  8. Android环境搭建(Windows)
  9. Android(安卓)Bluetooth蓝牙开发\蓝牙协
  10. Android新姿势:3D翻转效果原理