android 判断设备类型是否拥有相机

Android camera2 判断相机功能是否可控的实例-Android开发-源码库|专注为中国站长提供免费商业网站源码下载!
当前位置:----Android camera2 判断相机功能是否可控的实例
Android camera2 判断相机功能是否可控的实例
Android Camera2 可调功能适配
首先获取到设备等级:
Float hardwareLevel = mCameraCharacteristics._SUPPORTED_HARDWARE_LEVEL);
LEGACY & LIMITED & FULL & LEVEL_3. 越靠右边权限越大
&INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY = 2
&INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0
&INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1
&INFO_SUPPORTED_HARDWARE_LEVEL_3 = 3
在相应的等级下面会有各自支持的功能,LEGACY为最低权限
在LIMITED中
Additional capabilities may optionally be supported by a LIMITED-level device, and can be checked for in *android.request.availableCapabilities*.
android.request.availableCapabilities
介绍:List of capabilities that this camera device advertises as fully supporting.
int[] ints = mCameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
Possible values:
&BACKWARD_COMPATIBLE
&MANUAL_SENSOR
&MANUAL_POST_PROCESSING
&PRIVATE_REPROCESSING
&READ_SENSOR_SETTINGS
&BURST_CAPTURE
&YUV_REPROCESSING
&DEPTH_OUTPUT
&CONSTRAINED_HIGH_SPEED_VIDEO
For example manual_semsor:REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR
The camera device can be manually controlled (3A algorithms such as auto-exposure, and auto-focus can be bypassed). The camera device supports basic manual control of the sensor image acquisition related stages. This means the following controls are guaranteed to be supported:
Manual frame duration control
- android.sensor.frameDuration
- .maxFrameDuration
Manual exposure control
- android.sensor.exposureTime
- .exposureTimeRange
Manual sensitivity control
- android.sensor.sensitivity
- .sensitivityRange
Manual lens control (if the lens is adjustable)
- android.lens.*
Manual flash control (if a flash unit is present)
- android.flash.*
Manual black level locking
- android.blackLevel.lock
Auto exposure lock
- android.control.aeLock
这些值对应的特征值举例:
final String name3 = CaptureRequest.SENSOR_FRAME_DURATION.getName();
name3 -》android.sensor.frameDuration
列出这个的意思是,如果想知道该设备是否支持此功能,可以通过getName()获取其包名,然后在
mCameraCharacteristics.getAvailableCaptureRequestKeys();生成的队列中寻找。
如果有匹配则是可控;
CaptureRequest.LENS_FOCUS_DISTANCE;调节焦距
CaptureRequest.CONTROL_AF_MODE;自动对焦模式
CaptureRequest.SENSOR_SENSITIVITY 调节iso
CaptureRequest.CONTROL_AE_MODE 自动曝光模式
以上这篇Android camera2 判断相机功能是否可控的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持ASPKU源码库。
注:相关教程知识阅读请移步到频道。
相关Android开发:
热门标签:
Android开发搜索
Android开发推荐
热门源码推荐
热门Android开发
©201213597人阅读
android开发(90)
检测可用的特性// get Camera parameters
Camera.Parameters params = mCamera.getParameters();
List&String& focusModes = params.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
// Autofocus mode is supported
}  你可以对大多数相机特性使用以上所示方法.Camera.Parameters对象提供了一个getSupported...(),is...Supported()&or&getMax...()方法来确定一个特性是否被支持.  如果你的应用需要特定的相机特性,你可以通过在你的应用的manifest文件中添加请求.当你声明要使用特定相机特性,比如闪光灯和自动对焦,Google&Play就会阻止你的应用被安装到不支持这些特性的设备上.使用相机特性  当设置要使用的相机特性时,首先要理解的是不是所有的设备都支持所有的特性.另外,一个特性可能被在不同的级别上支持或带有不同的选项.因此,当你开发一个相机应用时,需要决定支持哪些特性以及支持到什么级别.当决定之后,你应在代码中包含检测设备是否支持所需特性,然后在不支持时要有优雅的錯误处理.  你可以通过获取一个相机参数对象的实例来检测,并且检测相关的方法们.下面的代码向你展示了如何得到一个Camera.Parameters对象并检测是否支持自动对焦特性:  大多数相机特性都可以通过Camera.Parameters进行管理.你要获取此对象,首先获取一个相机对象的实例,然后调用getParameters()方法.改变所获取的parameter对象,然后把它设置回相机对象,就像下面所演示的:// 获取Camera parameters
Camera.Parameters params = mCamera.getParameters();
// 设置聚焦模式
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
// 设置Camera parameters
mCamera.setParameters(params);此方法对于绝大多数相机特性都有效,并且大多数参数可以在任何时刻进行改变.对于参数的改变通常都是马上在应用的相机预览中表现出来.在软件解度看,参数的改变可能经过多帧后才能生效,因为硬件要处理新的指令然后发送更新的图像数据.重要:&一些相机特性不能被任务改变.特别的,改变相机预览的大小或方向需要你首先停止预览,改变预览大小或方向,然后重启预览.从Android&4.0&(API&Level&14),预览方向可以不用重启而改变.其它的相机特性需要更多的代码,包括:l&Metering&and&focus&areasl&Face&detectionl&ime&lapse&video测光与聚焦区域  在一些情况下摄像,自动对焦和测光不能产生期望的结果.从Android&4.0&(API&Level&14)开始,你的相机应用可以提供额外的控制,&允许你的应用或用户指定图像中的某块区域进行聚焦或曝光级别设置,然后把这些值传给相机,以应用于抓取像片或录制视频.  测光和聚焦区域的工作方式与其它相机特性十分相似,你通过Camera.Parameters&对象控制它们.下面的代码演示了为一个相机实例设置两个测光区域://&创建一个相机实例mCamera = getCameraInstance();
// 设置相机参数们
Camera.Parameters params = mCamera.getParameters();
if (params.getMaxNumMeteringAreas() & 0){ // 检查是否支持测光区域
List&Camera.Area& meteringAreas = new ArrayList&Camera.Area&();
Rect areaRect1 = new Rect(-100, -100, 100, 100);
// 在图像的中心指定一个区域
meteringAreas.add(new Camera.Area(areaRect1, 600)); // 设置宽度到60%
Rect areaRect2 = new Rect(800, -, -800);
// 在图像的右上角指定一个区域
meteringAreas.add(new Camera.Area(areaRect2, 400)); // 收置宽度为40%
params.setMeteringAreas(meteringAreas);
mCamera.setParameters(params);
Camera.Area对象包含两个数据参数:一个Rect对象指定了相机视口中的一块区域,还有一个宽度,告诉相机在测光或聚焦计算中此区域的重要程度.Camera.Area对象的Rect字段描述了一个矩形区域在一个2000&x&2000个单元格组成的区域中的映射位置.坐标-1000,&-1000代表了top,&left,并且坐标代表了bottom,&right,如下面示意图所示:图1.红线表示在相机预览中指定一个Camera.Area所在的坐标系.蓝框表示一个相机区域的位置和形状,其坐标值为:333,333,667,667.此坐标系的边界总是与相机预览图像的外边界一至,并且不会随着变焦变大或变小.同样的,使用Camera.setDisplayOrientation()旋转预览图像也不会改变做标系.人脸检测对于包含人的图像,脸往往是图像中最重要的部分,并且在拍照时,脸部被用于对焦和白平衡.Android&4.0&(API&Level&14)框架提供了识别面部的和跟据其计算图像设置的API们.注:当启用面部检测特性时,setWhiteBalance(String),&setFocusAreas(List)&和setMeteringAreas(List)不再起作用.使用面部检测特性通常需要以下几步:l&检查设备是否支持面部检测l&创建一个面部检测监听器l&添加面部检测监听器到你的相机对象.l&预览开始后开始面部检测(并且每次重启预览后同样)  面部检测特性不是在所有的设备上都支持.你可以调用getMaxNumDetectedFaces()来检测是否支持.为了接收到面部检测的通知并作出响应,你的相机应用中必须为面部检测事件设置一个监听器.所以你必须创建一个监听类,它实现Camera.FaceDetectionListener接口,如下代码所示:class MyFaceDetectionListener implements Camera.FaceDetectionListener {
public void onFaceDetection(Face[] faces, Camera camera) {
if (faces.length & 0){
Log.d(&FaceDetection&, &face detected: &+ faces.length +
& Face 1 Location X: & + faces[0].rect.centerX() +
&Y: & + faces[0].rect.centerY() );
}创建此类后,你就可以把它设置给你的应用的相机对象,如下代码所示:
mCamera.setFaceDetectionListener(new MyFaceDetectionListener());你的应用必须在每次启动(或重启)预览时启动面部检测.创建一个方法专用于开启面部检测,你便可以在需要时调用它,如下例如示:public void startFaceDetection(){
// Try starting Face Detection
Camera.Parameters params = mCamera.getParameters();
// start face detection only *after* preview has started
if (params.getMaxNumDetectedFaces() & 0){
// camera supports face detection, so can start it:
mCamera.startFaceDetection();
}你必须在每次开始(或重启)预览时开启脸部检测.如果你使用"创建一个预览类"一节中的预览类,把你的startFaceDetection()方法添加到你的预览类的surfaceCreated()和surfaceChanged()方法中,如下面代码所示:public void surfaceCreated(SurfaceHolder holder) {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
startFaceDetection(); // start face detection feature
} catch (IOException e) {
Log.d(TAG, &Error setting camera preview: & + e.getMessage());
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mHolder.getSurface() == null){
// preview surface does not exist
Log.d(TAG, &mHolder.getSurface() == null&);
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
Log.d(TAG, &Error stopping camera preview: & + e.getMessage());
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
startFaceDetection(); // re-start face detection feature
} catch (Exception e){
// ignore: tried to stop a non-existent preview
Log.d(TAG, &Error starting camera preview: & + e.getMessage());
}注:记住在调用startPreview()后要调用此函数.不要试图在你的应用的actvitiy的onCreate()中启动脸部检测,因为此时预览还没有启动呢.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1774107次
积分:18479
积分:18479
排名:第397名
原创:87篇
转载:10篇
译文:82篇
评论:482条
文章:16篇
阅读:100238
文章:86篇
阅读:1032324
文章:30篇
阅读:417509
(1)(1)(1)(1)(2)(1)(1)(16)(9)(7)(1)(1)(1)(1)(1)(1)(1)(1)(2)(2)(3)(1)(4)(3)(5)(4)(2)(4)(7)(4)(5)(7)(10)(15)(14)(19)(9)(7)(1)(1)(1)(3)(1)1800人阅读
Android开发(19)
在多媒体应用中,Image是最基础的功能模块,接下来我们将看看在Android中是如何获取和存储Image的。Android内嵌的Image获取和存储功能,可以让我们对于整个媒体框架有个比较全面的了解,同时为audio和video的学习打下基础。
& && & 一、Image的获取可以通过调Android自带的Camera应用来完成。该应用含有一个Intent-Filter。通过使用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent)就可以启动Camera应用了。
& && & 二、Image存储,Android系统中含有一个多媒体库,其中包括所有Image、Video、Audio的数据。通过MediaStore对象可以访问相关数据。
java代码:
package&eoe.&&&import&java.io.F&&&import&android.app.A&&&import&android.content.ContentV&&&import&android.content.I&&&import&android.graphics.B&&&import&android.graphics.BitmapF&&&import&android.net.U&&&import&android.os.B&&&import&android.os.E&&&import&android.provider.MediaS&&&import&android.util.L&&&import&android.view.D&&&import&android.view.V&&&import&android.widget.B&&&import&android.widget.ImageV&&&&&&&&&&&&&public&class&MainActivity&extends&Activity&{&&&private&static&final&int&RESULT_CODE&=&1;&&&private&Button&btnC&&&private&ImageView&imageV&&&private&Uri&imageFileP&&&@Override&&&public&void&onCreate(Bundle&savedInstanceState)&{&&&super.onCreate(savedInstanceState);&&&setContentView(R.layout.main);&&&imageView&=&(ImageView)this.findViewById(R.id.imageView);&&&btnCamera&=&(Button)this.findViewById(R.id.camera);&&&btnCamera.setOnClickListener(new&View.OnClickListener()&{&&&@Override&&&public&void&onClick(View&v)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Intent&intent&=&new&Intent(MediaStore.ACTION_IMAGE_CAPTURE);&&&&&&&&&ContentValues&values&=&new&ContentValues(3);&&&values.put(MediaStore.Images.Media.DISPLAY_NAME,&&testing&);&&&values.put(MediaStore.Images.Media.DESCRIPTION,&&this&is&description&);&&&values.put(MediaStore.Images.Media.MIME_TYPE,&&image/jpeg&);&&&imageFilePath&=&MainActivity.this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,&values);&&&intent.putExtra(MediaStore.EXTRA_OUTPUT,&imageFilePath);&&&&&&&&&startActivityForResult(intent,&RESULT_CODE);&&&}&&&});&&&}&&&&&&&&@Override&&&public&void&onActivityResult(int&requestCode,&int&resultCode,&Intent&data){&&&super.onActivityResult(requestCode,&resultCode,&data);&&&if(resultCode&==&RESULT_CODE){&&&&&&&&&try&{&&&Bundle&extra&=&data.getExtras();&&&&&&&&&&&&&&&&&&&&&&&Display&display&=&this.getWindowManager().getDefaultDisplay();&&&&&int&dw&=&display.getWidth();&&&int&dh&=&display.getHeight();&&&&&&&&&&&BitmapFactory.Options&op&=&new&BitmapFactory.Options();&&&&&op.inJustDecodeBounds&=&true;&&&&&&&Bitmap&pic&=&BitmapFactory.decodeStream(this&.getContentResolver().openInputStream(imageFilePath),&null,&op);&&&int&wRatio&=&(int)&Math.ceil(op.outWidth&/&(float)&dw);&&&int&hRatio&=&(int)&Math.ceil(op.outHeight&/&(float)&dh);&&&Log.v(&Width&Ratio:&,&wRatio&+&&&);&&&Log.v(&Height&Ratio:&,&hRatio&+&&&);&&&&&&&&&&&&&if&(wRatio&&&1&&&&hRatio&&&1)&{&&&if&(wRatio&&&hRatio)&{&&&op.inSampleSize&=&wR&&&}&else&{&&&op.inSampleSize&=&hR&&&}&&&}&&&op.inJustDecodeBounds&=&false;&&&&&pic&=&BitmapFactory.decodeStream(this.getContentResolver()&.openInputStream(imageFilePath),&null,&op);&&&imageView.setImageBitmap(pic);&&&}&catch&(Exception&e)&{&&&e.printStackTrace();&&&}&&&}&&&}&&&}&&&
转:/thread-.html
在onActivityResult函数你忘记了这句
super.onActivityResult(requestCode, resultCode, data);
附上我的代码(和你的相对应的),你相对应地方如果有问题就对照吧
Intent i = new Intent(
&android.media.action.IMAGE_CAPTURE&);
startActivityForResult(i,
Activity.DEFAULT_KEYS_DIALER);
//第二个函数
super.onActivityResult(requestCode, resultCode, data);
ivPic = (ImageView) findViewById(R.id.ivPic);
if (useCamera) {
if (resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
myBitmap = (Bitmap) extras.get(&data&);
ivPic.setImageBitmap(myBitmap);
ivPic.setVisibility(View.VISIBLE);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:369633次
积分:4486
积分:4486
排名:第5743名
原创:20篇
转载:393篇
评论:28条
(5)(3)(1)(2)(4)(6)(5)(3)(4)(3)(1)(6)(1)(7)(20)(5)(1)(2)(5)(14)(26)(5)(7)(1)(1)(1)(16)(2)(14)(8)(4)(8)(11)(7)(16)(4)(4)(7)(21)(8)(10)(1)(4)(5)(2)(15)(5)(12)(4)(2)(6)(1)(6)(11)(1)(11)(1)(4)(35)(13)4452人阅读
ANDROID(42)
看官方API发现的一行,记录下来
android:name=&android.hardware.camera&
文档说调用相机功能要增加这行到配置文件里,表明用到相机功能。(貌似根据网上例子没加这个也能打开默认相机功能。)
It's then your responsibility to check for the availabilityof the camera at runtime by calling.If
a camera is not available, you should then disable your camera features.
要通过这个来检查设备是否有照相机功能,没有的话就要根据情况调整,或者是关闭相机功能,避免出错。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:209411次
积分:2028
积分:2028
排名:第16743名
原创:18篇
转载:45篇
评论:35条
(2)(1)(1)(1)(2)(2)(1)(4)(1)(9)(1)(5)(23)(10)

我要回帖

更多关于 ios 判断相机是否授权 的文章

 

随机推荐