这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。

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

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><SurfaceViewandroid:id="@+id/surface_view"android:layout_width="match_parent"android:layout_height="match_parent" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ImageViewandroid:id="@+id/start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_alignParentBottom="true"android:layout_marginBottom="10dp"android:src="@drawable/capture"/><TextViewandroid:id="@+id/count_down"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:gravity="center"android:textSize="80sp"/></RelativeLayout>
</FrameLayout>

MainActivity.java

package com.jackie.timercamera;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback,View.OnClickListener, Camera.PictureCallback {private SurfaceView mSurfaceView;private ImageView mIvStart;private TextView mTvCountDown;private SurfaceHolder mHolder;private Camera mCamera;private Handler mHandler = new Handler();private int mCurrentTimer = 10;private boolean mIsSurfaceCreated = false;private boolean mIsTimerRunning = false;private static final int CAMERA_ID = 0; //后置摄像头
//    private static final int CAMERA_ID = 1; //前置摄像头private static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initEvent();}@Overrideprotected void onPause() {super.onPause();stopPreview();}private void initView() {mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);mIvStart = (ImageView) findViewById(R.id.start);mTvCountDown = (TextView) findViewById(R.id.count_down);}private void initEvent() {mHolder = mSurfaceView.getHolder();mHolder.addCallback(this);mIvStart.setOnClickListener(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mIsSurfaceCreated = true;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {startPreview();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mIsSurfaceCreated = false;}private void startPreview() {if (mCamera != null || !mIsSurfaceCreated) {Log.d(TAG, "startPreview will return");return;}mCamera = Camera.open(CAMERA_ID);Camera.Parameters parameters = mCamera.getParameters();int width = getResources().getDisplayMetrics().widthPixels;int height = getResources().getDisplayMetrics().heightPixels;Camera.Size size = getBestPreviewSize(width, height, parameters);if (size != null) {//设置预览分辨率parameters.setPreviewSize(size.width, size.height);//设置保存图片的大小parameters.setPictureSize(size.width, size.height);}//自动对焦parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);parameters.setPreviewFrameRate(20);//设置相机预览方向mCamera.setDisplayOrientation(90);mCamera.setParameters(parameters);try {mCamera.setPreviewDisplay(mHolder);} catch (Exception e) {Log.d(TAG, e.getMessage());}mCamera.startPreview();}private void stopPreview() {//释放Camera对象if (mCamera != null) {try {mCamera.setPreviewDisplay(null);mCamera.stopPreview();mCamera.release();mCamera = null;} catch (Exception e) {Log.e(TAG, e.getMessage());}}}private Camera.Size getBestPreviewSize(int width, int height,Camera.Parameters parameters) {Camera.Size result = null;for (Camera.Size size : parameters.getSupportedPreviewSizes()) {if (size.width <= width && size.height <= height) {if (result == null) {result = size;} else {int resultArea = result.width * result.height;int newArea = size.width * size.height;if (newArea > resultArea) {result = size;}}}}return result;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.start:if (!mIsTimerRunning) {mIsTimerRunning = true;mHandler.post(timerRunnable);}break;}}private Runnable timerRunnable = new Runnable() {@Overridepublic void run() {if (mCurrentTimer > 0) {mTvCountDown.setText(mCurrentTimer + "");mCurrentTimer--;mHandler.postDelayed(timerRunnable, 1000);} else {mTvCountDown.setText("");mCamera.takePicture(null, null, null, MainActivity.this);playSound();mIsTimerRunning = false;mCurrentTimer = 10;}}};@Overridepublic void onPictureTaken(byte[] data, Camera camera) {try {FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory() + File.separator +System.currentTimeMillis() + ".png"));//旋转角度,保证保存的图片方向是对的Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);Matrix matrix = new Matrix();matrix.setRotate(90);bitmap = Bitmap.createBitmap(bitmap, 0, 0,bitmap.getWidth(), bitmap.getHeight(), matrix, true);bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}mCamera.startPreview();}/***   播放系统拍照声音*/public void playSound() {MediaPlayer mediaPlayer = null;AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);int volume = audioManager.getStreamVolume( AudioManager.STREAM_NOTIFICATION);if (volume != 0) {if (mediaPlayer == null)mediaPlayer = MediaPlayer.create(this, Uri.parse("file:///system/media/audio/ui/camera_click.ogg"));if (mediaPlayer != null) {mediaPlayer.start();}}}
}

有两点需要注意:对于Camera来说,默认是横屏的,所以预览的时候和图片保存的时候都是横屏的,需要调整角度。

设置相机预览方法:

//设置相机预览方向
mCamera.setDisplayOrientation(90);
保存图片的时候调整角度:

效果图如下:

Android自定义相机实现定时拍照相关推荐

  1. android 实现自动拍照,Android自定义相机实现定时拍照功能

    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能. 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_main.xml andro ...

  2. android 自定义相机,Android自定义相机实现定时拍照功能

    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能. 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_main.xml andro ...

  3. Android自定义相机拍照、图片裁剪的实现

    原文:Android自定义相机拍照.图片裁剪的实现 最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类 ...

  4. Android自定义相机,切换前后摄像头,照相机拍照

    Android自定义相机,简单实现切换前后摄像头,照相机拍照 Ctrl +C  Ctrl+V 可以直接 run 起来,注释比较详细;源码下载 <?xml version="1.0&qu ...

  5. android 自定义相机源码,Android 自定义相机及分析源码

    Android 自定义相机及分析源码 使用Android 系统相机的方法: 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 action的作用就是声明action ...

  6. android自动对焦第一次对焦,Android自定义相机实现自动对焦和手动对焦

    Android自定义相机实现自动对焦和手动对焦: 不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求. 所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此 ...

  7. Android 自定义相机Demo 入门学习

    Android 自定义相机Demo 本文是参考网上一些自定义相机示例,再结合自己对相机的功能需求写的,基本上包含了很多基本功能,比如相机对焦.闪光灯,以及在手机预览界面上绘制自己想要绘制的图案. 话不 ...

  8. Android 自定义相机 身份证拍照 自定义身份证相机

    项目中需要用到拍摄身份证,拍完照片后直接拿到和身份证比例一致的图片,做成功的结果如下:    拍完照后直接拿到裁剪好的图本文的核心技术来自: https://yq.aliyun.com/article ...

  9. android自定义相机拍照

     Android中开发相机的两种方式: Android系统提供了两种使用手机相机资源实现拍摄功能的方法,一种是直接通过Intent调用系统相机组件,这种方法快速方便,适用于直接获得照片的场景,如上传相 ...

最新文章

  1. oracle取非空,求一条sql,返回分组后,空值取最近一条非空值,非空值取本身
  2. 用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?
  3. A Neural Probabilistic Language Model 论文阅读及实战
  4. Opencv cv2.KalmanFilter 鼠标跟踪
  5. 学好python工资一般多少钱-Python工资多少?就业发展前景怎么样?
  6. cat命令读取一部分_脚本攻略2 --命令之花
  7. kotlin学习笔记——内联函数
  8. [CSS] Use CSS Counters to Create Pure CSS Dynamic Lists
  9. mysql 配置多个数据库连接_总结MySQL修改最大连接数的两个方式
  10. 【现代程序设计】【homework-07】
  11. OPPO全球营销总裁沈义人宣布卸任,网友:第二天宣布入职小米?
  12. JAVA教程下载-JAVA学习视频教程网盘分享
  13. 某工程质量安全监管平台验证码请求参数params加密破解
  14. 系统性的学会 Pandas, 看这一篇就够了!
  15. android平板电脑忘记密码怎么解锁,平板密码忘了怎么解锁
  16. 阅文的作者们,正在进行一场必输的抗争
  17. Java中判断一句英文中有多少个以p开头的单词
  18. 心情不美丽,爬了一些美图,独自欣赏!
  19. 硬链接与软连接的区别_(转)
  20. 2020CTF笔记crypto部分

热门文章

  1. 华为计算机的隐藏应用程序,华为平板5怎么隐藏软件 荣耀5平板怎么隐藏应用程序?...
  2. Android显示横幅样式通知
  3. 父爱动画代码python_python表白实现代码(可视化与动画版)
  4. 漫画人物头像总是画不好?快看看这些注意点你有没有中招!
  5. Hi3531D加载TVP7002驱动模块——新手全过程记录
  6. UnsatisfiedDependencyException: Error creating bean with name ‘personRecordServiceImpl‘:...
  7. 微信小程序 MinUI 组件库系列之 progress 进度条组件
  8. 武夫提笔——席卷世界Nodejs之初步对比:与opa各占几分春色?
  9. 设置计算机ip地址时网关的作用是什么,IP地址小课堂:起到门户作用的网关到底有多重要?...
  10. 系统传输过程中 中文点 · 对方无法解析的问题查找