capture returns metadata

This commit is contained in:
Kyle Corbitt 2016-03-31 12:59:26 -07:00 committed by Zack Story
parent 12b5e330cd
commit 0c789b8da0
No known key found for this signature in database
GPG Key ID: 9057E38B6937BF11
3 changed files with 50 additions and 10 deletions

View File

@ -240,7 +240,7 @@ You can access component methods by adding a `ref` (ie. `ref="camera"`) prop to
#### `capture([options]): Promise`
Captures data from the camera. What is captured is based on the `captureMode` and `captureTarget` props. `captureMode` tells the camera whether you want a still image or video. `captureTarget` allows you to specify how you want the data to be captured and sent back to you. See `captureTarget` under Properties to see the available values. The promise will be fulfilled with the image data or file handle of the image on disk, depending on `target`.
Captures data from the camera. What is captured is based on the `captureMode` and `captureTarget` props. `captureMode` tells the camera whether you want a still image or video. `captureTarget` allows you to specify how you want the data to be captured and sent back to you. See `captureTarget` under Properties to see the available values.
Supported options:
@ -251,6 +251,15 @@ Supported options:
- `location` This is the object returned from `navigator.geolocation.getCurrentPosition()` (React Native's geolocation polyfill). It will add GPS metadata to the image.
- `rotation` This will rotate the image by the number of degrees specified.
The promise will be fulfilled with an object with some of the following properties:
- `data`: Returns a base64-encoded string with the capture data (only returned with the deprecated `Camera.constants.CaptureTarget.memory`)
- `path`: Returns the path of the captured image or video file on disk
- `width`: (currently iOS video only) returns the video file's frame width
- `height`: (currently iOS video only) returns the video file's frame height
- `duration`: (currently iOS video only) video file duration
- `size`: (currently iOS video only) video file size (in bytes)
#### `iOS` `getFOV(): Promise`
Returns the camera's current field of view.

View File

@ -181,10 +181,12 @@ public class RCTCameraModule extends ReactContextBaseJavaModule {
public void onPictureTaken(byte[] data, Camera camera) {
camera.stopPreview();
camera.startPreview();
Map<String, Object> response = new HashMap();
switch (options.getInt("target")) {
case RCT_CAMERA_CAPTURE_TARGET_MEMORY:
String encoded = Base64.encodeToString(data, Base64.DEFAULT);
promise.resolve(encoded);
response.put("data", encoded);
promise.resolve(response);
break;
case RCT_CAMERA_CAPTURE_TARGET_CAMERA_ROLL:
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
@ -193,7 +195,8 @@ public class RCTCameraModule extends ReactContextBaseJavaModule {
_reactContext.getContentResolver(),
bitmap, options.getString("title"),
options.getString("description"));
promise.resolve(url);
response.put("path", url);
promise.resolve(response);
break;
case RCT_CAMERA_CAPTURE_TARGET_DISK:
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);

View File

@ -548,7 +548,8 @@ RCT_EXPORT_METHOD(hasFlash:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRej
NSString *responseString;
if (target == RCTCameraCaptureTargetMemory) {
responseString = [imageData base64EncodedStringWithOptions:0];
resolve(@{@"data":[imageData base64EncodedStringWithOptions:0]});
return;
}
else if (target == RCTCameraCaptureTargetDisk) {
@ -573,7 +574,7 @@ RCT_EXPORT_METHOD(hasFlash:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRej
else if (target == RCTCameraCaptureTargetCameraRoll) {
[[[ALAssetsLibrary alloc] init] writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL* url, NSError* error) {
if (error == nil) {
resolve([url absoluteString]);
resolve(@{@"path":[url absoluteString]});
}
else {
reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description));
@ -581,7 +582,7 @@ RCT_EXPORT_METHOD(hasFlash:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRej
}];
return;
}
resolve(responseString);
resolve(@{@"path":responseString});
}
- (CGImageRef)newCGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle
@ -666,7 +667,6 @@ didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
fromConnections:(NSArray *)connections
error:(NSError *)error
{
BOOL recordSuccess = YES;
if ([error code] != noErr) {
// A problem occurred: Find out if the recording was successful.
@ -680,6 +680,31 @@ didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
return;
}
AVURLAsset* videoAsAsset = [AVURLAsset URLAssetWithURL:outputFileURL options:nil];
AVAssetTrack* videoTrack = [[videoAsAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
float videoWidth;
float videoHeight;
CGSize videoSize = [videoTrack naturalSize];
CGAffineTransform txf = [videoTrack preferredTransform];
if ((txf.tx == videoSize.width && txf.ty == videoSize.height) || (txf.tx == 0 && txf.ty == 0)) {
// Video recorded in landscape orientation
videoWidth = videoSize.width;
videoHeight = videoSize.height;
} else {
// Video recorded in portrait orientation, so have to swap reported width/height
videoWidth = videoSize.height;
videoHeight = videoSize.width;
}
NSMutableDictionary *videoInfo = [NSMutableDictionary dictionaryWithDictionary:@{
@"duration":[NSNumber numberWithFloat:CMTimeGetSeconds(videoAsAsset.duration)],
@"width":[NSNumber numberWithFloat:videoWidth],
@"height":[NSNumber numberWithFloat:videoHeight],
@"size":[NSNumber numberWithLongLong:captureOutput.recordedFileSize],
}];
if (self.videoTarget == RCTCameraCaptureTargetCameraRoll) {
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) {
@ -689,7 +714,8 @@ didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description));
return;
}
self.videoResolve([assetURL absoluteString]);
[videoInfo setObject:[assetURL absoluteString] forKey:@"path"];
self.videoResolve(videoInfo);
}];
}
}
@ -706,7 +732,8 @@ didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description));
return;
}
self.videoResolve(fullPath);
[videoInfo setObject:fullPath forKey:@"path"];
self.videoResolve(videoInfo);
}
else if (self.videoTarget == RCTCameraCaptureTargetTemp) {
NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];
@ -720,7 +747,8 @@ didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description));
return;
}
self.videoResolve(fullPath);
[videoInfo setObject:fullPath forKey:@"path"];
self.videoResolve(videoInfo);
}
else {
self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Target not supported"));