如何在Ubuntu手机中使用前置照相机

我们可以在Ubuntu QML的API文档中看到Camera的用法,但是里面没有写到任何的前置Camera的调用方法。对于一些应用来说,前置Camera的使用是重要的。我们必须使用Qt C++代码来实现这个功能。在这篇文章中,我们来介绍如何使用Ubuntu手机中的前置照相机。

1)创建一个最基本的QML应用

   

   

这样我们就生成了一个含有plugin的项目。

2)在项目中加入CameraSelector来选择照相机

为了能够调用Camera的一些API,我们在plugin中加入如下的CameraSelector类:

#ifndef CAMERA_SELECTOR_H
#define CAMERA_SELECTOR_H

#include <QObject>
#include <QCamera>
#include <QVideoDeviceSelectorControl>

class CameraSelector : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QObject* cameraObject READ cameraObject WRITE setCameraObject)
    Q_PROPERTY(int selectedCameraDevice READ selectedCameraDevice WRITE setSelectedCameraDevice)

public:
    QObject* cameraObject() const;
    void setCameraObject(QObject *cam);

    int selectedCameraDevice() const;
    void setSelectedCameraDevice(const int cameraId);

private:
    QCamera *m_camera;
    QVideoDeviceSelectorControl *m_deviceSelector;
};

#endif // CAMERA_SELECTOR_H
#include "cameraselector.h"

#include <QMediaService>

void CameraSelector::setCameraObject(QObject *cam)
{
    // get the QCamera from the declarative camera's mediaObject property.
    m_camera = qvariant_cast<QCamera*>(cam->property("mediaObject"));

    // get the video device selector control
    QMediaService *service = m_camera->service();
    m_deviceSelector = qobject_cast<QVideoDeviceSelectorControl*>(service->requestControl(QVideoDeviceSelectorControl_iid));
}

QObject *CameraSelector::cameraObject() const
{
    return m_camera;
}

int CameraSelector::selectedCameraDevice() const
{
     return 0;
}

void CameraSelector::setSelectedCameraDevice(const int cameraId)
{
    // A camera might already be started, make sure it's unloaded
    m_camera->unload();

    m_deviceSelector->setSelectedDevice(cameraId);
}

我们在“backend”中的CMakeLists.txt中加入“MultiMedia"库以调用QCamera。

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
)

set(
    FrontCamerabackend_SRCS
    modules/FrontCamera/backend.cpp
    modules/FrontCamera/mytype.cpp
    modules/FrontCamera/cameraselector.cpp
)

add_library(FrontCamerabackend MODULE
    ${FrontCamerabackend_SRCS}
)

set_target_properties(FrontCamerabackend PROPERTIES
         LIBRARY_OUTPUT_DIRECTORY FrontCamera)

qt5_use_modules(FrontCamerabackend Gui Qml Quick Multimedia)

# Copy qmldir file to build dir for running in QtCreator
add_custom_target(FrontCamerabackend-qmldir ALL
    COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/modules/FrontCamera/qmldir ${CMAKE_CURRENT_BINARY_DIR}/FrontCamera
    DEPENDS ${QMLFILES}
)

# Install plugin file
install(TARGETS FrontCamerabackend DESTINATION ${QT_IMPORTS_DIR}/FrontCamera/)
install(FILES   modules/FrontCamera/qmldir DESTINATION ${QT_IMPORTS_DIR}/FrontCamera/)

同时在backend.cpp中加入如下的句子:

 qmlRegisterType<CameraSelector>(uri, 1, 0, "CameraSelector");

为了使用Camera,我们对我们的FrontCamera.qml做如下的修改:

import QtQuick 2.0
import Ubuntu.Components 1.1
import FrontCamera 1.0
import QtMultimedia 5.0

/*!
    \brief MainView with Tabs element.
           First Tab has a single Label and
           second Tab has a single ToolbarAction.
*/

MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "frontcamera.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(76)

    Page {
        title: i18n.tr("App with backend")

        Button {
            id: activateRearCamera
            text: "Rear Camera"

            onClicked: {
                selector. selectedCameraDevice = 0;
                camera.start();
            }
        }

        Button {
            id: activateFrontCamera
            text: "Front camera"
            anchors.left : activateRearCamera.right
            anchors.leftMargin: units.gu(2)
            onClicked: {
                selector. selectedCameraDevice = 1;
                camera.start();
            }
        }

        Camera {
            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
                }
            }
        }

        CameraSelector {
            id: selector
            cameraObject: camera
        }

        VideoOutput {
            source: camera
            anchors.fill: parent
            focus : visible // to receive focus and capture key events when visible
        }

        Image {
            id: photoPreview
        }
    }
}

运行我们的应用:

  

整个项目的源码在:git clone https://gitcafe.com/ubuntu/frontcamera.git

时间: 2024-10-01 19:39:00

如何在Ubuntu手机中使用前置照相机的相关文章

如何在Ubuntu手机中使得一个应用是全屏的应用

我们知道很多的开发者想把自己的应用设置为全屏的应用,这样可以使得应用能更多地占用屏幕的有效面积以使得自己的应用更好看.在默认的SDK的样板中,在应用的最上面,有一个"title"的地方占用很多的空间.对于一些应用来说,在主界面中,这个可能并不有用,但是对于使用PageStack的应用来说,这个区域显示一个向左的箭头以返回上一个页面的. 最近我也有这样的问题,我既想使用PageStack给予我的方便,又想拥有全屏的功能.在这篇文章中,我们来介绍如何做到全屏的应用.另外我们值得指出的是:我

如何在Ubuntu手机中监测网络的连接信息

我们知道对于很多的网路应用来说,网路的连接信息对于我们来说非常重要.我们有必要对网路的连接信息进行监测.一旦网路连接断开,我们需要提醒用户或做一些处理.在Ubuntu平台上,我们可以使用connectivity库来查看. 我们可以利用SDK的模版来创建一个最简单的QML应用.因为我们要使用connectivity,所以我们必须加入"connectivity"的security policy. 在我们的开发者网站上虽然也有NetworkStatus的介绍,但是可能并不是很全,我们可以使用

如何在Ubuntu手机上实现一个FileDialog

前一段时间,有个开发者问我能否在Ubuntu手机中使用QtQuick.Dialogs来实现FileDialog.目前在手机上没有Qt这个库的实现.最主要的原因是它不使用unit grid的方式来布局,所以在真的手机上显得非常小.那么我们怎么才能实现同样的功能呢? 我们首先来查看一下我们的Ubuntu Qt所提供的API Dialog.这里我们有提供一个Dialog的control.我们可以仿照上面的例程来写出我们所需要的例程.另外,我们也需要使用另外一个APIFolderListModel.通过

如何在Ubuntu手机click包中打入第三方应用库

由于Ubuntu手机平台安全的限制,在Ubuntu手机的应用中我们只能访问自己的空间.如果我们所需要访问的文件不存在于我们应用所在的空间,我们是没有办法访问到的.我们的应用只能访问系统提供的库.如果系统没有所需要的库的话,我们通过可以通过如下的方法实现: 在我的应用中把应用的所需要的第三方的源码放入到我的应用项目中,并形成plugin(通常是C++代码)从而被应用调用 在我们的应用中把第三方的库打包进我们的应用包中,并在我的plugin(通常是C++代码)中调用,进而被应用调用 我们可以选择Ub

怎么在Ubuntu手机中打开开发者模式

当我们刷最新的Ubuntu手机软件时,我们必须打开开发者模式.否则,当我们使用"adb"命令时,会出现如下的情况: 当手机和电脑连接后,不能查看到任何的device.当我们打开开发者模式后,我们可以看到如下的画面: 这里我们可以看到,我们通过"adb"命令可以看到连接到的device. 为了打开开发者模式,我们可以通过如下的步骤来操作: 1)打开"系统设置"应用 2) 选中"关于此手机" 3)点击"开发者模式&quo

手把手教你如何在Ubuntu系统中安装Pycharm

前几天带大家一起安装了Ubuntu14.04系统,没来得及上车的伙伴可以戳这篇文章:手把手教你在VMware虚拟机中安装Ubuntu14.04系统.今天小编带大家一起在Ubuntu14.04中安装Pycharm,具体的教程如下.1.首先在主目录下创建software文件夹,此时该文件夹为空文件夹.这个文件夹下用于放置安装软件,当然这个步骤不是必须的,只是小编习惯的做法. 2.去Pycharm官网上下载Pycharm的Linux安装包,建议下载专业版的,如下图所示. 3.下载到本地之后,将其用fi

如何在Ubuntu手机应用中得到所有的环境变量值

我们在先前的例程中已经通过一些方法得到我们应用的一些环境变量值.这些值有的非常有用,比如我们可以得到我们应用所只能访问的目录.在今天的例程中,我们来展示一种方法可以得到应用所有的环境变量.在我们的实际应用中,我们可以通过这些环境变量来做一些事情.另外,在这个例程中,我们也展示了如何在Qt C++的代码中构造我们的ListView中的model.我们在先前的例程"Ubuntu OS应用Runtime Enviroment"已经展示了和我们平台安全相关的一些环境变量. 首先,我们来展示我们

如何在Ubuntu Scope中利用Filter来更加精准地提高搜索的质量

在Ubuntu的Scope,目前正在研发一个新的Filter的功能.我们可以在我们的开发者网站找到有关filter的更多的信息.在那里你可以看到一些关于filter的介绍,但是真正地入手去利用它还是有一定的难度的.今天在我们的例程中,我们来具体展示如何利用filter实现更好的搜索.在实际的应用中,比如我们可以通过filter来实现如下的ctrip的Scope:     在上面的中间的图中,我们可以看到"重庆"被选中了,在第二个列中,我们可以使用我们的department来进行从一个城

如果在Ubuntu手机中判断键盘是否已经开启

在一些应用中我们需要判断键盘是否已经出现.如果出现的话,我们有时不希望有键盘.我们也可以通过软件的方法让键盘消失.在这篇文章中,我们来介绍如何来实现这个. import QtQuick 2.0 import Ubuntu.Components 1.1 /*! \brief MainView with a Label and Button elements. */ MainView { // objectName for functional testing purposes (autopilot