如何查询备案接入商用ubuntu接入一个相机

Android--使用Camera拍照 - 承香墨影 - 博客园
  在开发Android应用的时候,如果需要调用摄像头获取拍摄的照片,除了通过Intent调用系统现有相机应用拍摄照片之外,还可以通过直接调用Camera硬件去去获取摄像头拍摄的照片。本篇博客将讲解如何在Android应用中通过Camera拍摄照片,这个对开发相机类应用尤为重要,同样最后也将以一个简单的Demo演示。
  本篇博客的主要内容:
  Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下。它主要用于摄像头捕获图片、启动/停止预览图片、拍照、获取视频帧等,它是设备本地的服务,负责管理设备上的摄像头硬件。
  Camera既然用于管理设备上的摄像头硬件,那么它也为开发人员提供了相应的方法,并且这些方法大部分都是native的,用C++在底层实现,下面简单介绍一下Camera的一些方法:
static Camera open():打开Camera,返回一个Camera实例。
static Camera open(int cameraId):根据cameraId打开一个Camera,返回一个Camera实例。
final void release():释放掉Camera的资源。
static int getNumberOfCameras():获取当前设备支持的Camera硬件个数。
Camera.Parameters getParameters():获取Camera的各项参数设置类。
void setParameters(Camera.Parameters params):通过params把Camera的各项参数写入到Camera中。
final void setDisplayOrientation(int degrees):摄像预览的旋转度。
final void setPreviewDisplay(SurfaceHolder holder):设置Camera预览的SurfaceHolder。
final void starPreview():开始Camera的预览。
final void stopPreview():停止Camera的预览
final void autoFocus(Camera.AutoFocusCallback cb):自动对焦。
final takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,Camera.PictureCallback jpeg):拍照。
final void lock():锁定Camera硬件,使其他应用无法访问。
final void unlock():解锁Camera硬件,使其他应用可以访问。
  上面已经介绍了Camera的常用方法,下面根据这些方法详细讲解Android下使用Camera开发拍照应用最基本的过程:
使用open()方法获取一个Camera对象,鉴于Android设备可能配置了多个摄像头,open()方法可以通过摄像头Id开启指定的摄像头。
为Camera对象设置预览类,它是一个SurfaceHolder对象,通过setPreviewDisplay(SurfaceHolder)方法设置。
调用startPreview()方法开始Camera对象的预览。
调用takePicture()方法进行拍照,其中可以通过Camera.PictureCallback()回调获得拍摄的Image数据。
当拍摄完成后,需要调用stopPreview()方法停止预览,并使用release()释放Camera占用的资源。
  以上介绍的步骤都是最基本的过程,是必不可少的。Camera没有提供公开的构造函数,只能通过open()方法获取,并且必须设置一个预览类SurfaceHolder,如果不设置的话,将无法使用Camera。在使用完成Camera之后,必须使用release()释放Camera资源。
验证设备是否配备摄像头硬件
  因为Android的开源,所以其支持的设备多而杂,在使用Camera的时候,最好验证一下当前运行的设备上是否配备了摄像头硬件。这里需要用到一个PackageManager,它用于检测应用安装设备的各种信息,可以通过Context.getPackageManager()方法获取。可以通过PackageManager.hasSystemFeature(String name)方法检测设备是否支持摄像头操作,它传递的是一个String类型的参数,被PackageManager定义为了常量,返回一个Boolean数据,验证是否检测通过,对于Camera而言,可以检测如下信息:
FEATURE_CAMERA:设备是否有摄像头。
FEATURE_CAMERA_ANY:设备至少有一个摄像头。
FEATURE_CAMERA_AUTOFOCUS:设备支持的摄像头是否支持自动对焦
FEATURE_CAMERA_FLASH:设备是否配备闪光灯。
FEATURE_CAMERA_FRONT:设备是否有一个前置摄像头。
  一般而言,检测FEATURE_CAMERA即可:
/** 检测设备是否存在Camera硬件 */
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
return true;
return false;
Camera捕获画面的预览
  Camera的预览,需要放到一个SurfaceView中,出于安全的考虑,在设计Android的时候就规定,如果需要调用Camera,必须为其制定显示在屏幕上的SurfaceView预览,否则将无法使用Camera。关于SurfaceView和SurfaceHolder的内容,在之前的博客中已经详细讲解,这里不再赘述,不清楚的朋友可以看看之前的博客:。
  下面我们直接使用一个类去继承SurfaceView当做Camera的预览类:
1 package cn.bgxt.
3 import java.io.IOE
4 import android.content.C
5 import android.hardware.C
6 import android.util.L
7 import android.view.SurfaceH
8 import android.view.SurfaceV
* 定义一个预览类
13 public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "main";
private SurfaceHolder mH
private Camera mC
public CameraPreview(Context context, Camera camera) {
super(context);
// 通过SurfaceView获得SurfaceHolder
mHolder = getHolder();
// 为SurfaceHolder指定回调
mHolder.addCallback(this);
// 设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到界面 在Android3.0之后弃用
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
public void surfaceCreated(SurfaceHolder holder) {
// 当Surface被创建之后,开始Camera的预览
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "预览失败");
public void surfaceDestroyed(SurfaceHolder holder) {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Surface发生改变的时候将被调用,第一次显示到界面的时候也会被调用
if (mHolder.getSurface() == null){
// 如果Surface为空,不继续操作
// 停止Camera的预览
mCamera.stopPreview();
} catch (Exception e){
Log.d(TAG, "当Surface改变后,停止预览出错");
// 在预览前可以指定Camera的各项参数
// 重新开始预览
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d(TAG, "预览Camera出错");
使用Camera拍照
  当指定了Camera的预览类,并开始预览之后,就可以通过takePicture()方法进行拍照了,下面是它的完整签名:
&    public final void taskPicture(Camera.ShuffterCallback shutter,Camera.PictureCallback raw,Camera.PictureCallback postview,Camera.PictureCallback jpeg)
  它将以异步的方式从Camera中获取图像,具有多个回调类作为参数,并且都可以为null,下面分别介绍这些参数的意义:
shutter:在按下快门的时候回调,这里可以播放一段声音。
raw:从Camera获取到未经处理的图像。
postview:从Camera获取一个快速预览的图片,不是所有设备都支持。
jpeg:从Camera获取到一个经过压缩的jpeg图片。
&  虽然raw、postview、jpeg都是Camera.PictureCallback回调,但是一般我们只需要获取jpeg,其他传null即可,Camera.PictureCallback里需要实现一个方法onPictureTaken(byte[] data,Camera camera),data及为图像数据。值得注意的是,一般taskPicture()方法拍照完成之后,SurfaceView都会停留在拍照的瞬间,需要重新调用startPreview()才会继续预览。
  如果直接使用taskPicture()进行拍照的话,Camera是不会进行自动对焦的,这里需要使用Camera.autoFocus()方法进行对焦,它传递一个Camera.AutoFocusCallback参数,用于自动对焦完成后回调,一般会在它对焦完成在进行taskPicture()拍照。
使用Camera拍照的Demo
  &上面已经介绍了使用Camera的基本步骤以及涉及的内容,这里通过一个简单的Demo演示一下,使用上面附上代码的预览类进行Camera预览。代码中注释比较完整,这里不再赘述。
  布局代码:activity_main.xml
1 &?xml version="1.0" encoding="utf-8"?&
2 &LinearLayout xmlns:android="/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
&FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:id="@+id/button_capture"
android:text="拍照"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
21 &/LinearLayout&
  实现代码:MainActivity.java
1 package cn.bgxt.
3 import java.io.F
4 import java.io.FileOutputS
6 import android.os.B
7 import android.util.L
8 import android.view.V
9 import android.widget.B
10 import android.widget.FrameL
11 import android.app.A
12 import android.content.C
13 import android.content.pm.PackageM
14 import android.hardware.C
15 import android.hardware.Camera.AutoFocusC
16 import android.hardware.Camera.PictureC
18 public class MainActivity extends Activity {
protected static final String TAG = "main";
private Camera mC
private CameraPreview mP
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCamera = getCameraInstance();
// 创建预览类,并与Camera关联,最后添加到界面布局中
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
Button captureButton = (Button) findViewById(R.id.button_capture);
captureButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 在捕获图片前进行自动对焦
mCamera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
// 从Camera捕获图片
mCamera.takePicture(null, null, mPicture);
/** 检测设备是否存在Camera硬件 */
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
return true;
return false;
/** 打开一个Camera */
public static Camera getCameraInstance() {
Camera c = null;
c = Camera.open();
} catch (Exception e) {
Log.d(TAG, "打开Camera失败失败");
private PictureCallback mPicture = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
// 获取Jpeg图片,并保存在sd卡上
File pictureFile = new File("/sdcard/" + System.currentTimeMillis()
+ ".jpg");
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (Exception e) {
Log.d(TAG, "保存图片失败");
protected void onDestroy() {
// 回收Camera资源
if(mCamera!=null){
mCamera.stopPreview();
mCamera.release();
mCamera=null;
super.onDestroy();
  效果展示:
Camera的回调监听
  上面介绍Camera拍照的时候介绍了两个回调,Camera还提供了一些其他的回调的事件监听方法,这里简单介绍几个常用的:
final void setErrorCallback(Camera.ErrorCallback cb):Camera发送错误的时候回调,可以在其中进行错误的后续处理。
final void setPreviedCallback(Camera.PreviewCallback cb):Camera预览界面发生变化的时候回调,可以在其中获取到Camera捕获到的帧图像。
Camera的参数设置
  Camera作为一个摄像头硬件的调用类,还为我们提供了详细的设置摄像头各项参数的方法,比如闪光灯的模式、自动对焦的模式等。步骤是使用Camera.getParameters()方法获取到Camera.Parameters对象,在其中设置好摄像头的各项参数后,再通过Camera.setParameters()方法写入到Camera对象中即可。这个设置必须在使用startPreview()之前完成。关于Camera参数的设置,比较细致,不在本篇博客的内容之中,以后有机会再详细介绍。
评论 - 296ubuntu Linux 7.04现在已经可以挂载数码相机了
->行高大小:
上个周末去苏州见了我最好的朋友,并且在苏州游玩了虎丘、定园,周日还去了昆山的周庄,玩得非常开心啊,呵呵。把我整整1G的卡都给弄光了。等把照片整理好了要弄些漂亮的出来,这里就不多说。回来之后就开始导入照片,开始还是用的老方法,但是总想着那个文件日期的问题就憋屈。突然间,我想到了数码相机连接电脑的模式一共有3种。当时我写上面那两篇日志的时候还是用的Ubuntu6.06。那时候,ubuntu下我的SONY T10只能用PTP模式还和系统连接,用其他两种模式“海量存储器”、“PictBridge”都不能和系统相连,但是我现在已经是ubuntu7.04了,说不定硬件识别能力更好了,能使用这两种连接方式了。然后就开始切换连接方式来测试,结果是令人兴奋的。现在ubuntu7.04下SONY T10用“海量存储器”这个模式能够和系统连接。ubuntu能自动把数码相机识别为块设备,如/dev/sdb1,并且能够象U盘、移动硬盘一样自动挂载,当然了,现在已经可以把数码相机作为移动存储了。所有的问题都迎刃而解,对于ubuntu硬件识别的能力信心越来越强了,哈哈。期待7.10,当然是期待本本上内置读卡器的驱动。
收集整理 ,地址为:
大屏阅读,大屏评论.一款Ubuntu系统的智能工业相机的介绍_模式识别吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,391贴子:
一款Ubuntu系统的智能工业相机的介绍收藏
如果感兴趣的话可以随和是联系我!我的QQ是
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或1051人阅读
移动开发(263)
QML(182)
Ubuntu OS(147)
手机开发(124)
在前面的一篇文章中“”,我们可以使用相应的C++代码来控制前后位置的照相机来拍照,但是我们又如何能够把所拍到的照片存储到相应的文件中呢?我们可以使用Qt 5.4版本中的Item所提供的一个新的功能“”。这样我们可以很方便地把我们得到的照片存到我们相应的目录中。
在Ubuntu手机平台中,由于安全的原因,我们的应用只可以访问自己所在的可以访问的目录。在这个例程中,我们使用了一些环境的变量来得到我们所需要的存储的目录的位置:
我们整个的代码如下:
import QtQuick 2.0
ponents 1.1
import QtMultimedia 5.0
import readenv 1.0
\brief MainView with a Label and Button elements.
MainView {
// objectName for functional testing purposes (autopilot-qt5)
objectName: &mainView&
// Note! applicationName needs to match the &name& field of the click manifest
applicationName: &camerashot.liu-xiao-guo&
This property enables the application to change orientation
when the device is rotated. The default is false.
//automaticOrientation: true
// Removes the old toolbar and enables new features of the new header.
useDeprecatedToolbar: false
width: units.gu(100)
height: units.gu(75)
id: mainPage
title: i18n.tr(&camerashot&)
property string path: &&
anchors.fill: parent
id: camera
imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash
exposure {
exposureCompensation: -1.0
exposureMode: Camera.ExposurePortrait
flash.mode: Camera.FlashRedEyeReduction
imageCapture {
onImageCaptured: {
photoPreview.source = preview
// Show the preview in an Image
VideoOutput {
source: camera
anchors.fill: parent
focus : visible // to receive focus and capture key events when visible
orientation: -90
MouseArea {
anchors.fill: parent
onClicked: {
var APP_ID = env.getenv(&APP_ID&);
var app_pkgname = APP_ID.split('_')[0]
mainPage.path = env.getenv(&XDG_DATA_HOME&) +
&/& + app_pkgname + &/pic.png&;
console.log(&share path: & + mainPage.path);
var a = video.grabToImage(function(result) {
result.saveToFile(mainPage.path);
}, Qt.size(photoPreview.width, photoPreview.height) );
console.log(&return result: & + a);
id: photoPreview
id: button
anchors.bottom: parent.bottom
anchors.right: parent.right
text: &Show the taken picture&
onClicked: {
pic.visible =
page1.visible =
console.log(&image path: & + mainPage.path);
image.source = &&;
image.source = &file:///& + mainPage.
anchors.fill: parent
visible: false
cache: false
anchors.fill: parent
text: mainPage.path
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.leftMargin: units.gu(1)
anchors.bottomMargin: units.gu(1)
width: units.gu(3)
height: units.gu(3)
source: &images/icon-left-arrow.png&
MouseArea {
anchors.fill: parent
onClicked: {
pic.visible = false
page1.visible =
整个的设计非常简单。在主界面中我们可以在相机的影像的任何地方进行触屏来拍下我们的照片。我们可以使用“Show the taken picture”按钮来进入下一个页面来显示存储的图片。为了方便设计,我们选择了一个固定的文件名。当然,开发者们可以自己来选择自己的所需要的文件名。
整个项目的源码在:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:274681次
积分:5749
积分:5749
排名:第3398名
原创:300篇
评论:226条
(2)(11)(4)(4)(3)(9)(6)(15)(8)(26)(4)(8)(1)(13)(6)(17)(18)(16)(23)(30)(16)(7)(2)(4)(8)(8)(11)(12)(18)移动开发(263)
QML(182)
在我们先前的文章""对如何使用前置照相机给出了一个解决方案.事实上,在我们最新的中 (QtMultiMedia 5.6),已经有新的API来完成这个功能了.我们不再需要额外的C++代码来完成这个功能.
在新的中,我们可以指定:
deviceId : string来使得我们的Camera来选择我们需要的前后相机.那么我们如何得到这个deviceId呢?在新的QtMultiMedia的接口中,我们可以通过如下的来得到所有的Camera的描述信息:
QtMultimedia.availableCameras
通过这个API,我们可以得到一个Camera的如下信息:
基于上面的信息,我们做了如下的一个简单的照相机应用:
import QtQuick 2.4
ponents 1.3
import QtMultimedia 5.6
MainView {
// objectName for functional testing purposes (autopilot-qt5)
objectName: &mainView&
// Note! applicationName needs to match the &name& field of the click manifest
applicationName: &cameralist.liu-xiao-guo&
width: units.gu(60)
height: units.gu(85)
id: camera
imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash
exposure {
exposureCompensation: -1.0
exposureMode: Camera.ExposurePortrait
flash.mode: Camera.FlashRedEyeReduction
imageCapture {
id: capture
onImageCaptured: {
console.log(&onImageCaptured!&)
// Show the preview in an Image
photoPreview.source = preview
onImageSaved: {
console.log(&image has been saved: & + requestId);
console.log(&saved path: & + path);
Component {
id: highlight
Rectangle {
width: parent.width
height: listview.delegate.height
color: &lightsteelblue&; radius: 5
Behavior on y {
SpringAnimation {
damping: 0.2
header: PageHeader {
id: pageHeader
title: i18n.tr(&cameralist&)
left: parent.left
right: parent.right
bottom: parent.bottom
top: pageHeader.bottom
anchors.fill: parent
ListView {
id: listview
width: page.width
height: units.gu(20)
model: QtMultimedia.availableCameras
highlight:highlight
delegate: Item {
id: delegate
width: listview.width
height: layout.childrenRect.height + units.gu(0.5)
id: layout
width: parent.width
text: &deviceId: & + modelData.deviceId
text: &displayName: & + modelData.displayName
switch(modelData.position) {
case Camera.UnspecifiedPosition:
return &position: UnspecifiedPosition&
case Camera.BackFace:
return &position: BackFace&;
case Camera.FrontFace:
return &position: FrontFace&
return &Unknown&
Rectangle {
width: parent.width
height: units.gu(0.1)
color: &green&
MouseArea {
anchors.fill: parent
onClicked: {
camera.deviceId = modelData.deviceId
listview.currentIndex = index
VideoOutput {
id: output
source: camera
width: parent.width
height: parent.height - listview.height
focus : visible
MouseArea {
anchors.fill: parent
onClicked: {
console.log(&going to capture to: & + path)
capture.captureToLocation(path);
output.visible = false
photoPreview.visible = true
id: photoPreview
width: parent.width
height: parent.height - listview.height
fillMode: Image.PreserveAspectFit
MouseArea {
anchors.fill: parent
onClicked: {
photoPreview.visible = false
output.visible = true
Component.onCompleted: {
visible = false
由于我们希望存储当前相机的所照的照片,我们必须得到能够存储照片的位置信息.我们在我们的Main.cpp中使用了如下的方法:
QString getPrivatePath()
QString writablePath = QStandardPaths::
writableLocation(QStandardPaths::DataLocation);
qDebug() && &writablePath: & && writableP
QString absolutePath = QDir(writablePath).absolutePath();
qDebug() && &absoluePath: & && absoluteP
absolutePath += &.liu-xiao-guo/photos&;
// We need to make sure we have the path for storage
QDir dir(absolutePath);
if ( dir.mkpath(absolutePath) ) {
qDebug() && &Successfully created the path!&;
qDebug() && &Fails to create the path!&;
qDebug() && &private path: & && absoluteP
return absoluteP
QString path = getPrivatePath();
qDebug() && &final path: & &&
context-&setContextProperty(&path&, QVariant::fromValue(path));
通过这样的方法,我们可以在我们的QML的代码中直接引用path来存储我们的照片.
运行我们的应用:
从上面的图中,我们可以看到所有相机的列表信息.我们可以随意选择我们所需要的相机,并进行拍摄.当然我们也可以进行录像的动作.具体的实现,可以参阅文章"".
整个项目的源码在:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:274683次
积分:5749
积分:5749
排名:第3398名
原创:300篇
评论:226条
(2)(11)(4)(4)(3)(9)(6)(15)(8)(26)(4)(8)(1)(13)(6)(17)(18)(16)(23)(30)(16)(7)(2)(4)(8)(8)(11)(12)(18)

我要回帖

更多关于 网站如何接入微信支付 的文章

 

随机推荐