2015年1月24日星期六

Gradle用户指南(章8:依赖关系管理基础) - 梦希

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Gradle用户指南(章8:依赖关系管理基础) - 梦希  阅读原文»

章8:依赖关系管理基础

本章将介绍一些gradle依赖关系管理的基础

  1. 什么是依赖关系管理?

    简略的说,依赖管理是由两部分组成的。首先,gradle需要知道你要构建或者运行的项目,以便找到它们。我们将这些导入的文件视为项目的依赖。第二,gradle需要构建或者打包你的项目产品。我们将这些导出的文件视为项目的发布。下面,让我们在细节上更多的了解这两个方面。

    大部分项目都不是完全彻底的独立的。它们需要其他项目的构建文件,以便编译、测试等等。例如,为了在我的项目中使用Hibernate,当编译我的源文件时就需要在classpath添加一些Hibernate的jar包。为了运行测试,我需要在test classpath下添加另外一些jar包,比如独有的jdbc驱动、java的缓存框架。

    这些项目依赖需要导入的文件。Gradle允许你告诉它你的项目依赖哪些文件,所以它才关心查找哪些依赖,并有效的导入到你项目中。这些依赖可能在远程Maven or Ivy下载,也可能在本地仓库中,或者是多项目构建中的另外的项目。我们把这个过程叫做依赖解析。

    注意,该特性是gradle相对ant的优势所在。在ant中,你只能加载指定绝对路径或者相对路径的jar包。使用gradle,只需在依赖中声明这些"names"和层次结构就可以确定在哪里获取这些文件。你可以添加apache ivy来获取ant的类似操作,单gradle可以做的更好。

    项目的依赖文件本身常常也有自己的依赖。例如,运行Hibernate核心库需要在classpath中声明数个其他类库。所以,当gradle测试你的项目时,也需要寻找并加载这些依赖文件。我们可以称其为依赖传递。

    大多数项目的主要目标是构建一些可以在项目外运行的文件。例如,你的项目产品是一个java库,就需要构建一个jar包,或者一个jar源文件和一些文档,并在某些地方发布他们。

    Gradle也负责发布项目文件这个重要工作。你声明项目的发布包,gradle负责构建并发布他们。恰好,这些发布包依赖于你想做的工作。你可能想复制这些文件到本地目录,或者上传到远程Maven or Ivy仓库,或者在多项目中的其他项目中使用。我们一般称这个过程为发布。

  2. 声明你的依赖

    让我们来看一些依赖声明。下面是一个基础的构建脚本:

    这里发生了什么呢?这个构建脚本描述了这个项目的少许内容。首先,它规定了编译项目源文件需要Hibernate core 3.6.7.Final,也就是说Hibernate core的依赖在运行中是必须的。同时,这个脚本也规定了测试项目需要任意junit >= 4.0版本库。它也向gradle表明需要访问maven中央仓库寻找依赖文件。接下来的片段我们会有更详细的描述。

  3. 依赖配置项

    Gradle中依赖关系根据配置项分组,一个配置项包含一组简单命名的依赖。我们将引用这些配置项。你可以使用它们为你的项目声明外部依赖。正如我们随后将要看到的,他们也被用来声明你的项目产品。

    Java插件定义了许多标准的配置项。这些配置代码java插件所用的classpath。下面我们列出了一些常用项,当然你也可以在Table 23.5, "Java plugin - dependency configurations"中查看更多详情。

    Compile

    在编译项目源代码时需要的依赖

    Runtime

    运行项目classes需要的依赖。默认情况下,它也包含编译时依赖。

    TestCompile

    编译项目测试源代码时需要的依赖。默认情况下,它也包含编译的源文件及编译时依赖。

    testRuntime

    运行测试需要的依赖。默认情况下,它也包含编译、运行、测试编译时依赖。

    不同的插件提供不同的更深入的标准的配置项。你也可以在你的构建脚本中定义自己独有的配置项。请在 Section 51.3, "Dependency configurations" 中查看定义配置项详情。

  4. 外部依赖

    你可以声明各种类型的依赖。其中一种就是外部依赖,它依赖于当前构建外的一些文件。这些外部文件存储在一些仓库中,例如maven,Ivy或者本地文件系统。

    定义一个外部依赖并添加到配置项中:

    一个外部依赖可以用组、名称、版本等属性标识。这依赖于你所使用的仓库,组和版本是可选项,声明依赖的语法类似于:"group:name:version"。

    寻求更多依赖定义和工作: Section 51.4, "How to declare your dependencies".

  5. 仓库

    Gradle是怎么找到外部依赖文件的呢?gradle首先从仓库中寻找,一个仓库中集合了许多被分组、命名、版本组织的文件。Gradle能辨识不同的仓库类型例如maven、ivy,并且可以以不同的方式去访问这些仓库如本地文件系统、http等。

    缺省时,gradle没有定义任何仓库。在使用外部依赖前,你最少需要定义一个仓库。其中一个选择就是maven中央仓库:

    当然也可以是一个远程maven仓库:

    或者是一个远程ivy仓库:

    最后,你也可以把仓库设置在本地文件系统中。这种方式对maven、ivy都是有效的。

    一个项目可以有许多仓库。Gradle会根据声明顺序在这些仓库中检索依赖,当检索到指定模块时停止检索。

    To find out more about defining and working with repositories, have a look at Section 51.6, "Repositories".

  6. 发布项目工件

    依赖配置项也可以在发布文件中使用。我们通常称其为发布工件或者仅仅是工件。插件对项目发布工件的支持非常好,通常你不必向gradle声明需要发布什么。无论如何,你还是需要声明在哪里发布这些工件。你可以通过在uploadArchives任务附上仓库来实现发布工作。下面是一个发布到远程ivy仓库的示例:

    现在,当你执行gradle uploadArchives,gradle就会构建并上传你的jar包。Gradle也会同时生成并上传一个ivy.xml。

    当然,你也可以发布到maven中央仓库中。这些语法有些微的不同。注意,发布到maven仓库中需要添加maven插件。当配置完成,gradle会生成并上传一个pom.xml。

    To find out more about publication, have a look at Chapter 52, Publishing artifacts.

  7. 下一章是什么?

    如果你对dsl感兴趣,可以进入章9查看详情。


本文链接:Gradle用户指南(章8:依赖关系管理基础),转载请注明。

[Android]实现简单的相机程序 - Wossoneri  阅读原文»

好久没写了,有些东西做过都快忘了,赶紧记一下。

现在来实现一个简单的相机程序。

原文地址http://www.cnblogs.com/rossoneri/p/4246134.html

当然需要的话可以直接调用系统的camera程序,但自己实现会使用更自由。

呐,既然要用实现相机,那就需要先了解一下调用camera的类android.hardware.camera

android.hardware.Camera

The Camera class is used to set image capture settings, start/stop preview, snap pictures, and retrieve frames for encoding for video. This class is a client for the Camera service, which manages the actual camera hardware.

To access the device camera, you must declare the android.Manifest.permission.CAMERA permission in your Android Manifest. Also be sure to include the
<uses-feature> manifest element to declare camera features used by your application. For example, if you use the camera and auto-focus feature, your Manifest should include the following:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
To take pictures with this class, use the following steps:

Obtain an instance of Camera from open(int).
Get existing (default) settings with getParameters().
If necessary, modify the returned Camera.Parameters object and call setParameters(Camera.Parameters).
If desired, call setDisplayOrientation(int).
Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.
Important: Call startPreview() to start updating the preview surface. Preview must be started before you can take a picture.
When you want, call takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) to capture a photo. Wait for the callbacks to provide the actual image data.
After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
Call stopPreview() to stop updating the preview surface.
Important: Call release() to release the camera for use by other applications. Applications should release the camera immediately in android.app.Activity.onPause() (and re-open() it in android.app.Activity.onResume()).
To quickly switch to video recording mode, use these steps:

Obtain and initialize a Camera and start preview as described above.
Call unlock() to allow the media process to access the camera.
Pass the camera to android.media.MediaRecorder.setCamera(Camera). See android.media.MediaRecorder information about video recording.
When finished recording, call reconnect() to re-acquire and re-lock the camera.
If desired, restart preview and take more photos or videos.
Call stopPreview() and release() as described above.
This class is not thread-safe, and is meant for use from one event thread. Most long-running operations (preview, focus, photo capture, etc) happen asynchronously and invoke callbacks as necessary. Callbacks will be invoked on the event thread open(int) was called from. This class's methods must never be called from multiple threads at once.

Caution: Different Android-powered devices may have different hardware specifications, such as megapixel ratings and auto-focus capabilities. In order for your application to be compatible with more devices, you should not make assumptions about the device camera specifications.

另外补充一下,实现android的video也是使用的Camera API,用到相关的类为Camera,SurfaceView,MediaRecorder,Intent(MediaStore.ACTION_IMAGE_CAPTURE, MediaStore.ACTION_VEDIO_CAPTURE)

好,根据camera的说明,在开始编写程序之前需要确认manifest中添加关于使用摄像设备的适当的权限声明,如果使用camera API必须加上下段说明:

<uses-permission android:name="android.permission.CAMERA" />

当然,程序也需要声明使用camera的特性:

<uses-feature android:name="android.hardware.camera" />
我就不翻译了,应该不难懂
<uses-feature android:name="android.hardware.camera" />
The application uses the device's camera. If the device supports multiple cameras, the application uses the camera that facing away from the screen.

<uses-feature android:name="android.hardware.camera.autofocus" />
Subfeature. The application uses the device camera's autofocus capability.

<uses-feature android:name="android.hardware.camera.flash" />
Subfeature. The application uses the device camera's flash.

<uses-feature android:name="android.hardware.camera.front" />
Subfeature. The application uses a front-facing camera on the device.

<uses-feature android:name="android.hardware.camera.any" />
The application uses at least one camera facing in any direction, or an external camera device if one is connected. Use this in preference to android.hardware.camera if a back-facing camera is not required.

如果需要其他特性,在列表里选择性添加就好,比如一会儿我还需要自动对焦就要添加相关代码到manifest。添加特性代码就是为了防止你的程序被安装到没有摄像头或者不支持你要的功能的设备上去(prevent your application from being installed to devices that do not include a camera or do not support the camera features you specify. )

如果你的程序能通过适当的操作使用camera或一些特性,但并不特别需要它,可以增加required属性为false:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Ok,前面说的有点多,下面说下使用camera的流程:

  • 整体流程
  1. 检测camera的存在并访问camera
  2. 继承SurfaceView并添加SurfaceHolder接口以显示预览画面
  3. 为预览画面添加你需要的布局和控件
  4. 增加对拍照事件的监听
  5. 使用拍照功能并保存照片
  6. 最后要释放camera
  • 流程细节
  1. 通过open(int)方法获取camera的实例,int为camera的id
  2. 使用getParameters()获取相机当前的设置,包括预览尺寸,拍照尺寸等等参数
  3. 如果修改了相关设置,调用setParameters(Camera.Parameters)将更改的信息重新生效
  4. 有需要的话使用setDisplayOrientation(int)来改变预览画面的方向
  5. 使用setPreviewDisplay(SurfaceHolder)传递一个完整初始化的SurfaceHolder,没有surface,就没法启动预览画面
  6. 在拍照之前先调用startPreview()来更新预览画面
  7. 调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)进行拍照,在回调函数中获得照片对象并做处理
  8. 阅读更多内容

没有评论:

发表评论