@nativescript/camera
提供设备相机的 API
npm i --save @nativescript/camera

@nativescript/camera

内容

简介

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

安装

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

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 键的值添加。

<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() 方法。

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() 方法以检查设备是否有可用的相机。

const isAvailable = camera.isAvailable();

注意: 对于 Android,该插件为您请求权限。

检查设备是否有相机

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

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

注意: 当在 iOS 模拟器中使用时,此方法返回 false(因为模拟器没有相机硬件)

拍照

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

// 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
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
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 并按照以下方式将其保存到文件系统

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() 布尔值 检查设备相机是否可用。

CameraOptions 接口

属性 默认值 描述
width 0 可选:图片期望的宽度(以设备独立像素为单位)。如果设备的显示密度高于1(例如,全高清+分辨率),实际图像宽度将大于请求的宽度。
height 0 可选:图片期望的高度(以设备独立像素为单位)。如果设备的显示密度高于1(例如,全高清+分辨率),实际图像高度将大于请求的高度。
keepAspectRatio true 可选:定义在调整图片大小时是否应保持相机图片的宽高比。相机将返回具有正确宽高比的图像,但通常只有一个(宽度或高度)将与请求相同;另一个值将根据保留原始图像的宽高比来计算。
saveToGallery true 可选:一个布尔参数,指示原始拍照照片是否将保存到Android的照片或iOS的相机胶卷中。
allowsEditing false 可选:(iOS-only) 定义相机“重拍”或“使用照片”。屏幕强制用户裁剪相机图片成方形,并可选择放大。
cameraFacing 'rear' 可选:初始相机朝向。使用'front'进行自拍。
modalPresentationStyle 0 可选:(iOS-only) 设置自定义UIModalPresentationStyle(默认为UIModalPresentationStyle.FullScreen)。

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