Android开发之拍照功能实现(附源码)

大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个“拍照”按钮。直接上代码!

1、CameraDemoActivity.java(主界面)
package org.winplus.camera;  

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

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;  

public class CameraDemoActivity extends Activity{  

    private final static String TAG = "CameraActivity";
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private Camera camera;
    private File picture;
    private Button btnSave;  

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        setupViews();
    }  

    private void setupViews(){
        surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
        surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
        surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  

        btnSave = (Button) findViewById(R.id.save_pic);  

        btnSave.setOnClickListener(new OnClickListener() {  

            @Override
            public void onClick(View v) {
                takePic();
            }
        });
    }  

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_CAMERA
                || keyCode == KeyEvent.KEYCODE_SEARCH) {
            takePic();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }  

    private void takePic() {  

        camera.stopPreview();// stop the preview  

        camera.takePicture(null, null, pictureCallback); // picture
    }  

    // Photo call back
    Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
        //@Override
        public void onPictureTaken(byte[] data, Camera camera) {
            new SavePictureTask().execute(data);
            camera.startPreview();
        }
    };  

    // save pic
    class SavePictureTask extends AsyncTask<byte[], String, String> {
        @Override
        protected String doInBackground(byte[]... params) {
            String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";  

            Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
            //picture = new File(Environment.getExternalStorageDirectory(),fname);// create file  

            picture = new File(Environment.getExternalStorageDirectory()+"/"+fname);  

            try {
                FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
                fos.write(params[0]); // Written to the file
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }  

    // SurfaceHodler Callback handle to open the camera, off camera and photo size changes
    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {  

        public void surfaceCreated(SurfaceHolder holder) {
            Log.i(TAG, "surfaceCallback====");
            camera = Camera.open(); // Turn on the camera
            try {
                camera.setPreviewDisplay(holder); // Set Preview
            } catch (IOException e) {
                camera.release();// release camera
                camera = null;
            }
        }  

        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            Log.i(TAG,"====surfaceChanged");
            Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
            parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
//          parameters.set("rotation", 180); // Arbitrary rotation
            camera.setDisplayOrientation(0);
//          parameters.setPreviewSize(400, 300); // Set Photo Size
            camera.setParameters(parameters); // Setting camera parameters
            camera.startPreview(); // Start Preview
        }  

        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.i(TAG,"====surfaceDestroyed");
            camera.stopPreview();// stop preview
            camera.release(); // Release camera resources
            camera = null;
        }
    };
}
2、main.xml(布局文件)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >  

    <android.view.SurfaceView
        android:id="@+id/camera_preview"
        android:layout_width="800dip"
        android:layout_height="600dip"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        android:layout_gravity="center_vertical|center_horizontal" />  

    <Button
        android:id="@+id/save_pic"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/txt_save" />  

</LinearLayout>  

3、别忘了添加权限:
<uses-permission android:name="android.permission.CAMERA" />  

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />  

源码下载==》
原创文章,转载请注明出处:http://www.blog.csdn.net/tangcheng_ok
时间: 2024-08-27 01:14:17

Android开发之拍照功能实现(附源码)的相关文章

Android跟踪球-手势移动图片-自定义控件(附源码)

由于我不会制作动画图片,所以先放几及其不具备代表性的展示图片. 我以前的思路是通过动态的设置xy坐标通过手势移动来识别,但是我后来试了一下,发现运行效果极差.所以偷闲做了下这个跟踪球控件,其实实现十分简单.只要大家熟悉自定义控件的使用以及手势识别.基本上就ok了. 现在我们看下这个控件的源码TouchMoveView.java package com.fay.touchmove; import android.annotation.SuppressLint; import android.con

【COCOS2D-HTML5 开发之三】示例项目附源码及运行的GIF效果图

本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d-html5/1528.html ? 点击订阅 ? 本博客最新动态!及时将最新博文通知您! Cocos2dx html5开发,对于用过2d Or -x的童鞋来说很容易,Himi这里也没有必要去再跟同学们详细的教学一遍. 所以Himi简单做了一个项目,供给大家参考,源码下载地址及GIF截图在文章最后!

商业级项目——基金客户端的架构设计与开发(下)(附源码)

#项目简介 上一次的博文中详细分析了基金项目的整体架构和主界面的UI设计.今天分享地方是剩下的3个页面及相应功能的实现. #个人中心 个人中心界面,最开始会跳转到一个登陆界面,用户可以通过选择"身份证.基金账户.护照.户口本",然后输入相应的账号和密码进行登陆.在这个界面中,还具有相应的记住密码,忘记密码功能.不输入是不允许进入账户的,当正确输入相应的账号密码后,通过和后台服务器进行验证登陆,登陆进去之后是一个账户详情页,有持仓查询.盈亏查询.交易查询等功能,在持仓查询中hi有总资产,

Android侧边栏的自定义实现(附源码)

本文要实现手指在手机上向左或向右移动时,能相应的移动左右两个视图.通过自定义来实现,不借助第三方插件. 先来看看效果:(源码免费下载) 目录: 一.实现思路 二.代码清单 三.效果与说明 下面,让我们开始吧: 一.实现思路 1.思路 菜单在左,内容在右,然后菜单显示时和手机右边框有一定的间隔,内容显示一小部分.内容全部显示时,菜单全部不可见.如下面两个图 显示内容 显示菜单 2.判断逻辑 这是判断手指按着屏幕和手指抬起时要不要显示还是隐藏菜单 二.代码清单 首先来看下布局: <LinearLay

(转)Android与js交互实例(附源码)

本文转载于:http://blog.csdn.net/ithomer/article/details/8737999# Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML)交互有四种情况: 1) Android(Java)调用HTML中js代码 2) Android(Java)调用HTML中js代码(带参数) 3) HTML中js调用Android(

微信小程序之多列表的显示和隐藏功能(附源码)

今天在项目碰到一个问题,之前在项目首页实现单列表的显示和隐藏,通过wx:if判断就可实现,现在要实现多列表的单项显示和隐藏功能应该如何实现呢?如果还用wx:if实现的话会出现点击一个列表项,多个列表同时显示和隐藏,明显不适合功能需求,然后简单地查了资料也没发现有类似的功能,最后思考一番后,慢慢地理清了思路... 效果图: 实现思路: 实现单个列表的显示和隐藏应该使用唯一元素让程序知道你应该显示和隐藏哪个列表项,可以用数据的id: css中定义一个hidden{display:none}控制显示和

leaflet-webpack 入门开发系列五地图卷帘(附源码下载)

前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 webpack 配置介绍文档详细的 webpack 文档配置介绍,适合新手查看,我也是边看边学 vscode 安装包下载,我这边用 vscode工具编译开发前端项目,个人觉的这款工具还不错 leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 l

JavaSwing开发简单的银行管理系统 附源码

开发环境: Windows操作系统开发工具: MyEclipse/Eclipse+Jdk+mysql数据库 运行效果图: 源码及原文链接:https://javadao.xyz/forum.php?mod=viewthread&tid=36 原文地址:https://www.cnblogs.com/javadao/p/12319649.html

如何使用微信小程序开发一个弹窗页面(附源码)

在小程序的开发过程中,我们肯定会遇到开发一个弹窗页面的情况,我们先看一下小程序官方对于弹窗页面的解释.API的接口如下 从官方给出的代码示例来看,想当简单,就像一个asert,并不能看出弹窗的真实需求.所以今天HTML51.COM就写了一个弹窗小程序教程,供大家学习参考.首页我们先看一下动态的效果图: 我们首先看到的是首页代码: <view class="copyright"> <view class="copyright_item">Cop