Android实现简单拍照(使用摄像头)
由于左边的部分是摄像头拍摄的内容,所以截图软件获取不到内容,测试手机小米(Mi One Plus)
截图缩小:
补充一点:拍照得到的图像的大小(Size)是可以设置的,只不过在我这个程序里面使用是默认的大小。
设置方法是:
获得摄像头支持的大小List
List<Camera.Size> sizes = myCamera.getPArameters().getSupportedPictureSizes();
在Camera.Parameters中使用下面这个函数即可
setPictureSize(int width, int height)
修改:
拍照的代码修改为:
captureButton.setOnClickListener(new OnClickListener() {// 拍照按钮事件@Overridepublic void onClick(View v) {// 先启动自动对焦mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success,Camera camera) {if(success){mCamera.takePicture(mShutter, null, mPicture);}}});}
});
要控制摄像头和拍照首先需要在Manifest中添加权限如下:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
然后需要实现两个类,一个是Activity类,一个SurfaceView类:
SurfaceView类是用来获取摄像头的实景内容。
CameraUseActivity.java
package com.zeph.android.camera;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;public class CameraUseActivity extends Activity {/** 图片媒体类型 **/public static final int MEDIA_TYPE_IMAGE = 1;/** 摄像头类的对象 **/private Camera mCamera;/** SurfaceView对象 **/private CameraPreview mPreview;/** 拍照按钮 **/private Button captureButton;/** 返回摄像头 **/private Button cameraButton;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Window window = getWindow();// 得到窗口requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 保持屏幕亮setContentView(R.layout.main);captureButton = (Button) findViewById(R.id.button_capture);captureButton.setOnClickListener(new OnClickListener() {// 拍照按钮事件@Overridepublic void onClick(View v) {// 先启动自动对焦mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success,Camera camera) {}});// 1.75秒后启动拍照Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {// 拍照函数mCamera.takePicture(mShutter, null, mPicture);}}, 1750);}});cameraButton = (Button) findViewById(R.id.button_camera);cameraButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 返回按钮(拍完照片之后需要重新启动Camera的Preview)mCamera.startPreview();}});// 获取Camera对象的实例mCamera = getCameraInstance();// 初始化SurfaceViewmPreview = new CameraPreview(this, mCamera);FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);// 将SurfaceView添加到FrameLayout中preview.addView(mPreview);// 设置相机的属性Camera.Parameters params = mCamera.getParameters();// JPEG质量设置到最好params.setJpegQuality(100);// 散光灯模式设置为自动调节params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);mCamera.setParameters(params);}// PictureCallback回调函数实现private PictureCallback mPicture = new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);if (pictureFile == null) {return;}// 将照片数据data写入指定的文件try {FileOutputStream fos = new FileOutputStream(pictureFile);fos.write(data);fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}};// 快门的回调函数实现private ShutterCallback mShutter = new ShutterCallback() {@Overridepublic void onShutter() {}};// 释放Camera对象(务必实现)private void releaseCamera() {if (mCamera != null) {mCamera.release();mCamera = null;}}public static Camera getCameraInstance() {Camera c = null;try {c = Camera.open();} catch (Exception e) {e.printStackTrace();}return c;}/*** 在指定路径创建照片文件* * @param type* @return*/public static File getOutputMediaFile(int type) {// 指定照片存放的目录,在SD根目录下的一个文件夹中File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"CameraUseApp");// 文件夹不存在,则创建该文件夹if (!mediaStorageDir.exists()) {if (!mediaStorageDir.mkdirs()) {Log.d("CameraUse", "failed to create directory");return null;}}String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());// 创建照片文件File mediaFile;if (type == MEDIA_TYPE_IMAGE) {mediaFile = new File(mediaStorageDir.getPath() + File.separator+ "IMG_" + timeStamp + ".jpg");} else {return null;}return mediaFile;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 触摸屏幕自动对焦if (event.getAction() == MotionEvent.ACTION_DOWN) {mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {}});}return super.onTouchEvent(event);}@Overrideprotected void onPause() {super.onPause();releaseCamera();}
}
CameraPreview.java
package com.zeph.android.camera;import java.io.IOException;import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class CameraPreview extends SurfaceView implementsSurfaceHolder.Callback {private SurfaceHolder mHolder;private Camera mCamera;public CameraPreview(Context context, Camera camera) {super(context);mCamera = camera;mHolder = getHolder();mHolder.addCallback(this);mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (holder.getSurface() == null)return;try {mCamera.setPreviewDisplay(holder);} catch (IOException e) {e.printStackTrace();}mCamera.startPreview();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {if (mHolder.getSurface() == null)return;mCamera.stopPreview();try {mCamera.setPreviewDisplay(mHolder);} catch (IOException e) {e.printStackTrace();}mCamera.startPreview();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}
main.xml,main.xml中的FrameLayout是摄像头拍摄内容的预览位置
<?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:baselineAligned="false"android:orientation="horizontal" ><FrameLayoutandroid:id="@+id/camera_preview"android:layout_width="0dip"android:layout_height="fill_parent"android:layout_weight="1" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:gravity="center"android:orientation="vertical" ><Buttonandroid:id="@+id/button_capture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginBottom="5dip"android:text="@string/Capture" /><Buttonandroid:id="@+id/button_camera"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="@string/Camera" /></LinearLayout></LinearLayout>
由于新版的ADT和SDK都推荐android:text里的值使用strings.xml,所以所有的文字内容都放在了strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><string name="hello">Hello World, CameraUseActivity!</string><string name="app_name">摄像头</string><string name="Capture">拍照</string><string name="Camera">返回</string></resources>
由于拍摄的时候,要求画面横向,所以要记得在Manifest中添加:
android:screenOrientation="landscape"
完整的Manifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zeph.android.camera"android:versionCode="1"android:versionName="1.0" ><uses-sdk android:minSdkVersion="9" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><activityandroid:name=".CameraUseActivity"android:label="@string/app_name"android:screenOrientation="landscape" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
代码参考:http://developer.android.com/guide/topics/media/camera.html
拍照的效果图,效果真一般~~~
Android实现简单拍照(使用摄像头)相关推荐
- android 简单拍照,android实现简单拍照功能
拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录.最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊.可能是图片被压缩的太狠了.所 ...
- Android 点击拍照,长按录像保存本地 结合camer2实现 前后摄像头切换,手机闪关灯,
下面是对应的三个布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns ...
- android程序设计拍照,Android编程实现拍照功能的2种方法分析
本文实例讲述了Android编程实现拍照功能的2种方法.分享给大家供大家参考,具体如下: Android系统的照相功能,已实现2种方法,可供大家参考: 1. 调用系统摄像头来拍照 首先,找到Andro ...
- Android身份证扫描拍照识别SDK
Android身份证扫描拍照识别SDK 移动互联网是大趋势? 随着智能手机的硬件不断优化,移动互联网及应用大范围普及,互联网+各行各业,跨界.融合.创新,市场瞬息万变,有野心的企业和人.技术都在拼命的 ...
- Android调用照相机拍照
之前写在别的网站上写博客.后来没有坚持下来,以至于账号密码都忘了,好啦说正事 Android调用照相机拍照 这个在现在的应用中很常见,首先如果拍照是应用的必要功能,那么应该令它在Google Play ...
- android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像
像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪 ...
- Android添加拍照功能,Android开发实现拍照功能的方法实例解析
本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...
- android 静默拍照功能,Android实现静默拍照功能
本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下 1.申请权限(6.0以后要动态申请) 2.创建相机工具类 CameraPreview: public class ...
- Android 系统简单介绍
Android 系统简单介绍 2011年11月20日 写这篇文章的目的是为了给那些刚刚入手安 卓手机的新手们一些参考,希望他们能快速的上手 [第一期]ANDROID基础知识1~20 [第二期]继续泡! ...
最新文章
- 优化Linux系统中的服务
- 数据eda_银行数据EDA:逐步
- 已走过8年时间!百度这一重要产品正式宣布停止服务
- 整除光棍 (20 分)
- electron webview 页面加载事件顺序
- 查T结果与Z结果的P值[转载]
- Java求指定精度的开根号运算
- 【解决方案】Excel条形图顺序与源数据相反怎么办
- 从 MVC 到使用 ASP.NET Core 6.0 的最小 API
- LaTeX中参考文献的插入方式(不使用BibTeX)
- so库生成和用法汇总
- 计算机考研能换专业吗,考研调剂到材料专业,很后悔,还能转到计算机专业吗?...
- C语言标识符有哪三类
- 【Nginx基础知识】
- python调用图灵机器人实现微信公众号的自动回复功能
- KMeans算法的K值以及初始类簇中心点的选取
- ac9260网卡linux,#Linux# 在OpenSUSE下安装9260AC驱动
- 432 4.3.2 STOREDRV.Deliver; recipient thread limit exceeded
- 蔬菜清洗污水处理(蔬菜冲洗循环用水污水处理)
- 字符常量/字符变量 计算sizeof
热门文章
- 待读书:《沸腾十五年》
- YY摩登兄弟个唱开办,全网运营成直播平台核心竞争力
- 数字图像处理(二)灰度、量化、采样
- PHP/MYSQL实现按字母检索
- linux添加用户后怎么查看,linux怎样查看系统新添加的用户?
- 小米的人事调整颇为特别,被击败的前对手高管纷纷担任小米高管
- openAI gpt部署服务器QQ机器人docker实现
- HTTP/3: 实用部署选项(第3部分)
- Spring Security教程 第一弹 初识spring security
- 江西旅游商贸职业学院计算机题目,2019年江西旅游商贸职业学院发布单独招生计算机专业实操考试方案Windows基础部分、IE基础(50分)...