第二步,要将摄_安卓原生 调用摄像头">
搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
凡人多烦事01
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
3、Spring之Bean生命周期~合并BeanDefinition
2
【项目实战】十分钟学习完 Spring Boot 拦截器_springboot拦截器
3
使用百度云智能SDK和树莓派搭建简易的人脸识别系统 Python语言版_搭建家庭人脸识别系统
4
潘多拉开发板——6轴传感器ICM-20608学习笔记_icm20608
5
windows下php环境搭建_windows搭建php环境
6
关于 AssertionError: Torch not compiled with CUDA enabled 问题_comfyui assertionerror: torch not compiled with cu
7
chatGPT陪你读源码_chatgpt阅读代码
8
Linux SPI 驱动_linux spi驱动
9
UE4/UE5像素流送云推流|程序不稳定、弱网画面糊怎么办?
10
算法-贝尔曼-福特算法_bellman鈥榮 algorithm
当前位置:
article
> 正文
Android开发中如何调用摄像头的功能_安卓原生 调用摄像头
作者:凡人多烦事01 | 2024-06-13 16:43:38
赞
踩
安卓原生 调用摄像头
我们要调用摄像头的拍照功能,显然
第一步必须加入调用摄像头硬件的权限
,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
<uses-permissionandroid:name="android.permission.CAMERA"/>//摄像头权限
SD卡读写权限
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第二步,要将摄像头捕获的图像实时地显示在手机上。
我们是用SurfaceView这个视图组件来实现的,因此在main.xml中加入下列代码
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceview"
/>
第三步,设置窗口的显示方式
首先获得当前窗口
Windowwindow = 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);
第四步,设置SurficeView显示控件的属性
找到surficeView
surfaceView= (SurfaceView) findViewById(R.id.surfaceview);
设置它的像素为800x600
surfaceView.getHolder().setFixedSize(800,480);
//下面设置surfaceView不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
第五步,就是为surficeView加入回调方法(callBack)
surfaceView.getHolder().addCallback(new SurfaceCallback());
上面的回调类是我们自己定义的,代码如下
private class SurfaceCallbackimplements SurfaceHolder.Callback{
@Override
public voidsurfaceCreated(SurfaceHolder holder) {
try {
camera =Camera.open();//打开硬件摄像头,这里导包得时候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
Display display
= wm.getDefaultDisplay();//得到当前屏幕
Camera.Parameters parameters =camera.getParameters();//得到摄像头的参数
parameters.setPreviewSize(display.getWidth(),display.getHeight());//设置预览照片的大小
parameters.setPreviewFrameRate(3);//设置每秒3帧
parameters.setPictureFormat(PixelFormat.JPEG);//设置照片的格式
parameters.setJpegQuality(85);//设置照片的质量
parameters.setPictureSize(display.getHeight(),display.getWidth());//设置照片的大小,默认是和
屏幕一样大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面
camera.startPreview();//开始预览
isPreview = true;//设置是否预览参数为真
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
public voidsurfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated methodstub
}
@Override
public voidsurfaceDestroyed(SurfaceHolder holder) {
if(camera!=null){
if(isPreview){//如果正在预览
camera.stopPreview();
camera.release();
}
}
}
}
第六步,我们必须对按键事件进行监听,如是拍照还是聚焦
,代码如下
public boolean onKeyDown(intkeyCode, KeyEvent event) {//处理按键事件
if(camera!=null&&event.getRepeatCount()==0)//代表只按了一下
{
switch(keyCode){
caseKeyEvent.KEYCODE_BACK://如果是搜索键
camera.autoFocus(null);//自动对焦
break;
caseKeyEvent.KEYCODE_DPAD_CENTER://如果是中间键
camera.takePicture(null,null, newTakePictureCallback());//将拍到的照片给第三个对象中,这里的TakePictureCallback()是自己定义的,在下面的代码中
break;
}
}
returntrue;//阻止事件往下传递,否则按搜索键会变成系统默认的
}
------------------------------------------------------------------------------------------
private final classTakePictureCallback implements PictureCallback{
public void onPictureTaken(byte[]data, Camera camera) {
try {
Bitmap bitmap =BitmapFactory.decodeByteArray(data, 0, data.length);
File file = newFile(Environment.getExternalStorageDirect
ory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = newFileOutputStream(file);
bitmap.compress(CompressFormat.JPEG,100, outputStream);
outputStream.close();
camera.stopPreview();
camera.startPreview();//处理完数据之后可以预览
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
注意,代码中有两个回调类,一个是SurfaceCallback(),另外一个是TakePictureCallback(),初学者可能一时难以理解,通俗地讲,前者是用来监视surficeView这个暂时存放图片数据的显示控件的,根据它的显示情况调用不同的方法,包括surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不难理解为什么会有这三个回调方法了(注意,在surfaceDestroyed()方法中必须释放摄像头,详细代码参见上方)。TakePictureCallback()是为了监视是否拍照而设计的接口,期中也仅有一个方法,camera将拍照得到的数据传入方法,我们便可以对拍照得到的数据进行进一步处理了。
至此,简单的拍照功能介绍完毕!
packagecn.camera.rxm;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.Calendar;
importjava.util.Locale;
importorg.apache.commons.logging.Log;
importandroid.text.format.DateFormat;
importandroid.util.*;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.CompressFormat;
importandroid.graphics.BitmapFactory;
importandroid.graphics.PixelFormat;
importandroid.hardware.Camera;
importandroid.hardware.Camera.PictureCallback;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.view.LayoutInflater;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.SurfaceHolder;
importandroid.view.SurfaceView;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
//importandroid.widget.Toast;
public classMycamActivity extends Activity {
privatePreview mPreview;
privateCamera mCamera;
BitmapCameraBitmap;
SurfaceHolder mHolder;
privatestatic final int OPTION_SNAPSHOT = 0;
privatestatic final int OPTION_STOPCAMERA = 1;
private ViewviewStart;
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater flater =this.getLayoutInflater();
viewStart = flater.inflate(R.layout.main,null);
setContentView(viewStart);
Button btn1 =(Button)findViewById(R.id.button1);
btn1.setOnClickListener(
new OnClickListener(){
public void onClick(View v){
mPreview = new Preview(getBaseContext());
setContentView(mPreview);
};
}
);
}
public booleanonCreateOptionsMenu(Menu menu){
//
menu.add(0,OPTION_SNAPSHOT, 0, R.string.take);
//
menu.add(0,OPTION_STOPCAMERA, 1, R.string.back);
//
returntrue;//super.onCreateOptionsMenu(menu);
}
publicboolean onOptionsItemSelected(MenuItem item) {
//
int itemId =item.getItemId();
//
switch(itemId){
caseOPTION_SNAPSHOT:
//拍摄照片
mCamera.takePicture(null, null, jpegCallback);
try {
Thread.sleep(4000);
} catch(InterruptedException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
mCamera.startPreview();
break;
caseOPTION_STOPCAMERA:
mPreview =null;
setContentView(viewStart);
break;
}
returntrue;
}
privatePictureCallback jpegCallback = new PictureCallback(){
//
public voidonPictureTaken(byte[] data, Camera camera) {
try {
String name = newDateFormat().format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA)) +".jpg";
FileOutputStream fileout = newFileOutputStream("/mnt/sdcard/sdcard/DCIM/"+ name);
System.out.println(name);
fileout.write(data,0,data.length);
fileout.flush();
fileout.close();
} catch (IOException e) {
// TODO: handle exception
System.out.println(e);
}
}
};
classPreview extends SurfaceView implements SurfaceHolder.Callback
{
Preview(Context context)
{
super(context);
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public voidsurfaceCreated(SurfaceHolder holder)
{
mCamera=Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}
catch(IOException exception)
{
mCamera.release();
mCamera=null;
}
}
public voidsurfaceDestroyed(SurfaceHolder holder)
{
mCamera.stopPreview();
mCamera.release();
}
@Override
public voidsurfaceChanged(SurfaceHolder holder, int format, int w, int h){
// TODOAuto-generated method stub
Camera.Parameters parameters=mCamera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(1024, 1024);
mCamera.setParameters(parameters);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
}
}
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/凡人多烦事01/article/detail/713816
推荐阅读
article
live2dviewer
android,
Live2DViewerEX
...
Live2DViewerEX
是二维动画手机的动态壁纸,可以管理Live2D模型设定的app,本作软件内置了超多的模式,宅...
赞
踩
article
live2dviewer
android,
live2dviewer
ex最新版...
live2dviewer
ex是一款采用了全新Live2D技术的壁纸软件,用户们可以通过这款软件来为自己的手机更换各种高清...
赞
踩
article
And
r
o
id
Lib
r
a
r
y
工程
switch
case
中使用 R.
id
.x报错_
case
r
.
id
...
一、问题描述将普通And
r
o
id
工程
转成
Lib
r
a
r
y
工程
后,编译报如下错误。如图,
switch
语句的
case
中,不允许...
赞
踩
article
Android
Studio
关于
switch
case
中,R资源(局部R资源)找不到问题_andr...
Android
studio
switch
case
中局部R资源找不到_
android
studio
switch
c...
赞
踩
article
Android
Studio之
library
工程中不能使用
switch
-
case
语句访问资源ID_a...
当我们在
Android
依赖库中使用
switch
-
case
语句访问资源ID时会报如下错误,报的错误是
case
分支后面跟的参...
赞
踩
article
Android
Studio
项目
导入
的正确姿势,醍醐灌顶_
android
studio
项目
导入
...
下面是辛苦给大家整理的学习路线,有需要的可以点击这里免费获取获取](https://bbs.csdn.net/topic...
赞
踩
article
uni
app
开发安卓
app
调起
H5
支付
宝
支付
(Android)_uni
app
app
浏览器拉起
支付
...
最近遇到一个客户要求在
app
内完成
H5
页面
支付
宝
支付
,绞尽脑汁,最终搞出来了._uni
app
app
浏览器拉起
支付
宝
支...
赞
踩
article
Android
H5
页面调起
微信
和
支付
宝付款_
h5
动态
支付
链接...
H5
页面调起
支付
宝
支付
和
微信
支付
的,另一种方式_
h5
动态
支付
链接
h5
动态
支付
链接 ...
赞
踩
article
Android 之
WebView
缓存
问题_
android
webview
缓存
...
根据以上两种模式,建议
缓存
策略为,判断是否有网络,有的话,使用LOAD_DEFAULT, 无网络时,使用LOAD_CAC...
赞
踩
article
【NPC的白话文谈:
Android
开发
{毕设}】:
Android
Studio
安装中出现的问题(一...
首次启动
Android
Studio
出现如下问题:
Could
not
install
Gradle
distribu...
赞
踩
article
【Android】Could
not
install
Gradle
distribution
fro...
Could
not
install
Gradle
distribution
from -
gradle
问题有时我们接手一...
赞
踩
article
[
Android
Studio
]报错Design editor is un
a
v
a
il
a
ble unt...
今天第一次用
Android
Studio
出现了几个错误,记录一下。_could not inst
a
ll gr
a
dle d...
赞
踩
article
Android
studio
中英文
转换_
android
studio
怎么设置
中文
?...
面板选择Help→About,在弹出框中查看当前版本号,我们只需要关心版本号前面的222即可。软件版本,根据版本下载对应...
赞
踩
article
android
中
获取
sha1
值
的
详细说明
_
获取
app
签名
哈希值(
android
)...
我这里整理了一份完整
的
学习思维以及Android开发知识大全PDF。当然实践出真知,即使有了学习线路也要注重实践,学习过...
赞
踩
article
Android
程序获得
APP
哈希
值,
Android
– SMS
Retriever
API – 计算...
import android.content.Context;import android.content.Contex...
赞
踩
article
android
系统
签名
应用获取
SHA1
值_
java
查询
apk
的
sha1
...
获取系统
签名
sha1
值两种方法:方法一解压
apk
通过cmd(命令行获取):1、系统
签名
apk
文件,解压(重命名为rar文...
赞
踩
article
Android
签名文件
的
sha1
值查看_安卓
sha1
查看器
...
首先xxx.jks:准备好你的
签名文件
Java环境:安装jdk其次cmd 进入JAVA的bin路径输入框输入CMD 进...
赞
踩
article
android
应用内部获取本应用或者对应
包名
的
应用
的
SHA
1
签名
的
办法_
android
通过
包名
生...
我这个人比较懒,每次做
的
都是心血来潮,所以打算改掉这个坏毛病。昨晚很晚才睡,躺在床上一直在回想。这两年来,我曾经
的
目标是...
赞
踩
article
Android
App自定义
签名
文件
的生成
、
查看
SHA
1
值和使用_
1
、
应用
签名
在“
应用
详情”-“各平...
本文知识点:
1
.通过命令行生成
签名
文件
;2.使用
Android
Studio创建
签名
文件
;3.查看
SHA
1
值;4.And...
赞
踩
article
Android
系统
签名
的应用获取
SHA1
值方法...
获取
系统
签名
sha1值方法:解压apk通过cmd(命令行获取):1、
系统
签名
的apk文件,重命名为rar文件,解压。2、...
赞
踩
相关标签
live2dviewer android
android
android error
android studio
java
ide
前端
uni-app
javascript
学习
微信
缓存
开发语言
gradle
移动开发