由于左边的部分是摄像头拍摄的内容,所以截图软件获取不到内容,测试手机小米(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实现简单拍照(使用摄像头)相关推荐

  1. android 简单拍照,android实现简单拍照功能

    拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录.最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊.可能是图片被压缩的太狠了.所 ...

  2. Android 点击拍照,长按录像保存本地 结合camer2实现 前后摄像头切换,手机闪关灯,

    下面是对应的三个布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns ...

  3. android程序设计拍照,Android编程实现拍照功能的2种方法分析

    本文实例讲述了Android编程实现拍照功能的2种方法.分享给大家供大家参考,具体如下: Android系统的照相功能,已实现2种方法,可供大家参考: 1. 调用系统摄像头来拍照 首先,找到Andro ...

  4. Android身份证扫描拍照识别SDK

    Android身份证扫描拍照识别SDK 移动互联网是大趋势? 随着智能手机的硬件不断优化,移动互联网及应用大范围普及,互联网+各行各业,跨界.融合.创新,市场瞬息万变,有野心的企业和人.技术都在拼命的 ...

  5. Android调用照相机拍照

    之前写在别的网站上写博客.后来没有坚持下来,以至于账号密码都忘了,好啦说正事 Android调用照相机拍照 这个在现在的应用中很常见,首先如果拍照是应用的必要功能,那么应该令它在Google Play ...

  6. android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像

    像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪 ...

  7. Android添加拍照功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  8. android 静默拍照功能,Android实现静默拍照功能

    本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下 1.申请权限(6.0以后要动态申请) 2.创建相机工具类 CameraPreview: public class ...

  9. Android 系统简单介绍

    Android 系统简单介绍 2011年11月20日 写这篇文章的目的是为了给那些刚刚入手安 卓手机的新手们一些参考,希望他们能快速的上手 [第一期]ANDROID基础知识1~20 [第二期]继续泡! ...

最新文章

  1. 优化Linux系统中的服务
  2. 数据eda_银行数据EDA:逐步
  3. 已走过8年时间!百度这一重要产品正式宣布停止服务
  4. 整除光棍 (20 分)
  5. electron webview 页面加载事件顺序
  6. 查T结果与Z结果的P值[转载]
  7. Java求指定精度的开根号运算
  8. 【解决方案】Excel条形图顺序与源数据相反怎么办
  9. 从 MVC 到使用 ASP.NET Core 6.0 的最小 API
  10. LaTeX中参考文献的插入方式(不使用BibTeX)
  11. so库生成和用法汇总
  12. 计算机考研能换专业吗,考研调剂到材料专业,很后悔,还能转到计算机专业吗?...
  13. C语言标识符有哪三类
  14. 【Nginx基础知识】
  15. python调用图灵机器人实现微信公众号的自动回复功能
  16. KMeans算法的K值以及初始类簇中心点的选取
  17. ac9260网卡linux,#Linux# 在OpenSUSE下安装9260AC驱动
  18. 432 4.3.2 STOREDRV.Deliver; recipient thread limit exceeded
  19. 蔬菜清洗污水处理(蔬菜冲洗循环用水污水处理)
  20. 字符常量/字符变量 计算sizeof

热门文章

  1. 待读书:《沸腾十五年》
  2. YY摩登兄弟个唱开办,全网运营成直播平台核心竞争力
  3. 数字图像处理(二)灰度、量化、采样
  4. PHP/MYSQL实现按字母检索
  5. linux添加用户后怎么查看,linux怎样查看系统新添加的用户?
  6. 小米的人事调整颇为特别,被击败的前对手高管纷纷担任小米高管
  7. openAI gpt部署服务器QQ机器人docker实现
  8. HTTP/3: 实用部署选项(第3部分)
  9. Spring Security教程 第一弹 初识spring security
  10. 江西旅游商贸职业学院计算机题目,2019年江西旅游商贸职业学院发布单独招生计算机专业实操考试方案Windows基础部分、IE基础(50分)...