大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个“拍照”按钮。直接上代码!

1、CameraDemoActivity.java(主界面)

package org.winplus.camera;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Date;

import android.app.Activity;

import android.content.pm.ActivityInfo;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Environment;

import android.text.format.DateFormat;

import android.util.Log;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.view.Window;

import android.view.View.OnClickListener;

import android.widget.Button;

public class CameraDemoActivity extends Activity{

private final static String TAG = "CameraActivity";

private SurfaceView surfaceView;

private SurfaceHolder surfaceHolder;

private Camera camera;

private File picture;

private Button btnSave;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.main);

setupViews();

}

private void setupViews(){

surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components

surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components

surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

btnSave = (Button) findViewById(R.id.save_pic);

btnSave.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

takePic();

}

});

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_CAMERA

|| keyCode == KeyEvent.KEYCODE_SEARCH) {

takePic();

return true;

}

return super.onKeyDown(keyCode, event);

}

private void takePic() {

camera.stopPreview();// stop the preview

camera.takePicture(null, null, pictureCallback); // picture

}

// Photo call back

Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

//@Override

public void onPictureTaken(byte[] data, Camera camera) {

new SavePictureTask().execute(data);

camera.startPreview();

}

};

// save pic

class SavePictureTask extends AsyncTask {

@Override

protected String doInBackground(byte[]... params) {

String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";

Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());

//picture = new File(Environment.getExternalStorageDirectory(),fname);// create file

picture = new File(Environment.getExternalStorageDirectory()+"/"+fname);

try {

FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream

fos.write(params[0]); // Written to the file

fos.close();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

}

// SurfaceHodler Callback handle to open the camera, off camera and photo size changes

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

public void surfaceCreated(SurfaceHolder holder) {

Log.i(TAG, "surfaceCallback====");

camera = Camera.open(); // Turn on the camera

try {

camera.setPreviewDisplay(holder); // Set Preview

} catch (IOException e) {

camera.release();// release camera

camera = null;

}

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

Log.i(TAG,"====surfaceChanged");

Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain

parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format

// parameters.set("rotation", 180); // Arbitrary rotation

camera.setDisplayOrientation(0);

// parameters.setPreviewSize(400, 300); // Set Photo Size

camera.setParameters(parameters); // Setting camera parameters

camera.startPreview(); // Start Preview

}

public void surfaceDestroyed(SurfaceHolder holder) {

Log.i(TAG,"====surfaceDestroyed");

camera.stopPreview();// stop preview

camera.release(); // Release camera resources

camera = null;

}

};

}

2、main.xml(布局文件)

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/camera_preview"

android:layout_width="800dip"

android:layout_height="600dip"

android:layout_alignParentTop="true"

android:layout_centerInParent="true"

android:layout_gravity="center_vertical|center_horizontal" />

android:id="@+id/save_pic"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/txt_save" />

3、别忘了添加权限:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android中拍照功能介绍,Android实现拍照功能相关推荐

  1. android中bmob云存储,Android中的Bmob移动后端云服务器功能

    PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己用servlet作为服务端来实现过滤没有注册过的用户,但是太麻烦,而且不是随时都可以用的.这里介绍一个移动后端云服 ...

  2. android 轮换实现动画,怎么在Android中实现一个首页无限轮播功能

    怎么在Android中实现一个首页无限轮播功能 发布时间:2021-04-12 16:22:49 来源:亿速云 阅读:74 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中实现 ...

  3. keyshot聚光灯_渲染软件Keyshot8新版本功能介绍,这些新功能你都知道吗?

    渲染软件Keyshot8新版本功能介绍,这些新功能你都知道吗? 渲染软件Keyshot已经更新到8版本了,最新版本是Keyshot8,相比于老旧版本,肯定是有了翻天覆地的变化,这些新功能你又了解多少呢 ...

  4. Android中使用Camera类编写手机拍照App的实例教程

    Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下.它主要用于摄像头捕获图片.启动/停止预览图片.拍照.获取视频帧等,它 ...

  5. android 最新功能介绍,Android Studio 常用功能介绍

    界面介绍 讲解1 这个界面,显示了我们使用 Android Studio时经常接触到的功能面板. Project 面板. 用于浏览项目文件. Project 面板会显示当前的所有的 module .  ...

  6. android客服功能介绍,Android 客服工作台 SDK

    Android 客服工作台 SDK 开发工具 目录 build.gradle 配置 添加依赖,在app的build.gradle 中dependencies中加入如下(添加后需同步gradle): a ...

  7. Android中级控件介绍(五)

    一.相对布局RelativeLayout RelativeLayout的下级视图的位置是相对位置,得有具体的参照物才能确定最终位置. 如果不设定下级视图的参照物,那么下级视图默认显示在Relative ...

  8. android获取qq群成员的功能实现的,Android中实现一键推广|加入QQ群功能

    功能实现效果图: 一键推广QQ群.gif 第一步:访问QQ群官方网站 第二步:登录自我QQ 请选择你创建的群 获取你需要的代码(Android代码) 复制代码到Android项目中 qqgroup.p ...

  9. Android中使用httpclient访问服务器,需要session功能

    2019独角兽企业重金招聘Python工程师标准>>> 虽然只有十分但是还是给你写一段 android中测试 跑得了 加点分可以继续追问我哦 呵呵~~~~public static ...

最新文章

  1. 表空间迁移(transport tablespace)测试案例
  2. 对于拷贝构造函数和赋值构造函数的理解
  3. JavaWeb学习总结(十三):使用Session防止表单重复提交
  4. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)
  5. 频谱扩展 matlab,语音信号频谱扩展
  6. ubuntu中文输入法fcitx的安装以及出现方块的解决方法
  7. 7 vsphere 分配许可_外企公司员工Office 365权限是否已分配
  8. npm使用及cmd常用命令
  9. vue 表格固定首行首列(纯css)
  10. 零食行业python数据分析实例——基于淘宝搜索排名分析
  11. python中abs函数是什么意思_python中abs是什么意思
  12. 江苏大学正版Windows和Office全家桶--UJS微软正版化服务平台
  13. 线圈拉链行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  14. 时区(Timezone)一览表
  15. 相机模型、相机标定及基于yolov5的单目测距实现
  16. 2022商业地产百货零售行业IT及数字化转型分析
  17. 高速数据采集卡与AWG任意波形发生器在量子计算中的应用现状
  18. 你真的熟悉8051单片机的引脚功能及其使用吗?
  19. Chrome+ProxySwitchySharp+Putty
  20. 利用ArcGIS制图表达标注输电线开关符号

热门文章

  1. 好的学习习惯-阅读方法有哪些?
  2. C++关于默认构造函数和无参构造函数
  3. 遍历文件夹下文件名 几种方法
  4. nginx-1.20.2 编译安装
  5. 神经网络训练时如何绘制loss的动态曲线
  6. python结巴分词
  7. 【机器学习】onehot编码的各种实现
  8. 结合C4D和AE制作产品广告动画视频教程
  9. deque容器详解,包含源码
  10. verilog D触发器