安卓有nikon capturee吗

&nbsp›&nbsp&nbsp›&nbsp&nbsp›&nbsp
使用Camera2 替代过时的Camera API
概要从5.0开始(API Level 21),可以完全控制安卓设备相机的新api Camera2(android.hardware.Camera2)被引入了进来。在以前的Camera api(android.hardware.Camera)中,对相机的手动控制需要更改系统才能实现,而且api也不友好。不过老的Camera API在5.0上已经过时,在未来的app开发中推荐的是Camera2 API。 && L版本之前的Camera API&&&&&& 有限的图片数据流获取方式
&&&&&& 有限相机状态信息&&&&&& 没有手动捕获控制 & &Camera2 API & & & &Supports 30fps full resolution with burst mode&&&&&& 支持30fps的全高清连拍 & & & &Supports change on manual camera settings between frame capture&&&&&& 支持帧之间的手动设置 & & & &Supports RAW image capture&&&&&& 支持RAW格式的图片拍摄 & & & &Supports Zero Shutter Lag & Movie Snapshot&&&&&& 支持快门0延迟以及电影速拍 & & & &Supports setting other manual camera device controls including level of Noise Cancelling&&&&&&& 支持相机其他方面的手动控制包括噪音消除的级别Resolution相机的基本使用被分成了5个主要部分()(CameraManager,CameraDevice,CameraCaptureSession,CaptureRequest,CaptureResult) &
CameraManager: &&&&&& 提供构建,列出以及链接相机设备的接口 & & &&
& &CameraDevice: &&&&&& 代表和安卓设备相连的单个相机 & & & & & &CameraCaptureSession: &&&&&& 提供一套输出目标的surface(TextureView,MediaRecorder,MediaCodec,ImageReader,RenderScriptAllocation)。 & & & & & &CaptureRequest: & & & &Settings and outputs needed to capture a single image from the camera device
& & & &Create request builder by predefined templates(TEMPLATE_PREVIEW,
TEMPLATE_RECORD, TEMPLATE_STILL_CAPTURE, TEMPLATE_VIDEO_SNAPSHOT,
TEMPLATE_MANUAL) & & & &This requests are given to capture or setRepeatingRequest to capture images from the camera
& &CaptureResult:&&&&&& 从图像传感器获得的单个图片拍摄的结果。 & & & &更详细的内容,需要通读Camera2包的概要介绍页还有一个YouTube上的谷歌开发者的介绍视频,解释了Camera2 API的改动:DevBytes:Android L开发者预览之- Camera2 API你需要记住在安卓设备上,Camera2 API的所有特性并不都总是可用的。取决于设备本身。为了检查那些特性可用,可以使用CameraCharacteristics来获得支持信心。&&&&characteristics._SUPPORTED_HARDWARE_LEVEL);返回的结果分为级别的相机功能,按照 全支持& 有限支持& 看心情赠送的顺序排列: & &INFO_SUPPORTED_HARDWARE_LEVEL_FULL&&&&&& 全方位的硬件支持,允许手动控制全高清的摄像。如果返回的是这个,连拍模式以及其他新特性都是可用的。 & & & & & &INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED&&&&&& 一个“有限支持”的设备可能有一些或者没有“全支持”设备的特性。有些特性可能不属于任何硬件级别,需要单独查询。 & & &&
& &INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY&&&&&& 所有的设备都会有的特性。这和过时的Camera API所支持的特新是一样的。&& & && 虽然推荐在未来的app中使用Camera2 API,但是只有Lollipop的设备商才可用,也不大可能会出现兼容老设备的包。因此在最小版本(minSdkVersion)升到21之前,你还是需要继续使用Camera API(android.hardware.Camera)。不过你可以用下面的代码对不同的版本区别对待:&&&&if&(Build.VERSION.SDK_INT&&&Build.VERSION_CODES.LOLLIPOP)&{
&&&&&&&&//&your&code&using&Camera&API&here&-&is&between&1-20
&&&&}&else&if(Build.VERSION.SDK_INT&&=&Build.VERSION_CODES.LOLLIPOP)&{
&&&&&&&&//&your&code&using&Camera2&API&here&-&is&api&21&or&higher
&&&&}最后,在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考:1.Camera2 Basic : 演示如何使用Camera2
API基本功能的demo。你可以从中学会如何遍历相机设备的所有特性,显示预览照片,以及拍照。2.Camera2 Video:这个demo演示如何使用Camera2 API录制视频。3.Camera2 master: 使用Android L Camera2 API开发的示例应用程序,具备拍照,AWB,Flash,连拍功能4.LCameraL Camera是一个开源的实验性质的Camera应用程序,基于Android L提供的新API android.hardware.camera2,目前只支持在Andorid 5.0 Lollipop版本的Nexus 5和Nexus 6上运行
上一篇: 转载自: http://codethink.me//improving-comment-rendering-on-android/ ,以下为译文原文: 原文链接: Improving Comment Rendering on Android 上周,成千上万来自全世界的IG用户齐聚在社区组织的先下聚会 Worldwide InstaMeet11上。WWIM11 是
下一篇: 转载自: Android中判断app何时启动和关闭的技术研究 原文链接: /2015/04/android-determine-when-app-is-opened-or-closed/ 存在的问题 Android开发中不可避免的会遇到需要检查app何时进入前台,何时被用户关闭。奇怪的是,要您现在的位置: &
软件大小:950.0 KB
软件授权:免费
软件评级:
语言:简体中文
已经有个网友点评
Screen Recorder & Capture 5.0+软件简介
屏幕录制截图Screen Recorder & Capture 5.0+是一个能在安卓5.0以上的设备上运行的简单易用的录屏和截图应用。它使用安卓棒棒糖的官方API所以它不需要root权限。视频和图像存储在一个容易找到的文件夹,这样你就可以使用自己喜欢的应用程序,查看,编辑和共享它们。★ 魔法按钮:一个可以用来控制你的录制却不会在屏幕上显示任何东西的按钮。因此,您的视频观众将完全专注于应用程序,游戏或任何你想截屏。★ 修剪视频:截屏视频可以很长,包含不必要的信息,您可以修剪你不想让你的视频更令人印象深刻的部分。*为Android 5.1 *,请不要选择在屏幕上捕捉权限对话框中的“不再显示”,以避免“系统UI已停止”错误。要是已经这么干了请重新安装。
*应用权限:
?允许应用程序录制音频
?允许应用程序写入外部存储,如SD卡上写文件
?允许应用程序读取或写入系统设置
?允许应用程序打开系统窗口,显示其他应用程序
?允许应用程序读取扩展存储器
喜欢屏幕录制截图的人还喜欢
最新更新下载
今日最新更新
同类下载排行工具类排行
喜欢这个应用的还喜欢您的位置:
→ Adobe Capture CC v1.1.135 安卓版
Adobe Capture CC v1.1.135 安卓版Adobe Capture安卓下载|
网友评分:8
软件大小:31.8M
软件语言:英文
软件类型:国外软件
软件类别:免费软件 / 主题美化
更新时间:
软件等级:
官方网站:
运行环境:Android
软件厂商:
顶好评:50%
同类相关软件
1.5M/中文/10.03.6M/中文/.09.0M/中文/10.04.1M/中文/10.08.8M/英文/10.0
Adobe Capture CC app是一款由能够使用手机随时手机生活中的设计素材的神器,例如笔刷和直接变矢量图等,素材你可以直接在电脑端中的PS或者AL中使用,是一款更加丰富和个性化的笔刷制作工具,欢迎需要的朋友来下载体验吧!应用介绍迅速撷取、编辑和分享特别制作设计的资讯 (包括笔刷、色彩、滤镜和形状) 用于像 Adobe
CC 之类的应用程式。 可说是集 Brush CC、Color CC 和 Shape CC 于一身。软件特色色彩,从相片和您周遭世界撷取色彩主题 选择依色彩理论计算出的预设值,或以色**和 RGB 滑杆手动变更。形状,即时转换您眼中所见及手中所绘成为向量图案。 以滑杆调整对比及建立填充。 然后,切换 +/C 以增加或移除细节。笔刷,将启发灵感的相片或图片转变为高品质的带式、渍状或向量型式的笔刷。 微调其色彩、尺寸和重覆性。LOOK,从您珍视的时光撷取色彩与光线u作增强影片的滤镜。 3D 色阶分淹己土炼然巳媚苁泳趸匚⒌ Look。CREATIVE CLOUD LIBRARIES,您的资产库将自动与您的 Creative Cloud 帐号同步,让您能即时在相容应用程式e存取。POWERED BY CREATIVESYNC,Adobe CreativeSync 可确保您的档案、字型、设计资产、设定等,在您需要时即时出现在工作流程中。 在任何装置展开您的创意作品设计,并流畅地以其他装置接续未完成的工作。更新说明错误修复提升了整体性能和稳定性。
其他版本下载
Adobe Capture CC v1.1.135 安卓版
软件无法下载或下载后无法使用,请点击报错,谢谢!
请描述您所遇到的错误,我们将尽快予以修正,谢谢!
*必填项,请输入内容
本类下载排行
10.01 10.02 10.03 10.04 10.05 10.06 10.07 10.08 10.09 10.010 10.011 10.012 10.013 10.014 10.015
本类精品软件
7.2M/中文/10.07.8M/中文/10.07.6M/中文/10.07.5M/中文/10.03.9M/中文/10.03.2M/中文/10.0
装机必备软件
本类集合软件前面对Camera2的初始化以及预览的相关流程进行了详细分析,本文将会对Camera2的capture(拍照)流程进行分析。
前面分析preview的时候,当预览成功后,会使能ShutterButton,即可以进行拍照,定位到ShutterButton的监听事件为onShutterButtonClick方法:
//CaptureModule.java
public void onShutterButtonClick() {
//Camera未打开
if (mCamera == null) {
int countDownDuration = mSettingsManager.getInteger(SettingsManager    .SCOPE_GLOBAL,Keys.KEY_COUNTDOWN_DURATION);
if (countDownDuration & 0) {
// 开始倒计时
mAppController.getCameraAppUI().transitionToCancel();
mAppController.getCameraAppUI().hideModeOptions();
mUI.setCountdownFinishedListener(this);
mUI.startCountdown(countDownDuration);
// Will take picture later via listener callback.
//即刻拍照
takePictureNow();
首先,读取Camera的配置,判断配置是否需要延时拍照,此处分析不需延时的情况,即调用takePictureNow方法:
//CaptureModule.java
private void takePictureNow() {
if (mCamera == null) {
Log.i(TAG, "Not taking picture since Camera is closed.");
//创建Capture会话并开启会话
CaptureSession session = createAndStartCaptureSession();
//获取Camera的方向
int orientation = mAppController.getOrientationManager()
.getDeviceOrientation().getDegrees();
//初始化图片参数,其中this(即CaptureModule)为PictureCallback的实现
PhotoCaptureParameters params = new PhotoCaptureParameters(
session.getTitle(), orientation, session.getLocation(),
mContext.getExternalCacheDir(), this, mPictureSaverCallback,
mHeadingSensor.getCurrentHeading(), mZoomValue, 0);
//装配Session
decorateSessionAtCaptureTime(session);
mCamera.takePicture(params, session);
它首先调用createAndStartCaptureSession来创建一个CaptureSession并且启动会话,这里并且会进行初始参数的设置,譬如设置CaptureModule(此处实参
为this)为图片处理的回调(后面再分析):
//CaptureModule.java
private CaptureSession createAndStartCaptureSession() {
//获取会话时间
long sessionTime = getSessionTime();
//当前位置
Location location = mLocationManager.getCurrentLocation();
//设置picture name
String title = CameraUtil.instance().createJpegName(sessionTime);
//创建会话
CaptureSession session = getServices().getCaptureSessionManager()
.createNewSession(title, sessionTime, location);
//开启会话
session.startEmpty(new CaptureStats(mHdrPlusEnabled),new Size(
(int) mPreviewArea.width(), (int) mPreviewArea.height()));
首先,获取会话的相关参数,包括会话时间,拍照的照片名字以及位置信息等,然后调用Session管理来创建CaptureSession,最后将此CaptureSession
启动。到这里,会话就创建并启动了,所以接着分析上面的拍照流程,它会调用OneCameraImpl的takePicture方法来进行拍照:
//OneCameraImpl.java
public void takePicture(final PhotoCaptureParameters params, final CaptureSession session) {
// 除非拍照已经返回,否则就广播一个未准备好状态的广播,即等待本次拍照结束
broadcastReadyState(false);
//创建一个线程
mTakePictureRunnable = new Runnable() {
public void run() {
takePictureNow(params, session);
//设置回调,此回调后面将分析,它其实就是CaptureModule,它实现了PictureCallback
mLastPictureCallback = params.
mTakePictureStartMillis = SystemClock.uptimeMillis();
//如果需要自动聚焦
if (mLastResultAFState == AutoFocusState.ACTIVE_SCAN) {
mTakePictureWhenLensIsStopped = true;
takePictureNow(params, session);
在拍照里,首先广播一个未准备好的状态广播,然后进行拍照的回调设置,并且判断是否有自动聚焦,如果是则将mTakePictureWhenLensIsStopped 设为ture,
即即刻拍照被停止了,否则则调用OneCameraImpl的takePictureNow方法来发起拍照请求:
//OneCameraImpl.java
public void takePictureNow(PhotoCaptureParameters params, CaptureSession
session) {
long dt = SystemClock.uptimeMillis() - mTakePictureStartM
// 构造JPEG图片拍照的请求
CaptureRequest.Builder builder = mDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
builder.setTag(RequestTag.CAPTURE);
addBaselineCaptureKeysToRequest(builder);
// Enable lens-shading correction for even better DNGs.
if (sCaptureImageFormat == ImageFormat.RAW_SENSOR) {
builder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
} else if (sCaptureImageFormat == ImageFormat.JPEG) {
builder.set(CaptureRequest.JPEG_QUALITY, JPEG_QUALITY);
.getJpegRotation(params.orientation, mCharacteristics));
//用于preview的控件
builder.addTarget(mPreviewSurface);
//用于图片显示的控件
builder.addTarget(mCaptureImageReader.getSurface());
CaptureRequest request = builder.build();
if (DEBUG_WRITE_CAPTURE_DATA) {
final String debugDataDir = makeDebugDir(params.debugDataFolder,
"normal_capture_debug");
Log.i(TAG, "Writing capture data to: " + debugDataDir);
CaptureDataSerializer.toFile("Normal Capture", request,
new File(debugDataDir,"capture.txt"));
//拍照,mCaptureCallback为回调
mCaptureSession.capture(request, mCaptureCallback, mCameraHandler);
} catch (CameraAccessException e) {
Log.e(TAG, "Could not access camera for still image capture.");
broadcastReadyState(true);
params.callback.onPictureTakingFailed();
synchronized (mCaptureQueue) {
mCaptureQueue.add(new InFlightCapture(params, session));
与preview类似,都是通过CaptureRequest来与Camera进行通信的,通过session的capture来进行拍照,
并设置拍照的回调函数为mCaptureCallback:
//CameraCaptureSessionImpl.java
public synchronized int capture(CaptureRequest request,CaptureCallback callback,Handler handler)throws CameraAccessException{
handler = checkHandler(handler,callback);
return addPendingSequence(mDeviceImpl.capture(request,createCaptureCallbackProxy(handler,callback),mDeviceHandler));
代码与preview中的类似,都是将请求加入到待处理的请求集,现在看CaptureCallback回调:
//OneCameraImpl.java
private final CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback(){
public void onCaptureStarted(CameraCaptureSession session,CaptureRequest request,long timestamp,long frameNumber){     //与preview类似
if(request.getTag() == RequestTag.CAPTURE&&mLastPictureCallback!=null){
mLastPictureCallback.onQuickExpose();
public void onCaptureCompleted(CameraCaptureSession session,CaptureRequest request,TotalCaptureResult result){
autofocusStateChangeDispatcher(result);
if(result.get(CaptureResult.CONTROL_AF_STATE) == null){       //检查自动聚焦的状态
AutoFocusHelper.checkControlAfState(result);
if(request.getTag() == RequestTag.CAPTURE){
synchronized(mCaptureQueue){
if(mCaptureQueue.getFirst().setCaptureResult(result).isCaptureComplete()){
capture = mCaptureQueue.removeFirst();
if(capture != null){         //拍照结束
OneCameraImpl.this.onCaptureCompleted(capture);
super.onCaptureCompleted(session,request,result);
这是Native层在处理请求时,会调用相应的回调,如capture开始时,会回调onCaptureStarted,具体的在preview中有过分析,当拍照结束时,会回调
onCaptureCompleted方法,其中会根据CaptureResult来检查自动聚焦的状态,并通过TAG判断其是Capture动作时,再来看它是否是队列中的第一个请求,
如果是,则将请求移除,因为请求已经处理成功,最后再调用OneCameraImpl的onCaptureCompleted方法来进行处理:
//OneCameraImpl.java
private void onCaptureCompleted(InFlightCapture capture){
if(isCaptureImageFormat == ImageFormat.RAW_SENSOR){
File dngFile = new File(RAW_DIRECTORY,capture.session.getTitle()+".dng");
writeDngBytesAndClose(capture.image,capture.totalCaptureResult,mCharacteristics,dngFile);
//解析result中的图片数据
byte[] imageBytes = acquireJpegBytesAndClose(capture.image);
//保存Jpeg图片
saveJpegPicture(imageBytes,capture.parameters,capture.session,capture.totalCaptureResult);
broadcastReadyState(true);
//调用回调
capture.parameters.callback.onPictureTaken(capture.session);
如代码所示,首先,对result中的图片数据进行了解析,然后调用saveJpegPicture方法将解析得到的图片数据进行保存,最后再调用
里面的回调(即CaptureModule,前面在初始化Parameters时说明了,它实现了PictureCallbak接口)的onPictureTaken方法,所以,
接下来先分析saveJpegPicture方法:
//OneCameraImpl.java
private void saveJpegPicture(byte[] jpegData,final PhotoCaptureParameters captureParams,CaptureSession session,CaptureResult result){
ListenableFuture&Optional&Uri&& futureUri = session.saveAndFinish(jpegData,width,height,rotation,exif);
Futures.addCallback(futureUri,new FutureCallback&Optional&Uri&&(){
public void onSuccess(Optional&Uri& uriOptional){
captureParams.callback.onPictureSaved(mOptional.orNull());
public void onFailure(Throwable throwable){
captureParams.callback.onPictureSaved(null);
它最后会回调onPictureSaved方法来对图片进行保存,所以需要分析CaptureModule的onPictureSaved方法:
//CaptureModule.java
public void onPictureSaved(Uri uri){
mAppController.notifyNewMedia(uri);
mAppController的实现为CameraActivity,所以分析notifyNewMedia方法:
//CameraActivity.java
public void notifyNewMedia(Uri uri){
if(FilmstripItemUtils.isMimeTypeVideo(mimeType)){    //如果拍摄的是video
sendBroadcast(new Intent(CameraUtil.ACTION_NEW_VIDEO,uri));
newData = mVideoItemFactory.queryContentUri(uri);
}else if(FilmstripItemUtils.isMimeTypeImage(mimeType)){    //如果是拍摄图片
CameraUtil.broadcastNewPicture(mAppContext,uri);
newData = mPhotoItemFactory.queryCotentUri(uri);
new AsyncTask&FilmstripItem,Void,FilmstripItem&(){
protected FilmstripItem doInBackground(FilmstripItem... Params){
FilmstripItem data = params[0];
MetadataLoader.loadMetadata(getAndroidContet(),data);
由代码可知,这里有两种数据的处理,一种是video,另一种是image。而我们这里分析的是capture图片数据,所以首先会根据在回调函数
传入的参数Uri和PhotoItemFactory来查询到相应的拍照数据,然后再开启一个异步的Task来对此数据进行处理,即通过MetadataLoader的
loadMetadata来加载数据,并返回。至此,capture的流程就基本分析结束了,下面将给出capture流程的整个过程中的时序图:
阅读(...) 评论()

我要回帖

更多关于 adobe capture 安卓 的文章

 

随机推荐