Android 开发随手笔记之使用摄像头拍照

在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面。

我们要添加如下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

1、调用系统Camera

调用系统自带的Camera主要的步骤为:

(1)构造图片存储的路径名

(2)使用Intent启动Camera Activity

(3)将拍摄的图片写入到文件

(4)将图片显示在MainActivity中

首先,构造图片名:

File filePath = new File(Environment.getExternalStorageDirectory(), "myCamera");
if(!filePath.exists()){
 filePath.mkdirs();
}
fileName = new File(filePath, System.currentTimeMillis() + ".jpg");
try{
 if(!fileName.exists()){
  fileName.createNewFile();
 }
}catch (Exception e){
 e.printStackTrace();
}

然后,启动Camera Activity:

// intent用来启动系统自带的Camera
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 将系统Camera的拍摄结果写入到文件
 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(fileName));
// 启动intent对应的Activity,返回默认消息
 startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);

最后,将图片显示在MainActivity内。这时,我们通过重载onActivityResult()方法来获取Camera返回的消息。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
 if(requestCode == Activity.DEFAULT_KEYS_DIALER){
  // MainActivity接收Camera返回的消息,然后将已经写入的图片显示在ImageView内
  imageView.setImageURI(Uri.fromFile(fileName));
 }
}

完整代码为:

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
public class MainActivity extends Activity {
 private File fileName = null;
 private Button button;
 private ImageView imageView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  button = (Button)findViewById(R.id.button);
  imageView = (ImageView)findViewById(R.id.imageView);
  button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    File filePath = new File(Environment.getExternalStorageDirectory(), "myCamera");
    if(!filePath.exists()){
     filePath.mkdirs();
    }
    fileName = new File(filePath, System.currentTimeMillis() + ".jpg");
    try{
     if(!fileName.exists()){
      fileName.createNewFile();
     }
    }catch (Exception e){
     e.printStackTrace();
    }
    // intent用来启动系统自带的Camera
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // 将系统Camera的拍摄结果写入到文件
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(fileName));
    // 启动intent对应的Activity,返回默认消息
    startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);
   }
  });
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data){
  if(requestCode == Activity.DEFAULT_KEYS_DIALER){
   // MainActivity接收Camera返回的消息,然后将已经写入的图片显示在ImageView内
   imageView.setImageURI(Uri.fromFile(fileName));
  }
 }
}

2、自己写一个摄像界面

自己写摄像的界面,主要应用了SurfaceView来显示摄像机的画面。然后通过一个Button来保存当前的画面。

同样的,我们需要添加camera和SDCard权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

首先,我们初始化这个SurfaceView,为这个SurfaceView添加一个对应的Callback即可:

private SurfaceView surfaceView;
private SurfaceHolder.Callback callback;
surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
 callback = new SurfaceHolder.Callback(){
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
   startCamera(); // 用于启动摄像头
  }
  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  }
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
   stopCamera(); // 用于关闭摄像头
  }
 };
 surfaceView.getHolder().addCallback(callback); // 将Callback绑定到SurfaceView

在启动摄像头的时候,首先打开摄像头连接,然后将其图像输出到SurfaceView上,然后启动摄像头预览即可在SurfaceView上显示摄像头的画面,这里的画面和实际画面相差有90度,所以我们需要将图像旋转90度之后才可以和拍摄的物体方向一致。

在关闭摄像头时,只要停止预览,然后释放摄像头资源即可。

public void startCamera(){
 camera = Camera.open();
 try {
  camera.setPreviewDisplay(surfaceView.getHolder());
  camera.setDisplayOrientation(90);
  camera.startPreview();
 } catch (IOException e) {
  e.printStackTrace();
 }
}
public void stopCamera(){
 camera.stopPreview();
 camera.release();
 camera = null;
}

最后,是将拍摄到的图片保存到SDCard,我们单击Button来拍摄图片,调用Camera.takePicture()方法,其原型为:

/**
  * Equivalent to takePicture(shutter, raw, null, jpeg).
  *
  * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)
  */
 public final void takePicture(ShutterCallback shutter, PictureCallback raw,
   PictureCallback jpeg) {
  takePicture(shutter, raw, null, jpeg);
 }

其中,shutter为按快门瞬间的回调,就是说按快门瞬间会调用ShutterCallback.onShutter()方法。raw是未压缩的图像的回调,即处理图像原始数据的时候会调用PictureCallback.onPictureTaken()方法。jpeg为处理JPEG图片时候的回调,即我们需要将图像数据按照jpg格式保存的时候会调用这个方法,PictureCallback.onPIctureTaken()。这里我们就调用了这个方法,从而将jpg图片存储到SDCard上。

button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
   camera.takePicture(null, null, new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
     try {
      File filePath = new File(Environment.getExternalStorageDirectory(), "myCamera");
      if(!filePath.exists()) {
       filePath.mkdirs();
      }
      File fileName = new File(filePath, System.currentTimeMillis() + ".jpg");
      fileName.createNewFile();
      FileOutputStream fos = new FileOutputStream(fileName);
      fos.write(data);
      fos.flush();
      fos.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   });
  }
 });

这样,我们便实现了用SurfaceView预览摄像头画面,点击Button将当前预览保存到SDCard中。

完整代码如下:

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends Activity {
 private Camera camera;
 private Button button;
 private SurfaceView surfaceView;
 private SurfaceHolder.Callback callback;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  button = (Button)findViewById(R.id.button);
  surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
  callback = new SurfaceHolder.Callback(){
   @Override
   public void surfaceCreated(SurfaceHolder holder) {
    startCamera();
   }
   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
   }
   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
    stopCamera();
   }
  };
  surfaceView.getHolder().addCallback(callback);
  button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    camera.takePicture(null, null, new Camera.PictureCallback() {
     @Override
     public void onPictureTaken(byte[] data, Camera camera) {
      try {
       File filePath = new File(Environment.getExternalStorageDirectory(), "myCamera");
       if(!filePath.exists()) {
        filePath.mkdirs();
       }
       File fileName = new File(filePath, System.currentTimeMillis() + ".jpg");
       fileName.createNewFile();
       FileOutputStream fos = new FileOutputStream(fileName);
       fos.write(data);
       fos.flush();
       fos.close();
      } catch (IOException e) {
       e.printStackTrace();
      }
     }
    });
   }
  });
 }
 public void startCamera(){
  camera = Camera.open();
  try {
   camera.setPreviewDisplay(surfaceView.getHolder());
   camera.setDisplayOrientation(90);
   camera.startPreview();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void stopCamera(){
  camera.stopPreview();
  camera.release();
  camera = null;
 }
}

以上所述是本文给大家介绍的关于Android 开发随手笔记之使用摄像头拍照的全部内容,希望大家喜欢。

(0)

相关推荐

  • Android判断用户是否允许了摄像头权限实例代码

    如题,既然是判断用户是否允许了摄像头权限,那么,咱们就忽略是Manifest配置的问题,因为这是开发者的事. 用户在使用APP时,如果首次进入用摄像头的地方,手机会提示是否允许该应用使用摄像头.有些用户小手一抖.或者压根就不想开启摄像头,咔擦,就给你关了,那好了.下回再进入该功能,就会出现APP一片黑,或者崩溃的情况. 作为开发者,正常思路是要提示用户,摄像头权限被你关了,赶紧去手动开启,不然,就别想用该功能了!那,咱们该怎么实现这个思路呢? 一.判断摄像头权限 Android API没提供判断

  • Android中判断是否有前置摄像头、后置摄像头的方法

    通常我们进行摄像头操作,如扫描二维码需要判断是否有后置摄像头(Rear camera),比如Nexus 7 一代就没有后置摄像头,这样在尝试使用的时候,我们需要进行判断进行一些提示或者处理. 以下代码为一系列的方法,用来判断是否有前置摄像头(Front Camera),后置摄像头. 复制代码 代码如下: private static boolean checkCameraFacing(final int facing) {     if (getSdkVersion() < Build.VERS

  • Android编程实现摄像头临摹效果的方法

    本文实例讲述了Android编程实现摄像头临摹效果的方法.分享给大家供大家参考,具体如下: 这篇文章结合本人的开发实例,介绍如何实现摄像头临摹效果,即将摄像头拍摄的画面作为临摹的物体投射到画纸上,用户可以在画纸上继续作画,效果如图1. 主要可以分成四步,第一步在AndroidManifest.xml文件里添加对摄像机的使用许可. <uses-permissionandroid:name="android.permission.CAMERA"/> 第二步在布局文件里使用fra

  • Android实现手机摄像头的自动对焦

    如何实现Android相机的自动对焦,而且是连续自动对焦的.当然直接调用系统相机就不用说了,那个很简单的.下面我们主要来看看如如何自己实现一个相机,并且实现自动连续对焦. 代码如下: public class MainActivity extends Activity { private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private boolean flag = false; private Strin

  • Android实现调用摄像头

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

  • Android调用前后摄像头同时工作实例代码

    硬件环境:小米4 Android版本:6.0 咱们先看效果图: 我把代码贴出来: AndroidMainfest.xml文件(需要新增camera权限): <uses-permission android:name="android.permission.CAMERA" /> activity_main.xml文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayo

  • Android开发教程之调用摄像头功能的方法详解

    本文实例讲述了Android调用摄像头功能的方法.分享给大家供大家参考,具体如下: 我们要调用摄像头的拍照功能,显然 第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码 摄像头权限: <uses-permission android:name="android.permission.CAMERA"/> SD卡读写权限: <uses-permission androi

  • android开发之调用手机的摄像头使用MediaRecorder录像并播放

    我们玩玩手机的录像功能吧.做个DEMO. 看看录制过程: 复制代码 代码如下: mediarecorder = new MediaRecorder();// 创建mediarecorder对象 // 设置录制视频源为Camera(相机) mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 mediarecorder.setOutputFo

  • Android 开发随手笔记之使用摄像头拍照

    在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> 1.调用系统Camera 调用系统

  • Android开发实现ImageView加载摄像头拍摄的大图功能

    本文实例讲述了Android开发实现ImageView加载摄像头拍摄的大图功能.分享给大家供大家参考,具体如下: 这个方法是从官方demo中摘录的,在此记录学习. 权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera2" android:re

  • Android开发学习笔记之通过API接口将LaTex数学函数表达式转化为图片形式

    本文将讲解如何通过codecogs.com和Google.com提供的API接口来将LaTeX数学函数表达式转化为图片形式.具体思路如下: (1)通过EditText获取用户输入的LaTeX数学表达式,然后对表达式格式化使之便于网络传输. (2)将格式化之后的字符串,通过Http请求发送至codecogs.com或者Google.com. (3)获取网站返回的数据流,将其转化为图片,并显示在ImageView上. 具体过程为: 1.获取并格式化LaTeX数学表达式 首先,我们在这个网站输入LaT

  • 分享Android开发自学笔记之AndroidStudio常用功能

    相关下载: Android Studio v1.3 官方最新版(apk应用开发工具) http://www.jb51.net/softs/83206.html Android Studio 官方最新版下载地址(支持国内下载)http://www.jb51.net/softjc/83204.html 一.界面区介绍 1.项目组织结构区,用于浏览项目文件,默认Project以Android组织方式展示. 2.设计区,默认在打开布局文件时为设计模式,可直接拖动控件到界面上实现所见即所得,下方的Desi

  • Android开发自学笔记(五):使用代码控制界面

    酷酷的外表已经具备了,那就开始让我们真正把它的功能给实现起来吧,外强中干,花拳绣腿可不行哦,我们需要真正的本领,需要一颗自强不息的心哦,常常想想自己的梦想什么,这样才不会迷失自己,才会在茫茫的世界中找到自己前进的方向!我不会告诉你我刚看过<voice of China session 3>哦. 从上两节教程中,我们已经会搭出如下美美的布局了,欢迎翻页查阅:) Android自学开发第四篇之布局上 Android自学开发第五篇之布局下 添加第二个layout 关于layout布局我们不再赘述,这

  • Android开发自学笔记(一):Hello,world!

    Android当道,现在学习Android开发还晚吗?写下这个问题的时间是–2014年6月15号,我会回答:不晚,Android至少还能在活跃10年!所以答应自己从今天开始自学Android开发. 搭建Android开发环境,lorinnn使用了和大部分开发者不一样的开发环境,lorinnn使用的是Intellij+Genymotion方案,不为其他,只为速度,只为编程jeek的追求:) 在链接:Intellij IDEA + Android SDK + Genymotion Emulator打

  • Android开发自学笔记(三):APP布局上

    hello,大家好,本文主要介绍如何开始开发一个美观.有情调.人见人爱的Android应用程序,已知我们在市面上有不少布局极其精美,在视觉上让人爱不释手的应用程序,如果让我们着手开发,我们该如何下手? 在移动互联网公司都有这样几个部门–UX/UE及UI,UX有的也称作UE是指做用户体验的是User Experience的缩写,这些人一般都毕业于美术学院专门搞设计,我们上面说到那些精美的程序往往都是由他们的手先设计出效果图,然后交由UI,也称GUI即Graphic User Interface或者

  • Android开发自学笔记(四):APP布局下

    篇幅较长遂分成上下两篇,上一篇我们已经快要一气呵成了,但是美中不足的是,这个界面并不能讨得美工MM的欢心,美工MM曾寄希望于您,却交出这么作出这么一副死型样,我都替你汗颜. 这个图搜索按钮看起来马马虎虎,但是这个搜索框真是有失我在美工MM心中的水准啊,这是因为我们把EditText和Button都的宽度都设置成按自身内容长度自适应,所以这一篇我们就来润润色,修一修这个布局. Android在布局中引入了权重的概念,即如果给设定ViewGroup的总权重是,然后可以将权重分给它的子元素View各几

  • Android开发自学笔记(六):声明权限和Activity

    不好意思哦,上一篇Android自学开发第六篇代码控制界面挖了个坑,如果运行不起来的同学,请注意查看本篇文章. Android Project的灵魂大师AndroidManifest.xml终于要登场了,我们可以亲切的称呼它为AM文件,认识和学会配置AM文件则是是学习Android非常重要的基础知识. AM文件定义了该Android App的需要请求的权限,需要生命的组件以及按其他App交互的一些信息,我想我需要进一步详解AM文件,期待我更新吧! 好,回到这个坑中来,我们已经使用连续的一系列文章

  • Android开发自学笔记(二):工程文件剖析

    无论使用何种IDE开发Android,集成官方Android SDK并创建Android工程之后,该工程都会默认包括一整套Android项目文件,这个工程都可以直接run在你的真机或者模拟器上. 本文主要简单剖析这个默认的完整的一套项目工程的文件结构,这样我们在开发我们自己的项目的时候才能熟练做到有的放矢. AndroidManifest.xml 这个AndroidManifest.xml文件可谓是整个Android工程的灵魂架构师,它不仅定义了你的Android程序运行时所需的功能特性,同时也

随机推荐