android 拍照API流程

1. 在布局文件中添加一个 surfaceView (摄影平面)

2.根据 SurfaceView  获得 Holder (固定器)

3.给固定器设置 SurfaceHolder.Callback ; 这个 Callback 有一系列的周期方法,

比如:surfaceCreated,surfaceChanged,surfaceDestroyed等方法.

①.在surfaceDestroyed 中 打开相机,设置预览效果 ;

②.在surfaceChanged中可以初始化相机( Camera );比如相机的参数: 像素, 大小,格式,开始预览,等等

③.在surfaceDestroyed可以可以停止相机拍摄;释放相机资源

4. 相机自动对焦 的回调处理

Camera.autoFocus( AutoFocusCallback )

5.Camera.takePicture(ShutterCallback shutter/*摄像*/, PictureCallback raw/*拍照*/, PictureCallback jpeg/*照片*/)

查看API或者源码,可以发现,这些callback里面都有包含摄像,或者被拍照时的byte[]数据,而这些数据可以根据BitmapFactory变成Bitmap图片.

见源代码如下:

public class ScanBarZBarActivity extends Activity implements SurfaceHolder.Callback{

private static String TAG = "ScanBarZBarActivity";

private Camera mCamera;

private Button mButton, mButton1, mButton2;

private SurfaceView mSurfaceView;

private SurfaceHolder holder;

private AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback();

private String path = "WXJSMyPhoto";

private String path1;

private Bitmap bmp;

private int cnt = 1;

private Calendar c;

public native String getISBN(Bitmap bmp);

private int flag=5;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 隐藏状态栏 */

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

/* 隐藏标题栏 */

requestWindowFeature(Window.FEATURE_NO_TITLE);

/* 设定屏幕显示为横向 */

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

setContentView(R.layout.camera);

/* SurfaceHolder设定 */

mSurfaceView = (SurfaceView) findViewById(R.id.mSurfaceView);

holder = mSurfaceView.getHolder();

holder.addCallback(ScanBarZBarActivity.this);

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

c = Calendar.getInstance();

/* Button初始化 */

mButton = (Button) findViewById(R.id.myButton);

mButton1 = (Button) findViewById(R.id.myButton1);

mButton2 = (Button) findViewById(R.id.myButton2);

/* 拍照Button的事件处理 */

mButton.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

/* 告动对焦后拍照 */

mCamera.autoFocus(mAutoFocusCallback);

}

});

/* Button的事件处理 */

mButton1.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

/* 保存文件 */

Log.i(TAG,"click button2");

if (bmp != null) {

/* 检查SDCard是否存在 */

if (!Environment.MEDIA_MOUNTED.equals(Environment

.getExternalStorageState())) {

/* SD卡不存在,显示Toast信息 */

Toast.makeText(ScanBarZBarActivity.this,

"SD卡不存在!无法保存相片,请插入SD卡。", Toast.LENGTH_LONG)

.show();

} else {

try {

/* 文件不存在就创建 */

File f = new File(Environment

.getExternalStorageDirectory(), path);

Log.i(TAG,"click button2:" + f.getAbsolutePath());

if (!f.exists()) {

f.mkdir();

}

/* 保存相片文件 */

path1 = String.valueOf(c.get(Calendar.MILLISECOND))

+ "camera.jpg";

File n = new File(f, path1);

FileOutputStream bos = new FileOutputStream(n

.getAbsolutePath());

/* 文件转换 */

bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);

/* 调用flush()方法,更新BufferStream */

bos.flush();

/* 结束OutputStream */

bos.close();

Toast.makeText(ScanBarZBarActivity.this,

path1 + "保存成功!", Toast.LENGTH_LONG).show();

cnt++;

} catch (Exception e) {

e.printStackTrace();

}

}

}

mButton.setVisibility(View.VISIBLE);

mButton1.setVisibility(View.VISIBLE);

mButton2.setVisibility(View.VISIBLE);

/* 重新设定Camera */

stopCamera();

initCamera();

}

});

/* 放弃Button的事件处理 */

mButton2.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

mButton.setVisibility(View.VISIBLE);

mButton1.setVisibility(View.VISIBLE);

mButton2.setVisibility(View.VISIBLE);

/* 重新设定Camera */

stopCamera();

initCamera();

}

});

}

@Override

public void surfaceCreated(SurfaceHolder surfaceholder) {

try {

/* 打开相机, */

mCamera = Camera.open();

mCamera.setPreviewDisplay(holder);

} catch (IOException exception) {

mCamera.release();

mCamera = null;

}

}

@Override

public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w,

int h) {

/* 相机初始化 */

Log.i(TAG,"init camera");

initCamera();

}

@Override

public void surfaceDestroyed(SurfaceHolder surfaceholder) {

Log.i(TAG,"destoryed camera");

stopCamera();

mCamera.release();

mCamera = null;

}

/* 拍照的method */

private void takePicture() {

if (mCamera != null) {

Log.i(TAG,"takePicture");

mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);

}

}

private ShutterCallback shutterCallback = new ShutterCallback() {

public void onShutter() {

}

};

private PictureCallback rawCallback = new PictureCallback() {

public void onPictureTaken(byte[] _data, Camera _camera) {

}

};

private PictureCallback jpegCallback = new PictureCallback() {

public void onPictureTaken(byte[] _data, Camera _camera) {

/* 取得相仞 */

try {

/* 设定Button?视性 */

mButton.setVisibility(View.GONE);

mButton1.setVisibility(View.VISIBLE);

mButton2.setVisibility(View.VISIBLE);

/* 取得相仞Bitmap对象 */

bmp = BitmapFactory.decodeByteArray(_data, 0, _data.length);

//发送给isbn分析

// String isbn = getISBN(bmp);获得图片解析后的信息

//  Log.i(TAG, "isbn:" + flag + isbn);

flag--;

if(flag>0){

mCamera.autoFocus(mAutoFocusCallback);

}

} catch (Exception e) {

e.printStackTrace();

}

}

};

/* 告定义class AutoFocusCallback */

public final class AutoFocusCallback implements

android.hardware.Camera.AutoFocusCallback {

public void onAutoFocus(boolean focused, Camera camera) {

/* 对到焦点拍照 */

if (focused) {

takePicture();

}

}

};

/* 相机初始化的method */

private void initCamera() {

if (mCamera != null) {

try {

Camera.Parameters parameters = mCamera.getParameters();

/*

* 设定相片大小为1024*768, 格式为JPG

*/

parameters.setPictureFormat(PixelFormat.JPEG);

parameters.setPictureSize(1024, 768);

mCamera.setParameters(parameters);

/* 开启预览画面 */

mCamera.startPreview();

} catch (Exception e) {

e.printStackTrace();

}

}

}

/* 停止相机的method */

private void stopCamera() {

if (mCamera != null) {

try {

/* 停止预览 */

mCamera.stopPreview();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

Android手机拍照程序开发,android Camera开发-手机拍照流程相关推荐

  1. android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍

    Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...

  2. 《HarmonyOS开发 - IPC Camera开发笔记》第2章 HiSpark IPC Camera开发环境搭建(基于V1.1.4)

    开发环境: 开发系统:Ubuntu 20.04 Harmony版本:code-v1.1.4-LTS.tar HiSpark IPC Camera基于华为海思Hi3518芯片,支持LiteOS.Open ...

  3. 升级魅族android的应用程序,魅族Android 4.4 Flyme升级教程

    注意事项: 1)已ROOT,或安装安全类软件进行了Android签名漏洞修补的用户,请务必在升级时清除数据,否则可能会无法开机.清除数据会造成联系人等个人资料丢失,请注意同步备份; 2)从低版本升级到 ...

  4. android通知栏应用程序更新,Android App自动更新之通知栏下载

    本文实例为大家分享了Android App自动更新通知栏下载的具体代码,供大家参考,具体内容如下 版本更新说明 这里有调用UpdateService启动服务检查下载安装包等 1. 文件下载,下完后写入 ...

  5. 华为手机计算器程序员模式_华为手机坏了需要维修时,一定记得开启这个模式,防止信息泄露!...

    阅读本文前,请您先点击上面的蓝色字体"生活妙招噻",再点击"关注",这样您就可以继续免费收到内容了.每天都有分享.完全是免费订阅,请放心关注 相信大家都能够感受 ...

  6. android拍照程序崩溃,android

    我是android开发的新手. 我们使用flutter开发我们的应用程序. 最近我们发现有一个错误. 当我们安装该应用程序后,并第一次拍照,该应用程序将崩溃. 这是日志 W/libEGL (14538 ...

  7. android 平板安装程序开发者,android – 限制平板电脑中的应用安装

    我有一个 Android应用程序,我想在Tablet中停止安装此应用程序.我搜索了很多网站.我有一些想法并遵循了.但这不是限制. 以下是我访问过的一些网站. 我已尝试使用支持屏幕仍然应用程序正在平板电 ...

  8. android 清除应用程序数据,Android – 通过“清除数据”设置选项阻止正在删除的应用程序数据或文件...

    我有一个Android应用程序,可以在少量文件中存储大约25-40K的私有应用程序数据. 默认情况下,系统将这些文件存储在目录/ data / data /'my app package'/ file ...

  9. android多线程下载程序卡死,android 多线程下载与断点续传

    多线程下载: 下载速度更快,服务器对每个线程平分资源,故线程越多,得到的资源越多,下载速度越快. 断点续传: 下载中断,再次下载时从上一次下载结束的位置开始下载,防止重复下载 下载结束后 代码: pa ...

  10. android平板应用程序,分享Android平板电脑上开发应用程序不能全屏显示的问题解决...

    本来LCD应该是800*600的,但总是得到600*600的结果. 经过好几天的努力,才解决: " package="myb.x2.app2" android:versi ...

最新文章

  1. 【ACM】杭电OJ 1241(深度优先搜索小结)
  2. 环境图配置不存在pbr_小米11再曝光,硬件参数不存在短板,完全最高旗舰配置...
  3. python web shell
  4. 如何把模型表导入数据库
  5. [html] html5中的meta标签robots有什么作用?
  6. java/javascript 时间操作工具类
  7. python打印tensor_如何在TensorFlow中打印SparseTensor内容?
  8. WebApp列表:15个个性化礼物定制服务
  9. 计算机桌面移动如何解决,【电脑小知识】桌面布局被锁定,图标不能随意移动了怎么办?...
  10. 阿里云香港和大陆的服务器分析
  11. 微信小程序开发(第一篇 开发环境的准备+demo获取微信用户信息)
  12. 原生JavaScript实现entries和fromEntries
  13. VisionPro脚本详解
  14. 海康威视2022 校招/社招/实习 内推WHM8BQ
  15. BERT和ERNIE中[PAD],[CLS],[SEP],[MASK],[UNK]所代表的含义
  16. C语言中的abort函数
  17. 新概念c语言能力教程答案,新概念c语言能力教程
  18. MyEclipse8.6注册码代码
  19. Linux 绑定USB设备端口
  20. 游戏开发人员眼中的Unity 3D网页游戏測评报告

热门文章

  1. Android 仿微信群组头像合成
  2. java接收键盘输入姓名_Java:用键盘输入个人信息并输出
  3. USART RX 不上拉的后果
  4. 植物神经紊乱最常被提及,躲不过,那就来“解决它”
  5. Java进阶学习第二十六天(JavaScript增强、AJAX基础)
  6. Nginx之location、root、alias指令用法
  7. Fire Emblem Echoes
  8. 计算机考证不在可以报大专吗
  9. 什么是芯片组,南桥与北桥芯片的作用与区别
  10. 好文转载 【ChatGPT】ChatGPT+MindShow三分钟生成PPT