diff --git a/camera/Readme.md b/camera/Readme.md index 7ec0ba343..ff5926bd5 100644 --- a/camera/Readme.md +++ b/camera/Readme.md @@ -2,7 +2,7 @@ ``` var camera = require("camera"); -camera.takePicture({"cameraPosition": camera.CameraPosition.BACK, "flashMode": camera.FlashMode.ON}).then(function (image) { +camera.takePicture({"width": 300, "height": 300, "keepAspectRatio": true, "saveToGallery": true}).then(function (image) { console.log('pic taken - width: ' + image.width + ", height: " + image.height); }).fail(function (error) { console.log('pic canceled'); diff --git a/camera/camera-common.ts b/camera/camera-common.ts index 383bc18d7..08addc5fb 100644 --- a/camera/camera-common.ts +++ b/camera/camera-common.ts @@ -1,8 +1,8 @@ export function getAspectSafeDimensions(sourceWidth, sourceHeight, reqWidth, reqHeight) { - var widthCoef = sourceWidth / reqWidth; - var heightCoef = sourceHeight / reqHeight; + let widthCoef = sourceWidth / reqWidth; + let heightCoef = sourceHeight / reqHeight; - var aspectCoef = widthCoef > heightCoef ? widthCoef : heightCoef; + let aspectCoef = widthCoef > heightCoef ? widthCoef : heightCoef; return { width: Math.floor(sourceWidth / aspectCoef), diff --git a/camera/camera.android.ts b/camera/camera.android.ts index 3731cd0da..979c12453 100644 --- a/camera/camera.android.ts +++ b/camera/camera.android.ts @@ -9,89 +9,93 @@ var REQUEST_IMAGE_CAPTURE = 3453; export var takePicture = function (options?): Promise { return new Promise((resolve, reject) => { try { - var types: typeof typesModule = require("utils/types"); - var utils: typeof utilsModule = require("utils/utils"); + let types: typeof typesModule = require("utils/types"); + let utils: typeof utilsModule = require("utils/utils"); + + let saveToGallery; + let reqWidth; + let reqHeight; + let shouldKeepAspectRatio; - var density = utils.layout.getDisplayDensity(); + let density = utils.layout.getDisplayDensity(); if (options) { - var saveToGallery = options.saveToGallery ? true : false; - var reqWidth = options.width ? options.width * density : 0; - var reqHeight = options.height ? options.height * density : reqWidth; - var shouldKeepAspectRatio = types.isNullOrUndefined(options.keepAspectRatio) ? true : options.keepAspectRatio; + saveToGallery = options.saveToGallery ? true : false; + reqWidth = options.width ? options.width * density : 0; + reqHeight = options.height ? options.height * density : reqWidth; + shouldKeepAspectRatio = types.isNullOrUndefined(options.keepAspectRatio) ? true : options.keepAspectRatio; } - var takePictureIntent = new android.content.Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); - var dateStamp = createDateTimeStamp(); + let takePictureIntent = new android.content.Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + let dateStamp = createDateTimeStamp(); + + let picturePath: string; + let nativeFile; + let tempPictureUri; if (saveToGallery) { - var picturePath = android.os.Environment.getExternalStoragePublicDirectory( + picturePath = android.os.Environment.getExternalStoragePublicDirectory( android.os.Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/" + "cameraPicture_" + dateStamp + ".jpg"; - var nativeFile = new java.io.File(picturePath); - var tempPictureUri = android.net.Uri.fromFile(nativeFile); + nativeFile = new java.io.File(picturePath); + tempPictureUri = android.net.Uri.fromFile(nativeFile); takePictureIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, tempPictureUri); } else { - var picturePath = utils.ad.getApplicationContext().getExternalFilesDir(null).getAbsolutePath() + "/" + "cameraPicture_" + dateStamp + ".jpg"; - var nativeFile = new java.io.File(picturePath); - var tempPictureUri = android.net.Uri.fromFile(nativeFile); + picturePath = utils.ad.getApplicationContext().getExternalFilesDir(null).getAbsolutePath() + "/" + "cameraPicture_" + dateStamp + ".jpg"; + nativeFile = new java.io.File(picturePath); + tempPictureUri = android.net.Uri.fromFile(nativeFile); takePictureIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, tempPictureUri); } if (takePictureIntent.resolveActivity(utils.ad.getApplicationContext().getPackageManager()) != null) { - var appModule: typeof applicationModule = require("application"); + let appModule: typeof applicationModule = require("application"); - var previousResult = appModule.android.onActivityResult; + let previousResult = appModule.android.onActivityResult; appModule.android.onActivityResult = (requestCode: number, resultCode: number, data: android.content.Intent) => { appModule.android.onActivityResult = previousResult; if (requestCode === REQUEST_IMAGE_CAPTURE && resultCode === android.app.Activity.RESULT_OK) { - var imageSource: typeof imageSourceModule = require("image-source"); - if (saveToGallery) { - resolve({image:imageSource.fromFile(picturePath) ,path:picturePath}); - } else { - var options = new android.graphics.BitmapFactory.Options(); - options.inJustDecodeBounds = true; - android.graphics.BitmapFactory.decodeFile(picturePath, options); + let imageSource: typeof imageSourceModule = require("image-source"); + let options = new android.graphics.BitmapFactory.Options(); + options.inJustDecodeBounds = true; + android.graphics.BitmapFactory.decodeFile(picturePath, options); - var sampleSize = calculateInSampleSize(options.outWidth, options.outHeight, reqWidth, reqHeight); + let sampleSize = calculateInSampleSize(options.outWidth, options.outHeight, reqWidth, reqHeight); - var finalBitmapOptions = new android.graphics.BitmapFactory.Options(); - finalBitmapOptions.inSampleSize = sampleSize; - var bitmap = android.graphics.BitmapFactory.decodeFile(picturePath, finalBitmapOptions); - var scaledSizeImage = null; - if (reqHeight > 0 && reqWidth > 0) { - if (shouldKeepAspectRatio) { + let finalBitmapOptions = new android.graphics.BitmapFactory.Options(); + finalBitmapOptions.inSampleSize = sampleSize; + let bitmap = android.graphics.BitmapFactory.decodeFile(picturePath, finalBitmapOptions); + let scaledSizeImage = null; + if (reqHeight > 0 && reqWidth > 0) { + if (shouldKeepAspectRatio) { - var common: typeof cameraCommonModule = require("./camera-common"); + let common: typeof cameraCommonModule = require("./camera-common"); - var aspectSafeSize = common.getAspectSafeDimensions(bitmap.getWidth(), bitmap.getHeight(), reqWidth, reqHeight); - scaledSizeImage = android.graphics.Bitmap.createScaledBitmap(bitmap, aspectSafeSize.width, aspectSafeSize.height, true); - } - else { - scaledSizeImage = android.graphics.Bitmap.createScaledBitmap(bitmap, reqWidth, reqHeight, true); - } + let aspectSafeSize = common.getAspectSafeDimensions(bitmap.getWidth(), bitmap.getHeight(), reqWidth, reqHeight); + scaledSizeImage = android.graphics.Bitmap.createScaledBitmap(bitmap, aspectSafeSize.width, aspectSafeSize.height, true); } else { - scaledSizeImage = bitmap; + scaledSizeImage = android.graphics.Bitmap.createScaledBitmap(bitmap, reqWidth, reqHeight, true); } - - var ei = new android.media.ExifInterface(picturePath); - var orientation = ei.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, android.media.ExifInterface.ORIENTATION_NORMAL); - - switch (orientation) { - case android.media.ExifInterface.ORIENTATION_ROTATE_90: - scaledSizeImage = rotateBitmap(scaledSizeImage, 90); - break; - case android.media.ExifInterface.ORIENTATION_ROTATE_180: - scaledSizeImage = rotateBitmap(scaledSizeImage, 180); - break; - case android.media.ExifInterface.ORIENTATION_ROTATE_270: - scaledSizeImage = rotateBitmap(scaledSizeImage, 270); - break; - } - - resolve({image:imageSource.fromNativeSource(scaledSizeImage), path:picturePath}); - } + else { + scaledSizeImage = bitmap; + } + + let ei = new android.media.ExifInterface(picturePath); + let orientation = ei.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, android.media.ExifInterface.ORIENTATION_NORMAL); + + switch (orientation) { + case android.media.ExifInterface.ORIENTATION_ROTATE_90: + scaledSizeImage = rotateBitmap(scaledSizeImage, 90); + break; + case android.media.ExifInterface.ORIENTATION_ROTATE_180: + scaledSizeImage = rotateBitmap(scaledSizeImage, 180); + break; + case android.media.ExifInterface.ORIENTATION_ROTATE_270: + scaledSizeImage = rotateBitmap(scaledSizeImage, 270); + break; + } + + resolve(imageSource.fromNativeSource(scaledSizeImage)); } }; @@ -113,10 +117,10 @@ export var isAvailable = function () { } var calculateInSampleSize = function (imageWidth, imageHeight, reqWidth, reqHeight) { - var sampleSize = 1; + let sampleSize = 1; if (imageWidth > reqWidth && imageHeight > reqHeight) { - var halfWidth = imageWidth / 2; - var halfHeight = imageHeight / 2; + let halfWidth = imageWidth / 2; + let halfHeight = imageHeight / 2; while ((halfWidth / sampleSize) > reqWidth && (halfHeight / sampleSize) > reqHeight) { sampleSize *= 2; } @@ -125,8 +129,8 @@ var calculateInSampleSize = function (imageWidth, imageHeight, reqWidth, reqHeig } var createDateTimeStamp = function () { - var result = ""; - var date = new Date(); + let result = ""; + let date = new Date(); result = (date.getDate() < 10 ? "0" + date.getDate().toString() : date.getDate().toString()) + ((date.getMonth() + 1) < 10 ? "0" + (date.getMonth() + 1).toString() : (date.getMonth() + 1).toString()) + date.getFullYear().toString() + @@ -137,7 +141,7 @@ var createDateTimeStamp = function () { } var rotateBitmap = function (source, angle) { - var matrix = new android.graphics.Matrix(); + let matrix = new android.graphics.Matrix(); matrix.postRotate(angle); return android.graphics.Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); } diff --git a/camera/camera.d.ts b/camera/camera.d.ts index d9e5562ca..2e032eba0 100644 --- a/camera/camera.d.ts +++ b/camera/camera.d.ts @@ -36,5 +36,10 @@ declare module "camera" { * This property could affect width or heigth return values. */ keepAspectRatio?: boolean; + + /** + * Defines if camera picture should be copied to photo Gallery (Android) or Photos (iOS) + */ + saveToGallery?: boolean; } } diff --git a/camera/camera.ios.ts b/camera/camera.ios.ts index 400a28a49..b6ac3376c 100644 --- a/camera/camera.ios.ts +++ b/camera/camera.ios.ts @@ -27,7 +27,7 @@ class UIImagePickerControllerDelegateImpl extends NSObject implements UIImagePic if (options) { this._width = options.width; this._height = options.height; - this._saveToGallery = options.saveToGallery; + this._saveToGallery = options.saveToGallery; this._keepAspectRatio = types.isNullOrUndefined(options.keepAspectRatio) ? true : options.keepAspectRatio; } return this; @@ -35,15 +35,15 @@ class UIImagePickerControllerDelegateImpl extends NSObject implements UIImagePic imagePickerControllerDidFinishPickingMediaWithInfo(picker, info): void { if (info) { - var source = info.valueForKey(UIImagePickerControllerOriginalImage); + let source = info.valueForKey(UIImagePickerControllerOriginalImage); if (source) { - var image = null; + let image = null; if (this._width || this._height) { - var newSize = null; + let newSize = null; if (this._keepAspectRatio) { - var common: typeof cameraCommonModule = require("./camera-common"); + let common: typeof cameraCommonModule = require("./camera-common"); - var aspectSafeSize = common.getAspectSafeDimensions(source.size.width, source.size.height, this._width, this._height); + let aspectSafeSize = common.getAspectSafeDimensions(source.size.width, source.size.height, this._width, this._height); newSize = CGSizeMake(aspectSafeSize.width, aspectSafeSize.height); } else { @@ -55,15 +55,15 @@ class UIImagePickerControllerDelegateImpl extends NSObject implements UIImagePic UIGraphicsEndImageContext(); } - var imageSource: typeof imageSourceModule = require("image-source"); + let imageSource: typeof imageSourceModule = require("image-source"); + + let imageSourceResult = image ? imageSource.fromNativeSource(image) : imageSource.fromNativeSource(source); - var imageSourceResult = image ? imageSource.fromNativeSource(image) : imageSource.fromNativeSource(source); - if (this._callback) { this._callback(imageSourceResult); - if(this._saveToGallery) { - UIImageWriteToSavedPhotosAlbum(imageSourceResult.ios, null, null, null); - } + if (this._saveToGallery) { + UIImageWriteToSavedPhotosAlbum(imageSourceResult.ios, null, null, null); + } } } } @@ -82,29 +82,29 @@ var listener; export var takePicture = function (options): Promise { return new Promise((resolve, reject) => { listener = null; - var imagePickerController = new UIImagePickerController(); - var reqWidth = 0; - var reqHeight = 0; - var keepAspectRatio = true; - var saveToGallery = true; + let imagePickerController = new UIImagePickerController(); + let reqWidth = 0; + let reqHeight = 0; + let keepAspectRatio = true; + let saveToGallery = true; if (options) { reqWidth = options.width || 0; reqHeight = options.height || reqWidth; keepAspectRatio = types.isNullOrUndefined(options.keepAspectRatio) ? true : options.keepAspectRatio; - saveToGallery = options.saveToGallery ? true : false; + saveToGallery = options.saveToGallery ? true : false; } if (reqWidth && reqHeight) { listener = UIImagePickerControllerDelegateImpl.new().initWithCallbackAndOptions(resolve, { width: reqWidth, height: reqHeight, keepAspectRatio: keepAspectRatio, saveToGallery: saveToGallery }); } else if (saveToGallery) { - listener = UIImagePickerControllerDelegateImpl.new().initWithCallbackAndOptions(resolve, { saveToGallery: saveToGallery }); - } + listener = UIImagePickerControllerDelegateImpl.new().initWithCallbackAndOptions(resolve, { saveToGallery: saveToGallery }); + } else { listener = UIImagePickerControllerDelegateImpl.new().initWithCallback(resolve); } imagePickerController.delegate = listener; - var sourceType = UIImagePickerControllerSourceType.UIImagePickerControllerSourceTypeCamera; - var mediaTypes = UIImagePickerController.availableMediaTypesForSourceType(sourceType); + let sourceType = UIImagePickerControllerSourceType.UIImagePickerControllerSourceTypeCamera; + let mediaTypes = UIImagePickerController.availableMediaTypesForSourceType(sourceType); if (mediaTypes) { imagePickerController.mediaTypes = mediaTypes; @@ -113,11 +113,11 @@ export var takePicture = function (options): Promise { imagePickerController.modalPresentationStyle = UIModalPresentationStyle.UIModalPresentationCurrentContext; - var frame: typeof frameModule = require("ui/frame"); + let frame: typeof frameModule = require("ui/frame"); - var topMostFrame = frame.topmost(); + let topMostFrame = frame.topmost(); if (topMostFrame) { - var viewController: UIViewController = topMostFrame.currentPage && topMostFrame.currentPage.ios; + let viewController: UIViewController = topMostFrame.currentPage && topMostFrame.currentPage.ios; if (viewController) { viewController.presentViewControllerAnimatedCompletion(imagePickerController, true, null); }