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

自定义拍照会用到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;

}

}

}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【经典回放】多种语言系列数据结构算法:树(C#、JavaScript、VB6版)

目 录 一、树的C#语言实现以及显示 二、树的JavaScript语言实现以及显示 三、树的VB6语言实现以及显示 一、树的C#语言实现以及显示 1

『技术群里聊些啥』查看 dotnet 源码,用它!用它!用它!

前言有网友在交流群中询问&#xff0c;怎么找到 System.Linq 源码的库&#xff1a;其实&#xff0c;我一直使用http://source.dot.net查看 dotnet 源码&#xff0c;这可是David Fowler&#xff08;微软 .NET 架构师&#xff09;也推荐的&#xff1a;功能演示那它到底有哪些功能…

Android之解决PC浏览器上传表单文件到手机服务器read数据错误导致有时候下载到手机的文件打开文字错乱问题

1 、问题 手机客户端app通过java socket写了一个服务器,然后PC端通过浏览器访问服务端显示上传页面(这些资源都在手机端),然后其中有一个功能是PC端上传文件到手机服务器,然后把这个文件下载到手机本地,但是我有时候PC上传的文件打文字会错乱。 2、http的表单文件上传文…

javadoc注释规范

javadoc注释规范 javadoc做注释 一. Java 文档 // 注释一行 /* ...... */ 注释若干行 /** ...... */ 注释若干行&#xff0c;并写入 javadoc 文档 通常这种注释的多行写法如下&#xff1a; /** * ......... * ......... */ javadoc -d 文档存放目录 -author -version 源文件名.…

(7)3分钟搞定 C# 逻辑运算

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:二叉树(C#版)

实验任务描述 1 用C#语言完成二叉树的类、并构造出一个二叉树; 2 用递归方法完成二叉树的遍历; 3 泛型的二叉树遍历之一、用队列给出遍历结果 4 泛型的二叉树遍历之二、委托方式给出二叉树遍历结果 1 二叉树类的设计 同C语言一样,要构建一个二叉树,要用到类似struct的东西…

ThinkPHP讲解(十二)——文本编辑器和ajax传址

一、文本编辑器 1.首先&#xff0c;在网上下载ueditor文件 2.在要添加文本编辑器的页面中引用ueditor文件中的js文件 <script type"text/javascript" charset"utf-8" src"../ueditor/utf8-php/ueditor.config.js"></script> <scr…

(8)小白又如何?3分钟搞定一个 C# 知识点

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

Android之解决PC端上传http表单格式文件手机解析文件名乱码问题和PC浏览器下载文件的文件名显示乱码问题

1 问题 问题1、 手机写socket作为服务器,PC浏览器上传http表单格式文件,然后手机端解析携带中文的文件名我解析是乱码。 问题2、 手机写了socket作为服务器,PC浏览器下载文件,但是浏览器里面的文件名有中文的时候会有乱码。 2 分析 问题1分析 User-Agent: PostmanRun…

华为鸿蒙vogtloop30pro价格,华为Mate30系列基本确认:首发麒麟985+鸿蒙系统,价格感人!...

原标题&#xff1a;华为Mate30系列基本确认&#xff1a;首发麒麟985鸿蒙系统&#xff0c;价格感人&#xff01;转眼间即将步入6月份&#xff0c;近期关于各大厂商下半年的新机消息也是多了起来&#xff0c;就拿华为下半年的高端旗舰华为Mate30系列来说&#xff0c;在各方媒体的…

[不一样的依赖注入]容器与服务周期的结合

微信公众号&#xff1a;趣编程ACE关注可了解更多的.Net日常开发技巧&#xff0c;如需源码请后台留言 源码;如果觉得本公众号对您有帮助&#xff0c;欢迎关注前文回顾[不一样的依赖注入]通过递归实现容器里依赖注入不一样的依赖注入 创建周期的加入首先创建一个依赖提供类&#…

(11)python里面while到底有多少知识点

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版)

1 二叉树类的设计以及二叉树遍历 要完成二叉树的类设计&#xff0c;最好把链表下的Node.js复制过来&#xff0c;相比链表的结点&#xff0c;二叉树仅仅是多了一个结点指针而已。略加修改后&#xff0c;就是&#xff1a; function TNODE(DATA) { this.DataDATA; this.lChildnu…

Fiddler之解决https链接返回数据显示乱码问题

1 、问题 我网页访问淘宝&#xff0c;然后F12查看关键链接&#xff0c;返回的数据里面有json各式的数据&#xff0c;然后我通过关键字在Fiddler里面找到链接&#xff0c;然后查看返回的内容是乱码。 2 、解决办法 然后这样设置&#xff0c;再去查看SyntaxView或者Raw都可以看到…

android上传图片被旋转,input上传照片旋转解决办法

需求很简单&#xff1a;h5拍照上传照片&#xff0c;然后显示出来问题在&#xff1a;上传之后的图片在PC&#xff0c;IOS端均能正常显示&#xff0c;Android端显示的则是被旋转90度的。直接上代码下面这个方法传入file对象&#xff0c;然后会去除掉照片中的exIf信息&#xff0c;…

(12)python 的列表我从没想过会那么好用

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

如何优雅的跨 Namespace 同步 Secret 和 ConfigMap?

Secret 和 ConfigMap 资源对象是命名空间级别的。它们只能被同一命名空间中的 Pod 引用。所以有时候不得不手动为每个命名空间创建它们。但有很多场景&#xff0c;我们想让它们是全局的&#xff0c;至少可以是跨命名空间共享的 Secret 和 ConfigMap&#xff0c;例如这些场景&am…

定量遥感:计算地方时和太阳高度角(C++代码)

在定量遥感中,通常需要计算地方时和太阳高度角,本文采用C++语言实现。 #include <cmath> #include <iostream> #include <fstream> using namespace std; void main() {int JD,NF,Y,R,s[5],F[5];float JF,WD;float N0;ifstream data1("d:\\result\\da…

html5 语义化标签

html5 语义化标签 在HTML 5出来之前&#xff0c;我们用div来表示页面章节&#xff0c;但是这些div都没有实际意义。&#xff08;即使我们用css样式的id和class形容这块内容的意义&#xff09;。这些标签只是我们提供给浏览器的指令&#xff0c;只是定义一个网页的某些部分。但…

Android之实现首尾带圆角的多颜色水平条

1 效果图 3 代码实现 这里我们采用PercentRelativeLayout布局,首尾我们用半圆shape实现,代码如下 color.xml <color name="progress_first">#1ebBd5</color><color name="progress_second">#f36f53</color><color name=&…