Android实现摄像头拍照功能

应用场景:

在Android开发过程中,有时需要调用手机自身设备的功能,本文侧重摄像头拍照功能的调用。

知识点介绍:

使用权限:调用手机自身设备功能(摄像头拍照功能),应该确保已经在AndroidManifest.xml中正确声明了对摄像头的使用及其它相关的feature。

<!--摄像头权限 -->
 <uses-permission android:name="android.permission.CAMERA" />
 <!--存储权限  SD卡读写权限 -->
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <!--Camera Feature 声明对camera feature的使用 -->
 <uses-feature android:name="android.hardware.camera" />
 <uses-feature
 android:name="android.hardware.camera.autofocus"
 android:required="false" />
 <!--视频、录音权限  请求音频捕获权限 -->
 <uses-permission android:name="android.permission.RECORD_VIDEO"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

Class类:

1、 SurfaceView
视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。
2、 SurfaceHolder
SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。
3、 SurfaceHolder.Callback
用户可以实现此接口接收surface变化的消息。当用在一个SurfaceView 中时,  它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。设置Callback的方法是SurfaceHolder.addCallback。

使用方式:

第一步:新建一个Android项目CameraTest,包含两个Activity: MainActivity、CameraActivity。

第二步:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:background="#FFFFFF"
 android:layout_height="match_parent"
 tools:context=".MainActivity" >
 <LinearLayout android:layout_height="wrap_content"
 android:layout_width="match_parent">
 <ImageView
 android:id="@+id/main_image"
 android:layout_height="wrap_content"
 android:src="@drawable/ic_launcher"
 android:layout_width="match_parent"/>
 </LinearLayout>
 <LinearLayout
 android:layout_height="wrap_content"
 android:layout_width="match_parent"
 android:layout_alignParentBottom="true"
 android:layout_marginBottom="20dp"
 android:orientation="horizontal">
 <Button android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:id="@+id/main_camera"
 android:text="拍照"/>
 <Button android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:text="退出"
 android:id="@+id/main_quit"/>
 </LinearLayout>
</RelativeLayout>

MainActivity.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; 

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView; 

public class MainActivity extends Activity { 

 private Button cameraButton; //拍照按钮
 private Button quitButton; //退出按钮
 private ImageView imageView; //图片显示 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 initViews();
 } 

 private void initViews() {
 imageView = (ImageView) findViewById(R.id.main_image);
// 从本地取图片(在sdcard中获取文件)
 Bitmap bitmap = getLoacalBitmap("/sdcard/mhc.jpg");
 Log.e("msgTag", new File("/sdcard/mhc.jpg").exists()+"==========");
 imageView .setImageBitmap(bitmap); //设置Bitmap
 cameraButton = (Button) findViewById(R.id.main_camera);
 quitButton = (Button) findViewById(R.id.main_quit);
 MainOnClickListener mainOnClickListener = new MainOnClickListener();
 cameraButton.setOnClickListener(mainOnClickListener);
 quitButton.setOnClickListener(mainOnClickListener);
 } 

 private class MainOnClickListener implements OnClickListener{ 

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
 case R.id.main_camera:
 startActivity(new Intent(MainActivity.this, CameraActivity.class));
 break;
 case R.id.main_quit:
 MainActivity.this.finish();
 break;
 default:
 break;
 }
 }
 } 

 /**
 * 根据文件路径获取所需要文件,并将该文件封装成Bitmap对象返回
 * @param fileUrl
 * @return
 */
 public static Bitmap getLoacalBitmap(String fileUrl) {
 try {
 FileInputStream fis = new FileInputStream(fileUrl);
 return BitmapFactory.decodeStream(fis); ///把流转化为Bitmap图片
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 return null;
 }
 }
}

activity_camera.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#FFFFFF"
 tools:context=".CameraActivity" > 

 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent" >
 <SurfaceView
 android:id="@+id/camera_preview"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_gravity="center_vertical|center_horizontal" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignParentBottom="true">
 <Button
 android:id="@+id/camera_save"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="拍照" />
 </LinearLayout>
</RelativeLayout> 

CameraActivity.java

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; 

import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; 

public class CameraActivity extends Activity {
 private String tag ="CameraActivity";
 private SurfaceView surfaceView;
 //Surface的控制器
 private SurfaceHolder surfaceHolder;
 private Camera camera;
 private Button saveButton;
 //拍照的回调接口
 private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera camera) {
 new SavePictureTask().execute(data);
 camera.startPreview();
 }
 }; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_camera);
 initViews();
 } 

 private void initViews() {
 saveButton = (Button) findViewById(R.id.camera_save);
 surfaceView = (SurfaceView) findViewById(R.id.camera_preview);
 surfaceHolder = surfaceView.getHolder();
 // 给SurfaceView当前的持有者 SurfaceHolder 一个回调对象。
 //用户可以实现此接口接收surface变化的消息。当用在一个SurfaceView 中时,
 //它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。
 //设置Callback的方法是SurfaceHolder.addCallback.
 //实现过程一般继承SurfaceView并实现SurfaceHolder.Callback接口
 surfaceHolder.addCallback(surfaceCallback);
 // 设置surface不需要自己的维护缓存区
 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 saveButton.setOnClickListener(new OnClickListener() { 

 @Override
 public void onClick(View v) {
 camera.takePicture(null, null, pictureCallback);
// Camera.takePicture(shutterCallback,rawCallback,pictureCallback );
// private ShutterCallback shutterCallback = new ShutterCallback(){
//  public void onShutter(){
//  /* 按快门瞬间会执行这里的代码 */
//  }
//  };
// private PictureCallback rawCallback = new PictureCallback(){
//  public void onPictureTaken(byte[] _data, Camera _camera){
//  /* 如需要处理 raw 则在这里 写代码 */
//  }
//  };
//  //当拍照后 存储JPG文件到 sd卡
//  PictureCallback pictureCallback=new PictureCallback(){
//  public void onPictureTaken(byte[] data,Camera camera) {
//  FileOutputStream outSteam=null;
//  try{
//  SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
//  String times=format.format((new Date()));
//  outSteam=new FileOutputStream("/sdcard/"+times+"mhc.jpg");
//  outSteam.write(data);
//  outSteam.close();
//  }catch(FileNotFoundException e){
//  Log.d("Camera", "row");
//  } catch (IOException e) {
//  e.printStackTrace();
//  }
//  };
//  };
 }
 });
 } 

 //SurfaceView当前的持有者的回调接口的实现
 SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { 

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
 camera = Camera.open();
 Log.e(tag, "摄像头Open完成");
 try {
 camera.setPreviewDisplay(holder);
 } catch (IOException e) {
 camera.release();
 camera = null;
 }
 } 

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
 int height) {
 Camera.Parameters parameters = camera.getParameters();
 parameters.setPictureFormat(ImageFormat.JPEG);
 camera.setDisplayOrientation(0);
 camera.setParameters(parameters);
 camera.startPreview();
 } 

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
 camera.stopPreview();
 camera.release();
 camera = null;
 }
 }; 

 class SavePictureTask extends AsyncTask<byte[], String, String> {
 @Override
 protected String doInBackground(byte[]... params) {
 File picture = new File("/sdcard/mhc.jpg");
 try {
 FileOutputStream fos = new FileOutputStream(picture.getPath());
 fos.write(params[0]);
 fos.close();
 } catch (Exception e) {
 e.printStackTrace();
 }
 Log.e(tag, "照片保存完成");
 CameraActivity.this.finish();
 return null;
 }
 }
}

下载地址:Android实现摄像头拍照功能

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

您可能感兴趣的文章:

  • Android 实现调用系统照相机拍照和录像的功能
  • Android 调用系统照相机拍照和录像
  • Android自定义照相机倒计时拍照
  • Android调用系统摄像头拍照并显示在ImageView上
  • Android实现调用摄像头拍照与视频功能
  • Android调用摄像头拍照开发教程
  • Android实现调用摄像头进行拍照功能
  • Android实现拍照、选择图片并裁剪图片功能
  • Android调用系统照相机拍照与摄像的方法
(0)

相关推荐

  • Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

  • Android调用系统照相机拍照与摄像的方法

    前言 在很多场景中,都需要用到摄像头去拍摄照片或视频,在照片或视频的基础之上进行处理.但是Android系统源码是开源的,很多设备厂商均可使用,并且定制比较混乱.一般而言,在需要用到摄像头拍照或摄像的时候,均会直接调用系统现有的相机应用,去进行拍照或摄像,我们只取它拍摄的结果进行处理,这样避免了不同设备的摄像头的一些细节问题.本篇博客将介绍在Android应用中,如何调用系统现有的相机应用去拍摄照片与短片,并对其进行处理,最后均会以一个简单的Demo来演示效果. 1.系统现有相机应用的调用 对于

  • Android调用系统摄像头拍照并显示在ImageView上

    简介 现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统摄像头拍照并获取即时照片,本博文就是讲述如何调用摄像头拍照并显示在指定的控件上. 先来看看效果图 由于这里我用的是模拟器没有摄像头,所以拍照是黑的,至于里面2个红色圆圈那是Genymotion自带的标志. 实现起来比较简单: activity_main.xml <?xml version="1.0" encoding="utf-8

  • Android调用摄像头拍照开发教程

    现在很多应用中都会要求用户上传一张图片来作为头像,首先我在这接收使用相机拍照和在相册中选择图片.接下来先上效果图: 接下来看代码: 1.布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem

  • Android 实现调用系统照相机拍照和录像的功能

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

  • Android自定义照相机倒计时拍照

    自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 相关教程:Android开发从相机或相册获取图片裁剪 Android启动相机拍照并返回图片 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&qu

  • Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置.下图为使用Android-Crop实现的模仿微信选择图片并裁剪Demo. 三. 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径: 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图

  • Android实现调用摄像头进行拍照功能

    现在Android智能手机的像素都会提供照相的功能,大部分的手机的摄像头的像素都在1000万以上的像素,有的甚至会更高.它们大多都会支持光学变焦.曝光以及快门等等. 下面的程序Demo实例示范了使用Camera v2来进行拍照,当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片. layout/activity_main.xml界面布局代码如下: <?xml version="1.0" encoding="utf-8"?> <manifes

  • Android实现调用摄像头拍照与视频功能

    应用场景: 在Android开发过程中,有时需要调用手机自身设备的功能,上篇文章主要侧重摄像头拍照功能的调用.本篇文章将综合实现拍照与视频的操作. 知识点介绍: 该部分请阅读 [Android 调用摄像头功能] 使用方式: 第一步: 新建一个Android项目CameraPhotoVedio,包含两个Activity: MainActivity.CameraActivity. 第二步: activity_main.xml <RelativeLayout xmlns:android="htt

  • Android实现摄像头拍照功能

    应用场景: 在Android开发过程中,有时需要调用手机自身设备的功能,本文侧重摄像头拍照功能的调用. 知识点介绍: 使用权限:调用手机自身设备功能(摄像头拍照功能),应该确保已经在AndroidManifest.xml中正确声明了对摄像头的使用及其它相关的feature. <!--摄像头权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!--存储权限 SD卡读写权限

  • Android编程实现拍照功能的2种方法分析

    本文实例讲述了Android编程实现拍照功能的2种方法.分享给大家供大家参考,具体如下: Android系统的照相功能,已实现2种方法,可供大家参考: 1. 调用系统摄像头来拍照 首先,找到AndroidManifest.xml文件里加入用户权限 <uses-permission android:name="android.permission.CAMERA"></uses-permission> <uses-feature android:name=&q

  • Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Camera.open(0); 3)把相机添加到mPreView = new SurfacePreView(this, mCamera); 4)实现拍照 mCamera.autoFocus 5)在拍照后使用mCamera.takePicture(null, null, mPicture);方法把图片保存

  • Android实现静默拍照功能

    本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下 1.申请权限(6.0以后要动态申请) <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission and

  • Android调用手机拍照功能的方法

    本文实例讲述了Android调用手机拍照功能的方法.分享给大家供大家参考.具体如下: 一.main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" andr

  • Android实现手机拍照功能

    本文实例为大家讲解如何轻松实现Android手机拍照功能,分享给大家供大家参考.具体如下: 一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"

  • android实现简单拍照功能

    拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录.最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊.可能是图片被压缩的太狠了.所以自己使用Camera写了一个拍照的功能,拍出来的还挺清晰的,不过文件有点大一张图片差不多1.7M.如果想拍高清图可以使用下面的代码. 代码很简单,我就不做过多解释了. package com.example.testsimple; import java.io.File; import java.

  • android实现定时拍照功能

    在手机上面实现,设置一段时间(以秒计时)之后,自动拍照,适用于摄影师建立一个场景,之后设置时间,再进入场景. 界面主要就是一个设置时间的EditText和启动倒计时的Button,设置完时间之后,点击倒计时按钮. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frameLayout" android:layout_width=&q

  • c#实现摄像头拍照功能示例

    复制代码 代码如下: using System.Drawing;using System.Drawing.Imaging;using System;using System.Runtime.InteropServices; 复制代码 代码如下: private const int WM_USER = 0x400;private const int WS_CHILD = 0x40000000;private const int WS_VISIBLE = 0x10000000;private con

随机推荐