8.7 版本发布—WinterCG 兼容性第一部分
了解更多

在 GitHub 上查看

@nativescript/camera

内容

简介

一个允许您拍照并选择性地将其保存到设备存储的插件。

安装

要安装该插件,请在项目根目录中运行以下命令

cli
npm install @nativescript/camera --save

使用 @nativescript/camera

请求用户权限

Android 和 iOS 都需要应用程序明确的权限才能访问相机并在设备上保存照片。

要向用户请求访问其相机和照片库的权限,请按照以下步骤操作

  1. 向系统指定您的应用所需的权限。

在 Android 上,您在 App_Resources/Android/src/main/AndroidManifest.xml 中指定权限。但是,此插件会为您指定所需的权限。

在 iOS 上,App Store 指南 5.1.1 要求应用阐明相机和照片库的使用情况。要添加说明,请修改 app/App_Resources/iOS/Info.plist 并将其分别作为 NSCameraUsageDescriptionNSPhotoLibraryUsageDescription 键的值添加。

xml
<key>NSCameraUsageDescription</key>
<string>enter your camera permission request text here</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>enter your photo library permission request text here</string>
  1. 提示用户授予权限

要提示用户授予或拒绝您的应用访问其相机和照片库的权限,请调用 requestPermissions() 方法。

TypeScript
import { requestPermissions } from '@nativescript/camera';

requestPermissions().then(
    function success() {
        // permission request accepted or already granted
        // ... call camera.takePicture here ...
    },
    function failure() {
        // permission request rejected
        // ... tell the user ...
    }
);

注意

(**适用于 Android**) 不使用请求权限弹出窗口的旧版 Android 不会受到 requestPermissions() 方法使用情况的影响。

注意

(**适用于 iOS**) 如果用户拒绝了 iOS 弹出窗口中的权限,则应用将不再允许再次请求。您可以指示用户转到应用设置并从那里手动启用相机权限。

检查设备相机是否可用

在调用 takePicture 方法拍照之前,请调用 isAvailable() 方法以检查设备是否有可用的相机。

ts
const isAvailable = camera.isAvailable()

注意

对于 Android,插件会为您请求权限。

检查设备是否具有相机

在拍照之前,您应该检查设备是否有可用的相机。为此,请调用 isAvailable() 方法。如果相机硬件已准备好使用,则此方法将返回 true,否则返回 false

如果相机硬件已准备好使用,则此方法返回 true,否则返回 false

注意

在 iOS 模拟器中使用此方法时将返回 false(因为模拟器没有相机硬件)。

拍照

要拍照,请调用模块的 takePicture() 方法。

JavaScript
// JavaScript
const camera = require("@nativescript/camera");
const { Image } = require("@nativescript/core");

camera.takePicture()
    .then(function (imageAsset) {
        console.log("Result is an image asset instance");
        var image = new Image();
        image.src = imageAsset;
    }).catch(function (err) {

        console.log("Error -> " + err.message);
    });
TypeScript
// TypeScript
import * as camera from "@nativescript/camera";
import { Image } from "@nativescript/core";

camera.takePicture()
    .then((imageAsset) => {
        console.log("Result is an image asset instance");
        var image = new Image();
        image.src = imageAsset;
    }).catch((err) => {
        console.log("Error -> " + err.message);
    });

拍摄内存高效的照片

默认情况下,camera.takePicture() 方法会拍摄一张很大的图像(即使是配备 5MP 相机的中端设备也会生成 2580x2048 的图像,在位图中大约意味着 15MB)。因此,有时拍摄如此大的图片只是浪费内存。camera.takePicture() 方法接受一个可选的 CameraOptions 参数,允许您调整图片的大小和其他方面。

TypeScript
// TypeScript
import { Image } from "@nativescript/core";

const options = {
    width: 300,
    height: 300,
    keepAspectRatio: false,
    saveToGallery: true
};

camera.takePicture(options)
    .then((imageAsset) => {
        console.log("Size: " + imageAsset.options.width + "x" + imageAsset.options.height);
        console.log("keepAspectRatio: " + imageAsset.options.keepAspectRatio);
        console.log("Photo saved in Photos/Gallery for Android or in Camera Roll for iOS");
    }).catch((err) => {
        console.log("Error -> " + err.message);
    });

将图片保存到文件系统

要保存具有您定义的宽度和高度的图片,请使用 imageAsset 并将其保存到文件系统,如下所示

TypeScript
import { ImageSource, knownFolders, path } from '@nativescript/core';

ImageSource.fromAsset(imageAsset)
        .then((imageSource: ImageSource) => {
        const folderPath: string = knownFolders.documents().path;
        const fileName: string = "test.jpg";
        const filePath: string = path.join(folderPath, fileName);
        const saved: boolean = imageSource.saveToFile(filePath, "jpg");

        if (saved) {
            console.log("Gallery: " + this._dataItem.picture_url);
            console.log("Saved: " + filePath);
            console.log("Image saved successfully!");
        }
    });

这可用于为在应用程序中快速显示创建缩略图。

API

函数

函数返回值描述
takePicture(options?: CameraOptions)Promise<ImageAsset>使用相机拍摄照片,并提供一个可选参数来设置不同的相机选项。
requestPermissions()Promise<any>请求用户允许访问其保存的照片以及访问其相机。
requestCameraPermissions()Promise<any>请求用户允许访问其相机。
requestPhotosPermissions()Promise<any>请求用户允许访问其保存的照片。返回一个 Promise。
isAvailable()boolean检查设备相机是否可用。

CameraOptions 接口

属性默认值描述
width0可选:所需的图片宽度(以设备独立像素为单位)。如果设备的显示密度较高(大于 1)(全高清+分辨率),则实际图像宽度将大于请求的宽度。
height0可选:所需的图片高度(以设备独立像素为单位)。如果设备的显示密度较高(大于 1)(全高清+分辨率),则实际图像高度将大于请求的高度。
keepAspectRatiotrue可选:定义在调整图片大小时是否应保持相机图片的纵横比。相机将返回具有正确纵横比的图像,但通常只有其中一个(宽度或高度)与请求的相同;另一个值将被计算以保持原始图像的纵横比。
saveToGallerytrue可选:一个布尔值参数,指示原始拍摄的照片是否将保存在 Android 的“照片”中和 iOS 的“相机胶卷”中。
allowsEditingfalse可选: (仅限 iOS) 定义是否显示相机“重新拍摄”或“使用照片”屏幕。该屏幕强制用户将相机图片裁剪为正方形,并可以选择让他们放大。
cameraFacing'rear'可选:初始相机方向。对于自拍,请使用 'front'
modalPresentationStyle0可选: (仅限 iOS) 设置自定义 UIModalPresentationStyle(默认为 UIModalPresentationStyle.FullScreen)。

注意

saveToGallery 选项在 Android 上可能会有意外的行为!某些厂商的相机应用(例如 LG)会将所有捕获的图像保存到图库中,而不管 saveToGallery 的值是什么。相机插件无法控制此行为,如果您需要从照片库中排除捕获的图像,则需要获取本地存储读/写权限并编写自定义代码来查找图库位置并从那里删除新图像。

上一页
亮度
下一页
联系人