自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件:

两个TextView是用来显示提示信息和倒计时的秒数的

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#266194"

android:orientation="vertical"

tools:context=".TestActivity" >

android:id="@+id/surfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_centerInParent="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:orientation="vertical" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="请调整位置到此区域"

android:textColor="#ff0000"

android:textSize="32sp" />

android:id="@+id/tv_time"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingTop="10dp"

android:gravity="center_horizontal"

android:textColor="#266194"

android:textSize="32sp" />

接下来是mainActivity中的具体实现以及详细注释:

package com.dhsr.pujiejia.ui;

import java.io.File;

import java.io.FileOutputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.res.Configuration;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.hardware.Camera.CameraInfo;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;

import android.view.WindowManager;

import android.widget.TextView;

import com.example.pujiejiaapp.R;

@SuppressLint({ "NewApi", "SdCardPath" })

public class CameraActivity extends Activity implements Runnable {

// 预览图片范围

private SurfaceView surfaceView;

private TextView tv_time;

// 倒计时拍摄

private int cameratime = 4;

private Camera camera;

private boolean preview = false;

// 文件名字

private String filename;

// 文件名字的带的时间戳

private String timeString;

// 格式化时间

private SimpleDateFormat dateFormat;

// 日期对象

private Date date;

// 控制线程

boolean stopThread = false;

private File file;

String photo;

private Handler mHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

int what = msg.what;

switch (what) {

case 222:

tv_time.setText("" + cameratime);

if ("0".equals(tv_time.getText().toString())) {

tv_time.setText("拍摄成功!");

takePhoto();

}

break;

}

};

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

CameraActivity.this.setFinishOnTouchOutside(false);

// 初始化数据

findView();

surfaceView.getHolder().addCallback(new SufaceListener());

/* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */

surfaceView.getHolder()

.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView.getHolder().setFixedSize(200, 200); // 设置分辨率

}

@Override

protected void onStart() {

// TODO Auto-generated method stub

super.onStart();

// 开启线程

new Thread(this).start();

}

private final class SufaceListener implements SurfaceHolder.Callback {

/**

* surface改变

*/

@Override

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

int height) {

}

/**

* surface创建

*/

@Override

public void surfaceCreated(SurfaceHolder holder) {

try {

for (int i = 0; i < Camera.getNumberOfCameras(); i++) {

CameraInfo info = new CameraInfo();

Camera.getCameraInfo(i, info);

// 调用系统的前置摄像头

if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {

camera = Camera.open(i);

}

}

Camera.Parameters parameters = camera.getParameters();

/* 每秒从摄像头捕获5帧画面, */

parameters.setPreviewFrameRate(5);

/* 设置照片的输出格式:jpg */

parameters.setPictureFormat(PixelFormat.JPEG);

/* 照片质量 */

parameters.set("jpeg-quality", 85);

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

camera.setParameters(parameters);

camera.setPreviewDisplay(surfaceView.getHolder());// 通过SurfaceView显示取景画面

camera.startPreview();

preview = true;

} catch (Exception e) {

}

}

/**

* surface销毁

*/

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if (camera != null) {

if (preview)

camera.stopPreview();

camera.release();

camera = null;

}

}

}

/**

* 拍摄照片

*/

private void takePhoto() {

// 执行拍照效果

camera.takePicture(null, null, new Camera.PictureCallback() {

@Override

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

try {

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,

data.length);

timeString = formatDate();

//保存到data/data目录自定义文件夹下

filename = "/data/data/com.example.pujiejiaapp/images/"

+ timeString + ".jpg";

File file = new File(filename);

boolean createNewFile = file.createNewFile()

System.out.println("创建文件夹成功没有" + createNewFile);

System.out.println(file);

FileOutputStream outStream = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);

outStream.flush();

outStream.close();

// 重新浏览

camera.stopPreview();

camera.startPreview();

preview = true;

} catch (Exception e) {

e.printStackTrace();

} finally {

}

}

});

}

@Override

public void run() {

while (!stopThread) {

try {

//按秒数倒计时

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

cameratime--;

mHandler.sendEmptyMessage(222);

if (cameratime <= 0) {

break;

}

}

}

// 初始化数据

private void findView() {

surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);

tv_time = (TextView) findViewById(R.id.tv_time);

}

// 格式化系统的时间

public String formatDate() {

date = new Date(System.currentTimeMillis());

// 日期格式

dateFormat = new SimpleDateFormat("'IMG'_yyyyMMddHHmmss");

return dateFormat.format(date);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

// 线程已关闭

super.onDestroy();

stopThread = true;

}

}

核心代码详解:

1.创建SurfaceView时,surfaceCreated()方法中

for (int i = 0; i < Camera.getNumberOfCameras(); i++) {

CameraInfo info = new CameraInfo();

Camera.getCameraInfo(i, info);

// 调用系统的前置摄像头

if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {

camera = Camera.open(i);

}

}

此部分代码为打开相机时默认打开前置摄像头CameraInfo.CAMERA_FACING_BACK为默认打开后置摄像头,CameraInfo.CAMERA_FACING_FRONT前置摄像头

2.照片拍摄takePhoto()方法中:

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,

data.length);

timeString = formatDate();

filename = "/data/data/com.example.pujiejiaapp/images/"

+ timeString + ".jpg";

photo = timeString + ".jpg";

File file = new File(filename);

boolean createNewFile = file.createNewFile();

FileOutputStream outStream = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);

此部分代码为将拍摄到的图片保存为以bitmap格式保存在指定的目录下

3.开子线程用于倒计时拍摄

public void run() {

while (!stopThread) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

cameratime--;

mHandler.sendEmptyMessage(222);

if (cameratime <= 0) {

break;

}

}

}

希望大家理解核心代码的详细注释,欢迎提供意见,希望能给大家带来帮助,谢谢!

Android图片上倒计时,Android自定义照相机倒计时拍照相关推荐

  1. php android 图片上传,android上传图片到PHP的过程详解

    这篇文章主要介绍了android上传图片到PHP的过程详解,需要的朋友可以参考下 今天在做上传头像的时候,总是提交连接超时错误,报错信息如下:XXXXXXSokcetTimeOutXXXXXXXX 然 ...

  2. 强烈推荐:Android史上最强大的自定义任务软件Tasker

    强烈推荐:Android史上最强大的自定义任务软件Tasker http://bbs.mumayi.com/thread-28387-1-1.html (出处: 木蚂蚁手机乐园) Android上的T ...

  3. 图片上传压缩android,android 图片上传压缩常见问题分析

    图片的上传与压缩是android经常需要用到的步骤,那么,如何解决上传图片oom问题呢?android 图片上传压缩常见问题分析,希望可以帮助大家更加的了解android 图片方面的困惑. 下面,是我 ...

  4. android倒计时dialog,自定义带倒计时的Dialog

    1.[文件] CustomDiaglog.rar ~ 56KB     下载(206) 2.[图片] 豌豆荚截图20121103224745.png 3.[代码]Dialog核心代码 package ...

  5. android 自定义图片上传,android自定义ImageView仿图片上传示例

    看下效果图 主要看下自定义view 代码 public class ProcessImageView extends ImageView{ private Context context; priva ...

  6. android 自定义图片上传,android自定义ImageView仿图片上传(示例代码)

    Activity代码 1 public classMainActivity extends AppCompatActivity {2     ProcessImageView processImage ...

  7. android 图片预览动画,Android图片上传实现预览效果

    首先具体分析一下,实现的功能,其中需求分析是必不可少的,需求.逻辑清除之后,再上手写代码,思路会很清晰. 1.多图上传首先得选择图片(这里项目需求是既可以拍照上传也可以从相册中选择) 2.拍照上传很简 ...

  8. Android图片上传(头像裁切+原图原样)

    还是那句话,最近项目比较忙拖了很久这篇文章终于完成了! 先看一下效果图: (一)头像裁切.上传服务器(效果图) 一般都是有圆形显示头像的,这里我自定义了一个ImageView,页面很干净但是看着很上档 ...

  9. Android自定义照相机实现 拍照 录像

    文档中的Camera 要使用Camera,首先我们先看一下文档(http://androiddoc.qiniudn.com/reference/android/hardware/Camera.html ...

最新文章

  1. python 速度矢量_最近邻搜索4D空间python快速-矢量化
  2. 如何在SAP云平台上使用MongoDB服务
  3. 详细介绍springData
  4. 超详细的CentOS7中安装Git,yum安装和自己编译安装
  5. Android之WebView学习
  6. numpy存储特征:消耗内存和计算速度测试
  7. Oracle : 使用JDBC连接ORACLE的三种URL格式
  8. Java基础学习总结(136)——有关流资源关闭(try-with-resources与AutoCloseable)的使用总结
  9. 湖州机器人上课时间_【倒计时5天】燃到炸!湖州吾悦广场10月30日开业狂欢指南,请收下...
  10. 机器学习/深度学习测试题(一) —— 单层感知器的激活函数
  11. 机器学习基石PLA相关
  12. 学习嵌入式和单片机有没有必要,价值体现在哪
  13. jQuery - 添加元素
  14. python 处理xls遇到的坑
  15. 华为杯2020-2021年数学建模大赛题目分享
  16. php输出excel乱码,如何解决php导出excel乱码的问题
  17. 短信服务器和运营商的区别,什么是短信服务商?与短信运营商的区别
  18. WEB-互补色与对比色的计算与获取 (实用、赞)
  19. UVa 10066 - The Twin Towers
  20. linux下qt打印功能如何实现,Qt Graphics-View的打印功能实现

热门文章

  1. .NET团队送给.NET开发人员的云原生学习资源
  2. Asp.Net Core之Identity应用(下篇)
  3. GraphQL:面对复杂类型
  4. .NET与鲲鹏共展翅,昇腾九万里(二)
  5. Asp.Net Core下的开源任务调度平台ScheduleMaster
  6. 提升Azure App Service的几个建议
  7. 程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
  8. .NET Core 3.0稳定版发布
  9. 微软发布新的 Azure Pipelines 功能和集成
  10. 大部分Intel hardware intrinsic 将在 .NET Core 2.1 中启用