搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
盐析白兔
这个屌丝很懒,什么也没留下!
关注作者
热门标签
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
UnityVR游乐园笔记#003_过山车场景(结束)_unity 过山车游戏 插件
2
【物联网蓝桥杯嵌入式】蓝桥杯嵌入式第十三届真题代码详解(超级详细)_蓝桥杯嵌入式真题
3
AOC显示器OSD已锁是什么意思?怎么解锁?_osd only是什么意思
4
NLP(自然语言处理):Improving Neural Language Modeling via Adversarial Training 通过对抗噪音提升神经语言模型
5
手把手git教程(09)--多人协作,推送分支,抓取分支_其他人员能直接把代码推送到主分支吗
6
大模型的自我监督
7
C#调用yolov5模型转化onnx模型实现C#模型部署_c# yolov5
8
融云出海:TikTok 百亿美元投向东南亚,巨头将如何影响市场格局_tiktok出海的资金业务
9
堆排序和TopK问题_topk问题中的堆排序
10
美团2024年春招第一场笔试【技术】第五题:小美的区间删除_小美拿到了一个大小为 n的数组,她希望删除一个区间后,使得剩余所有元素的乘
当前位置:
article
> 正文
Android开发中如何调用摄像头的功…_android hook camera
作者:盐析白兔 | 2024-06-13 16:44:05
赞
踩
android hook camera
我们要调用摄像头的拍照功能,显然
第一步必须加入调用摄像头硬件的权限
,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
<uses-permission android:name="android.permission.CAMERA"/>//摄像头权限
SD卡读写权限
<uses-permission android: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"
/>
第三步,设置窗口的显示方式
首先获得当前窗口
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);
第四步,设置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 SurfaceCallback implements SurfaceHolder.Callback{
@Override
public void surfaceCreated(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 void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null){
if(isPreview){//如果正在预览
camera.stopPreview();
camera.release();
}
}
}
}
第六步,我们必须对按键事件进行监听,如是拍照还是聚焦
,代码如下
public boolean onKeyDown(int keyCode, KeyEvent event) {//处理按键事件
if(camera!=null&&event.getRepeatCount()==0)//代表只按了一下
{
switch(keyCode){
case KeyEvent.KEYCODE_BACK://如果是搜索键
camera.autoFocus(null);//自动对焦
break;
case KeyEvent.KEYCODE_DPAD_CENTER://如果是中间键
camera.takePicture(null, null, new TakePictureCallback());//将拍到的照片给第三个对象中,这里的TakePictureCallback()是自己定义的,在下面的代码中
break;
}
}
return true;//阻止事件往下传递,否则按搜索键会变成系统默认的
}
------------------------------------------------------------------------------------------
private final class TakePictureCallback implements PictureCallback{
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
File file = new File(Environment.getExternalStorageDirect
ory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = new FileOutputStream(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将拍照得到的数据传入方法,我们便可以对拍照得到的数据进行进一步处理了。
至此,简单的拍照功能介绍完毕!
package cn.camera.rxm;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
import org.apache.commons.logging.Log;
import android.text.format.DateFormat;
import android.util.*;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
//import android.widget.Toast;
public class MycamActivity extends Activity {
private Preview mPreview;
private Camera mCamera;
Bitmap CameraBitmap;
SurfaceHolder mHolder;
private static final int OPTION_SNAPSHOT = 0;
private static final int OPTION_STOPCAMERA = 1;
private View viewStart;
@Override
public void onCreate(Bundle savedInstanceState) {
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 boolean onCreateOptionsMenu(Menu menu){
//
menu.add(0, OPTION_SNAPSHOT, 0, R.string.take);
//
menu.add(0, OPTION_STOPCAMERA, 1, R.string.back);
//
return true;//super.onCreateOptionsMenu(menu);
}
public boolean onOptionsItemSelected(MenuItem item) {
//
int itemId = item.getItemId();
//
switch(itemId){
case OPTION_SNAPSHOT:
//拍摄照片
mCamera.takePicture(null, null, jpegCallback);
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mCamera.startPreview();
break;
case OPTION_STOPCAMERA:
mPreview = null;
setContentView(viewStart);
break;
}
return true;
}
private PictureCallback jpegCallback = new PictureCallback(){
//
public void onPictureTaken(byte[] data, Camera camera) {
try {
String name = new DateFormat().format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA)) + ".jpg";
FileOutputStream fileout = new FileOutputStream("/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);
}
}
};
class Preview extends SurfaceView implements SurfaceHolder.Callback
{
Preview(Context context)
{
super(context);
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder)
{
mCamera=Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}
catch(IOException exception)
{
mCamera.release();
mCamera=null;
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
mCamera.stopPreview();
mCamera.release();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// TODO Auto-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/盐析白兔/article/detail/713819
推荐阅读
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
解决
git
commit
报错:
git
pre
-
commit
hook
failed
_预提交钩子退出1...
git
pre
-
commit
hook
failed
解决办法_预提交钩子退出127预提交钩子退出127 ...
赞
踩
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...
赞
踩
相关标签
live2dviewer android
android
android error
android studio
java
ide
前端
uni-app
javascript
学习
微信
缓存
开发语言
gradle
移动开发