nativecamera-ins
提供设备摄像头的API
npm i --save nativescript-camera-ins

欢迎使用 NativeScript 框架的 nativecamera 插件

先决条件

使用摄像头插件

概述

几乎每个移动应用程序都需要捕获、保存和共享图片的功能。NativeScript 摄像头插件是为了完成这项工作的前两部分而设计的(拍照和可选地保存到设备存储)。

安装

导航到项目文件夹并运行 NativeScript-CLI 命令

tns plugin add nativescript-camera

插件可以作为标准 npm 依赖项添加

npm install nativescript-camera --save 

注意:使用 --save 标志将在 package.json 文件中将插件添加为依赖项

请求权限

较新的 Android 和 iOS 版本的 API 要求显式权限才能使应用程序能够访问摄像头并将照片保存到设备上。一旦用户授予了权限,就可以使用摄像头模块。

camera.requestPermissions();

注意:旧版本不会受到使用 requestPermissions 方法的影响。

使用摄像头模块拍照

使用摄像头模块相对简单。然而,有一些要点需要更多的解释。

为了使用摄像头模块,只需像示例 1 中那样导入它

示例 1:在应用程序中导入摄像头模块

var camera = require("nativescript-camera");
import * as camera from "nativescript-camera";

然后你就可以开始使用了

示例 2:如何拍照并接收图像资源

var imageModule = require("ui/image");
camera.takePicture()
.then(function (imageAsset) {
console.log("Result is an image asset instance");
var image = new imageModule.Image();
image.src = imageAsset;
}).catch(function (err) {
console.log("Error -> " + err.message);
});
import { Image } from "ui/image";
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);
});

示例 2 中的代码将启动原生平台摄像头应用程序。拍照并点击按钮 保存(Android)或 使用图像(iOS)后,promise 将解决 then 部分,并将图像资源设置为 ui/image 控件的 src

使用选项拍摄内存高效的图片

示例 2 展示了如何使用 NativeScript 摄像头模块拍照。然而,它拍摄了一个巨大的图像(即使是中端设备也有 500 万像素的摄像头,这导致图像为 2580x2048,在位图中大约为 15 MB)。在许多情况下,你不需要这样大的图片来显示 100x100 大小的图片,所以拍摄大图片只是浪费内存。camera.takePicture() 方法接受一个可选参数,这有助于解决这个问题。使用该可选参数,您可以设置一些属性,如

  • width:图片的期望宽度(以设备独立像素为单位)。
  • height:图片的期望高度(以设备独立像素为单位)。
  • keepAspectRatio:一个布尔参数,表示是否应该保持宽高比。
  • saveToGallery:一个布尔参数,表示拍照的图片是否将被保存在 Android 的“照片”和 iOS 的“相机胶卷”中。
  • cameraFacing:从设备的“前”或“后”(默认)摄像头开始。当前实现不适用于所有 Android 设备,在这种情况下将回退到默认行为。

什么是“设备无关像素”?NativeScript布局机制在测量UI控件时使用设备无关像素。这允许您声明一个布局,这个布局在所有设备上看起来都相似(无论设备的显示分辨率)。为了在高清设备(如iPhone视网膜和Android全高清)上获得合适的图像质量,相机将返回更大尺寸的图像。例如,如果我们请求一个100x100的图像,在iPhone 6上实际的图像将是200x200(因为它的显示密度因子是2 -> 1002x1002)。设置keepAspectRatio属性可能会导致请求的宽度或高度与实际不同。相机将返回具有正确宽高比的图像,但通常只有一个(宽度和高度中的一个)与请求的值相同;另一个值将被计算以保留原始图像的宽高比。

示例3展示了如何使用选项参数

示例3:如何设置相机模块的widthheightkeepAspectRatiosaveToGallery属性

var imageModule = require("ui/image");

var options = { width: 300, height: 300, keepAspectRatio: false, saveToGallery: true };
camera.takePicture(options)
.then(function (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(function (err) {
console.log("Error -> " + err.message);
});
import { Image } from "ui/image";

var 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);
});

检查设备是否有可用相机

开发者首先应该检查设备是否有可用相机。如果相机硬件准备好使用,则方法isAvaiable将返回true,否则返回false。

var isAvailable = camera.isAvailable(); 

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