Android开启摄像头拍照

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Calendar;

import java.util.Locale;

import android.app.Activity;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.os.Bundle;

import android.text.format.DateFormat;

import android.util.Log;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;

import android.view.WindowManager;

import android.widget.FrameLayout;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity {

	private CameraView cv;

	// 准备一个相机对象

	private Camera mCamera = null;

	// 准备一个Bitmap对象

	private Bitmap mBitmap = null;

	// 准备一个保存图片的PictureCallback对象

	public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

		public void onPictureTaken(byte[] data,Camera camera) {

			Log.i("yao","onPictureTaken");

			Toast.makeText(getApplicationContext(),"正在保存……",Toast.LENGTH_LONG)
					.show();

			// 用BitmapFactory.decodeByteArray()方法可以把相机传回的裸数据转换成Bitmap对象

			mBitmap = BitmapFactory.decodeByteArray(data,data.length);

			// 接下来的工作就是把Bitmap保存成一个存储卡中的文件

			File file = new File("/sdcard/YY"
					+ new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg");

			try {

				file.createNewFile();

				BufferedOutputStream os = new BufferedOutputStream(
						new FileOutputStream(file));

				mBitmap.compress(Bitmap.CompressFormat.PNG,100,os);

				os.flush();

				os.close();

				Toast.makeText(getApplicationContext(),"图片保存完毕,在存储卡的根目录",Toast.LENGTH_LONG).show();

			} catch (IOException e) {

				e.printStackTrace();

			}

		}

	};

	// Activity的创建方法

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		// 窗口去掉标题

		requestWindowFeature(Window.FEATURE_NO_TITLE);

		// 窗口设置为全屏

		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

		// 设置窗口为半透明

		getWindow().setFormat(PixelFormat.TRANSLUCENT);

		// 提供一个帧布局

		FrameLayout fl = new FrameLayout(this);

		// 创建一个照相预览用的SurfaceView子类,并放在帧布局的底层

		cv = new CameraView(this);

		fl.addView(cv);

		// 创建一个文本框添加在帧布局中,我们可以看到,文字自动出现在了SurfaceView的前面,由此你可以在预览窗口做出各种特殊效果

		TextView tv = new TextView(this);

		tv.setText("请按\"相机\"按钮拍摄");

		fl.addView(tv);

		// 设置Activity的根内容视图

		setContentView(fl);

	}

	// 相机按键按下的事件处理方法

	public boolean onKeyDown(int keyCode,KeyEvent event) {

		Log.i("yao","MainActivity.onKeyDown");

		if (keyCode == KeyEvent.KEYCODE_CAMERA) {

			if (mCamera != null) {

				Log.i("yao","mCamera.takePicture");

				// 当按下相机按钮时,执行相机对象的takePicture()方法,该方法有三个回调对象做入参,不需要的时候可以设null

				mCamera.takePicture(null,null,pictureCallback);

			}

		}

		return cv.onKeyDown(keyCode,event);

	}

	// 照相视图

	class CameraView extends SurfaceView {

		private SurfaceHolder holder = null;

		// 构造函数

		public CameraView(Context context) {

			super(context);

			Log.i("yao","CameraView");

			// 操作surface的holder

			holder = this.getHolder();

			// 创建SurfaceHolder.Callback对象

			holder.addCallback(new SurfaceHolder.Callback() {

				@Override
				public void surfaceDestroyed(SurfaceHolder holder) {

					// 停止预览

					mCamera.stopPreview();

					// 释放相机资源并置空

					mCamera.release();

					mCamera = null;

				}

				@Override
				public void surfaceCreated(SurfaceHolder holder) {

					// 当预览视图创建的时候开启相机

					mCamera = Camera.open();

					try {

						// 设置预览

						mCamera.setPreviewDisplay(holder);

					} catch (IOException e) {

						// 释放相机资源并置空

						mCamera.release();

						mCamera = null;

					}

				}

				// 当surface视图数据发生变化时,处理预览信息

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

					// 获得相机参数对象

					Camera.Parameters parameters = mCamera.getParameters();

					// 设置格式

					parameters.setPictureFormat(PixelFormat.JPEG);

					// 设置预览大小,这里我的测试机是Milsstone所以设置的是854x480

					parameters.setPreviewSize(854,480);

					// 设置自动对焦

					parameters.setFocusMode("auto");

					// 设置图片保存时的分辨率大小

					parameters.setPictureSize(2592,1456);

					// 给相机对象设置刚才设定的参数

					mCamera.setParameters(parameters);

					// 开始预览

					mCamera.startPreview();

				}

			});

			// 设置Push缓冲类型,说明surface数据由其他来源提供,而不是用自己的Canvas来绘图,在这里是由摄像头来提供数据

			holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

		}

	}

}



----------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
 
<manifest package="basic.android.lesson36" xmlns:android="http://schemas.android.com/apk/res/android" android:versioncode="1" android:versionname="1.0">
 
        <application android:label="@string/app_name" android:icon="@drawable/icon">
 
                <activity android:label="@string/app_name" android:name=".MainActivity" android:screenorientation="landscape" android:configchanges="orientation|keyboardHidden|keyboard">
 
                        <intent -filter="">
 
                                <action android:name="android.intent.action.MAIN">
 
                                <category android:name="android.intent.category.LAUNCHER">
 
                        </category></action></intent>
 
                </activity>
 

        </application>
 
        <uses -sdk="" android:minsdkversion="8">
 
        <uses -permission="" android:name="android.permission.CAMERA"></uses>
 
        <uses -permission="" android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>
 
        <uses -feature="" android:name="android.hardware.camera">
 
        <uses -feature="" android:name="android.hardware.camera.autofocus">
 
</uses></uses></uses></manifest>  

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&amp;FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = &quot;hello&quot;; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let&#39;s briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越