Android实现手机拍照功能

 更新时间:2015年12月11日 14:39:07   作者:徐刘根  
这篇文章主要介绍了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:layout_height="fill_parent" >

  <SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

  <RelativeLayout
    android:id="@+id/buttonlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:visibility="gone" >

    <Button
      android:id="@+id/takepicture"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_alignParentRight="true"
      android:layout_marginRight="5dp"
      android:onClick="takepicture"
      android:text="@string/takepicture" />

    <Button
      android:id="@+id/autofocus"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignTop="@id/takepicture"
      android:layout_marginRight="20dp"
      android:layout_toLeftOf="@id/takepicture"
      android:onClick="takepicture"
      android:text="@string/autofocus" />
  </RelativeLayout>

</FrameLayout>

二、MainActivity.java

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

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {
  private View layout;
  private Camera camera;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.main);

    layout = this.findViewById(R.id.buttonlayout);

    SurfaceView surfaceView = (SurfaceView) this
        .findViewById(R.id.surfaceView);
    surfaceView.getHolder()
        .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceView.getHolder().setFixedSize(176, 144);
    surfaceView.getHolder().setKeepScreenOn(true);
    surfaceView.getHolder().addCallback(new SurfaceCallback());
  }

  public void takepicture(View v) {
    if (camera != null) {
      switch (v.getId()) {
      case R.id.takepicture:
        camera.takePicture(null, null, new MyPictureCallback());
        break;

      case R.id.autofocus:
        camera.autoFocus(null);
        break;
      }
    }
  }

  private final class MyPictureCallback implements PictureCallback {
    public void onPictureTaken(byte[] data, Camera camera) {
      try {
        File jpgFile = new File(
            Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".jpg");
        FileOutputStream outStream = new FileOutputStream(jpgFile);
        outStream.write(data);
        outStream.close();
        camera.startPreview();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

  }

  private final class SurfaceCallback implements Callback {
    public void surfaceCreated(SurfaceHolder holder) {
      try {
        camera = Camera.open();// 打开摄像头
        Camera.Parameters parameters = camera.getParameters();
        // Log.i("MainActivity", parameters.flatten());
        parameters.setPreviewSize(800, 480);
        parameters.setPreviewFrameRate(5);
        parameters.setPictureSize(1024, 768);
        parameters.setJpegQuality(80);
        camera.setParameters(parameters);
        camera.setPreviewDisplay(holder);
        camera.startPreview();// 开始预览
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
      if (camera != null) {
        camera.release();
        camera = null;
      }
    }

  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      layout.setVisibility(ViewGroup.VISIBLE);
      return true;
    }
    return super.onTouchEvent(event);
  }
}

三、添加权限

 <uses-permission android:name="android.permission.CAMERA" />
  <!-- 在SDCard中创建与删除文件权限 -->
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  <!-- 往SDCard写入数据权限 -->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

效果如下:

希望本文所述对大家学习Android软件编程有所帮助。

相关文章

  • 浅谈Android系统的基本体系结构与内存管理优化

    浅谈Android系统的基本体系结构与内存管理优化

    这篇文章主要介绍了Android系统的基本体系结构与内存管理优化,非常简洁明了地总结了系统服务及垃圾回收等安卓的一些主要特性,需要的朋友可以参考下
    2016-02-02
  • Android编程记录ListView标记行状态的方法

    Android编程记录ListView标记行状态的方法

    这篇文章主要介绍了Android编程记录ListView标记行状态的方法,结合实例分析了ListView标记的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android实现闪屏效果

    Android实现闪屏效果

    这篇文章主要为大家详细介绍了Android实现闪屏效果,实现“一闪而过”效果进入页面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android ViewPager实现页面左右切换效果

    Android ViewPager实现页面左右切换效果

    这篇文章主要为大家详细介绍了Android ViewPager实现页面左右切换效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android延迟实现的几种解决方法及原理分析

    Android延迟实现的几种解决方法及原理分析

    这篇文章主要给大家介绍了关于Android延迟实现的几种解决方法以及其中的原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Android Map数据结构全面总结分析

    Android Map数据结构全面总结分析

    这篇文章主要为大家介绍了Android Map数据结构全面总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 解析Android开发优化之:对界面UI的优化详解(二)

    解析Android开发优化之:对界面UI的优化详解(二)

    在一个应用程序中,一般都会存在多个Activity,每个Activity对应着一个UI布局文件。一般来说,为了保持不同窗口之间的风格统一,在这些UI布局文件中,几乎肯定会用到很多相同的布局
    2013-05-05
  • Android中EditText 设置 imeOptions 无效问题的解决方法

    Android中EditText 设置 imeOptions 无效问题的解决方法

    有时候我们需要在EditText 输出完之后 需要在键盘出现 右下角变成“Go”或“前往 搜索时;通常我们需要设置Android:imeOptions属性,但是今天我发现设置了无效,下面给大家分享下解决方案
    2016-12-12
  • Android Beam 文件传输失败分析与解决方法

    Android Beam 文件传输失败分析与解决方法

    最近在修改Android7.0原生平台的一些bug,其中有关Android Beam传输文件的一些问题还是挺多的。下面小编给大家带来了android beam 文件传输失败的解决方法,一起看看吧
    2017-09-09
  • RxJava入门指南及其在Android开发中的使用示例

    RxJava入门指南及其在Android开发中的使用示例

    RxJava是JVM的一个扩展库,它能够帮助Java更加方便地实现基于事件的编程,这对安卓来说十分有用,接下来就一起来看一下RxJava入门指南及其在Android开发中的使用示例:
    2016-06-06

最新评论