安卓系统使用摄像头API
原文链接:定制自己的安卓Camera
参考链接:http://blog.csdn.net/tankai19880619/article/details/9075839
前言:
图像模糊是图像检测和特征点检测的一个大敌,去模糊算法的复杂度使其不适用于实时性检测的场合,因此对Camera的曝光时间进行控制是一个合适的方式,得到合适的无拖影的原始图像。
可惜的是:在camera API里面没有找到控制底层快门时间的参数设置,不过还是把一些参数抄写一遍吧
原文:
在Android的hardware包中有一个Camera类。这个类就是获取Camera服务的,可以定制Camera等。
可以通过open()方法获取其实例。
在使用这个类是需要在AndroidManifest.xml文件中加入相应的权限和特性。
如:
<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
等。
本文实例:
package demo.camera;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.content.ContentValues;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.LinearLayout;
/**
* Android自带的Camera应用程序可以完成很多功能。但是当其不能满足我们需要的时候
* 我们可以定制自己的Camera。Android提供了Camera类来辅助我们实现自己的Camera。
* 这个例子就来定义一个自己的Camera
* 首先,在Manifest中需要引入权限<uses-permission android:name="android:permission.CAMERA"/>
* 我们需要用来存放取景器的容器,这个容器就是SurfaceView。
* 使用SurfaceView的同时,我们还需要使用到SurfaceHolder,SurfaceHolder相当于一个监听器,可以监听
* Surface上的变化,通过其内部类CallBack来实现。
* 为了可以获取图片,我们需要使用Camera的takePicture方法同时我们需要实现Camera.PictureCallBack类,实现onPictureTaken方法
* @author Administrator
*
*/
public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{ public static final int MAX_WIDTH = 200;
public static final int MAX_HEIGHT = 200; private SurfaceView surfaceView; private Camera camera; //这个是hardare的Camera对象 public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.camera);
surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView);
surfaceView.setFocusable(true);
surfaceView.setFocusableInTouchMode(true);
surfaceView.setClickable(true);
surfaceView.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { camera.takePicture(null, null, null, MyCamera.this); }
});
//SurfaceView中的getHolder方法可以获取到一个SurfaceHolder实例
SurfaceHolder holder = surfaceView.getHolder();
//为了实现照片预览功能,需要将SurfaceHolder的类型设置为PUSH
//这样,画图缓存就由Camera类来管理,画图缓存是独立于Surface的
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 当Surface被创建的时候,该方法被调用,可以在这里实例化Camera对象
//同时可以对Camera进行定制
camera = Camera.open(); //获取Camera实例 /**
* Camera对象中含有一个内部类Camera.Parameters.该类可以对Camera的特性进行定制
* 在Parameters中设置完成后,需要调用Camera.setParameters()方法,相应的设置才会生效
* 由于不同的设备,Camera的特性是不同的,所以在设置时,需要首先判断设备对应的特性,再加以设置
* 比如在调用setEffects之前最好先调用getSupportedColorEffects。如果设备不支持颜色特性,那么该方法将
* 返回一个null
*/
try { Camera.Parameters param = camera.getParameters();
if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
//如果是竖屏
param.set("orientation", "portrait");
//在2.2以上可以使用
//camera.setDisplayOrientation(90);
}else{
param.set("orientation", "landscape");
//在2.2以上可以使用
//camera.setDisplayOrientation(0);
}
//首先获取系统设备支持的所有颜色特效,有复合我们的,则设置;否则不设置
List<String> colorEffects = param.getSupportedColorEffects();
Iterator<String> colorItor = colorEffects.iterator();
while(colorItor.hasNext()){
String currColor = colorItor.next();
if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){
param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE);
break;
}
}
//设置完成需要再次调用setParameter方法才能生效
camera.setParameters(param); camera.setPreviewDisplay(holder); /**
* 在显示了预览后,我们有时候希望限制预览的Size
* 我们并不是自己指定一个SIze而是指定一个Size,然后
* 获取系统支持的SIZE,然后选择一个比指定SIZE小且最接近所指定SIZE的一个
* Camera.Size对象就是该SIZE。
*
*/
int bestWidth = 0;
int bestHeight = 0; List<Camera.Size> sizeList = param.getSupportedPreviewSizes();
//如果sizeList只有一个我们也没有必要做什么了,因为就他一个别无选择
if(sizeList.size() > 1){
Iterator<Camera.Size> itor = sizeList.iterator();
while(itor.hasNext()){
Camera.Size cur = itor.next();
if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){
bestWidth = cur.width;
bestHeight = cur.height;
}
}
if(bestWidth != 0 && bestHeight != 0){
param.setPreviewSize(bestWidth, bestHeight);
//这里改变了SIze后,我们还要告诉SurfaceView,否则,Surface将不会改变大小,进入Camera的图像将质量很差
surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight));
}
}
camera.setParameters(param);
} catch (Exception e) {
// 如果出现异常,则释放Camera对象
camera.release();
} //启动预览功能
camera.startPreview(); }
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 当Surface被销毁的时候,该方法被调用
//在这里需要释放Camera资源
camera.stopPreview();
camera.release(); }
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// data是一个原始的JPEG图像数据,
//在这里我们可以存储图片,很显然可以采用MediaStore
//注意保存图片后,再次调用startPreview()回到预览
Uri imageUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
try {
OutputStream os = this.getContentResolver().openOutputStream(imageUri);
os.write(data);
os.flush();
os.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} camera.startPreview();
} }
安卓系统使用摄像头API的更多相关文章
- 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?
2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm 据泰尔终端实验室公众微信 ...
- 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
原文 http://blog.csdn.net/zhaoxy_thu/article/details/18883015 本文主要对从 ...
- 篇4 安卓app自动化测试-Appium API进阶
篇4 安卓app自动化测试-Appium API进阶 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),今天是<安卓app自动化测试& ...
- adb获得安卓系统版本及截屏
[时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...
- Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法
简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...
- 安卓系统使用USB转串口
概述 安卓系统支持多种 USB 外围设备,提供两种模式来支持实现 USB 外设接入系统:USB 配件模式和 USB 主机模式. 在 USB 配件模式下,接入的 USB 设备充当 USB 主机,并为 U ...
- 最新Android系统版本与API等级对应关系表
最新Android系统版本与API等级对应关系表 从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/mani ...
- 如何获取安卓系统自带应用的package和activity
之前在做appium自动化测试的时候,参考网上的例子,运行安卓系统自带的app,所以,就需要获取系统自带的package(包名)和activity.这里简单记录一下,不一定适合所有的系统应用. 运行环 ...
- 企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法
此处以三星(系统版本4.4.2)为例,介绍下使用安卓系统自带的客户端如何设置pop/imap协议方式方法 以下我们将使用test@zhuyuming.so 为测试案例,请您操作时更换成您自己的邮箱账号 ...
随机推荐
- 【codeforces 768D】Jon and Orbs
[题目链接]:http://codeforces.com/contest/768/problem/D [题意] 你有一个水晶; 它每天都会产生一个球??(球有k种) 然后每种球产生的可能性是相同的-& ...
- Linux系统自带服务罗列
/ect/services 文件列出了系统详细的服务 红色字体为常用服务 acpid ACPI(全称 Advanced Configuration and Power Interface)服务是电源管 ...
- Windows独享主机如何修改远程登录3389端口
” 完 成数值修改操作后,我们再将鼠标定位于注册表分支HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Control\Terminal Server\WinS ...
- noip模拟赛 党
分析:一道非常恶心的dp题.每个人要么选或不选,很像是0-1背包,可以套用背包问题的状态,但是因为题目要求3个值,所以可以再加一维表示3个答案. f[i][j][k][l][p][0/1/2]表示i个 ...
- Spring Boot静态资源处理
Spring Boot静态资源处理 8.8 Spring Boot静态资源处理 当使用Spring Boot来开发一个完整的系统时,我们往往需要用到前端页面,这就不可或缺地需要访问到静态资源,比如图片 ...
- nyoj_33_蛇形填数_201308221636
蛇形填数时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 13 28 ...
- Java重载和覆盖
重写 Overriding 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 1.参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载. 2.返 ...
- Linux下C++开发教程收集
http://blog.csdn.net/wangfengwf/article/category/1315687 http://wiki.jikexueyuan.com/list/c/(极客学院C++ ...
- 以"小刀会“的成败论当今创业成败
讲起"小刀会",熟悉的人或许非常熟悉,不熟悉的人或许根本不知道清末有这样一个组织. 依据翻查史料,最初的小刀会是在福建成立的,来源有两个.一个是天地会的分支,一个是白莲教分支. 而 ...
- linux c编程訪问数据库
源代码例如以下: #include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> int main( ...