Commit Graph

24 Commits

Author SHA1 Message Date
SimonErm
dc4f65702f
feat(touch): Feature/add on tap events (#2827)
* add TouchEvent on android

* add GestureHandler to detect touches on android

* add property to enable touchDetector on android

* add onTouch event to ios

* add GestureRecognizer to ios

* add onTouch property and js setup

* add missing semicolons

* fix literal notation

* add missing ":"

* fix copy-paste error (wrong var-name)

* pass the native event to the onTouch callback

* replace : with ;

* add onTouch type defs

* add documentation for onTouch property

* scale postion before emitting since the event coordinates are raw pixels

* migrate advanced example to native pinch zoom and onTouch

* split onTouch property into onTap and onDoubleTap
2020-05-12 17:56:42 -03:00
cristianoccazinsp
c7e92b29c8
feature(record): On recording start and end events (#2702)
* This update tries to improve audio recording interruptions on iOS due to phone calls or background music.

- Use a more generic event to handle session interruptions. This removes the need to listen to foreground/background events, and stopping the session this way was actually redundant/wrong (see https://forums.developer.apple.com/thread/61406). This also makes session stopping detection more reliable (calls, suspension due to a call or notification, etc., which would previously not set the recording interrupted flag on every case)

From the above docs: "No, incorrect. You _never_ need to stop your capture session. The capture session automatically stops itself when your app goes to the background and resumes itself when you come back to the foreground."

- Allow for `captureAudio` updates to also update the audio connections internally so the prop can be correctly updated on the fly without remounting.

- add onAudioInterrupted and onAudioConnected events so the UI can handle scenarios where audio is wanted but not available. This should also help in keeping the preview active even if audio is interrupted and we have captureAudio={true}. Lastly, it can be used to detect if we can record audio or not due to the dummy implementation of the audio permission on iOS always returning true.

- check, activate, and release audio sessions (if captureAudio) so we can detect early if audio is available before attempting to connect the input. This will also allow us to detect if we can record even if there was already a call before opening the camera.

- use proper observer for session error instead of of the strong self block. No benefit, but makes code more readable and allows access to instance variables

- getDeviceOrientationWithBlock might fire more than once under some circumstances, ending up taking a picture or video twice. Add a lock and additional check to prevent this.

* no need for change check,

* do not resume audio if we were hinted not to (e.g., music playback happening)

* Move heavy work to a dedicated background thread. Improves camera initial loading and resumes from background.

Details:

- Use a HandlerThread to delegate heavy tasks to background. The thread is managed by the view, and passed down to the implementation in case it also needs to use it. The view will fire start calls and other possibly heavy operations in this thread to avoid ANRs. Some code sent to this thread:
    - start calls: start is extremely heavy and will cause ANRs on some devices, especially when coming back from background
    - Camera1: some preset changes fire a stop/start sequence. These will now happen in the background thread
    - take picture and start recording (from view class) will also start in this thread

- Add some extra null checks

- View was not properly cleaning up itself on destroy (host destroy event was never fired)

* Fix for a possible crash when changing devices and changing focus. If the new device resets the focus, "defocusing" might not be possible if the new device does not support auto focus. For this reason, we need to do a different cleanup on the focus and exposed flags and events.

* start session here also on session queue.

* check for session running before trying to record or capture.
This should fix a possible race condition where both the session start call happens at the same time as the record call

* set preview orientation also in session queue

* no need to set orientation on constructor, and set it on session queue to prevent race conditions

* move device init and checks also to session queue. This prevents possible double initializations.

* catch possible errors when starting camera preview. This might still randomly fail on some devices for some reason.

* delay capture in progress until we have resumed/paused preview.

* do not crash the app if set texture setup failed

* more synchronized checks to prevent crashes due to concurrent camera updates

* remove unused imports

* Handle audio interruption in session queue. This prevents the session isRunning flag from getting corrupted due to concurrent updates to the session.

* Fix possible crash when attempting to retrieve camera parameters.

* Preserve exif/metadata on photo capture. Add a few comments to each step of the capture process

* orientation must be fixed before mirroring

* x/y dimensions are redundantly updated (storing the image sets them automatically). However, orientation must be reset on any image change since the final stored image is automatically rotated when it is modified in place.

* revert mirrorImage order, has to be first since forceUpOrientation adjusts the image afterwards.

* Minor change: also implement `onPictureTaken` for iOS in case anyone needs the early event.

* - Improve Android code so skipProcessing is not needed, the code is more in line with iOS, and is "fast" by default. This means that skipProcessing is no longer needed (nor used), and adding additional options will "slow down" the capture as expected, rather than having always a lot of processing. This shouldn't be a breaking change.

- document the writeExif option, and implement it for iOS as well.

* This is a fix for events possibly being fired not on the main thread, which could cause the whole app to freeze.

* Fire events on the right thread. No need to use UI thread, and fix the still works

* Release CF object which could cause a memleak

* Fix Objects.equals that is only available after API 19

* allow for audio session to be kept even after unmounts

* readme typo

* readme typo

* Make camera ready events to fire also on camera/device change to be consistent with Android. Fire unmount error when session or device fails to start.

* update example app to properly use camera ready event

* Make camera ready events to fire also on camera/device change to be consistent with Android. Fire unmount error when session or device fails to start. Update advanced example app to use camera ready event instead.

* Android crash fixes. Make sure no unsupported aspect ratio is used, and do not crash when there are no cameras available.

* stop/release camera in non-UI thread so we prevent ANRs and UI freezing.

Some phones may take up to a second to release the camera and preview.

* move codec, max duration, and max file size settings to the session queue.

This might prevent a race condition when changing presets/quality.

* android crash fix

* Add onRecordingStart and onRecordingEnd events

* fix for surface destroy and resume events.

* add missing types

* fix for surface destroy and resume events.

* add missing types

Co-authored-by: Cristiano Coelho <cristianocca@hotmail.com>
2020-02-13 23:21:59 -03:00
cristianoccazinsp
aa22fd1fff feat(exif): Implement writeExif for iOS, Android improvements (#2577)
* - Improve Android code so skipProcessing is not needed, the code is more in line with iOS, and is "fast" by default. This means that skipProcessing is no longer needed (nor used), and adding additional options will "slow down" the capture as expected, rather than having always a lot of processing. This shouldn't be a breaking change.

- document the writeExif option, and implement it for iOS as well.

* Release CF object which could cause a memleak
2019-11-20 00:22:08 -03:00
cristianoccazinsp
ad9d0840fd fix(android): Possible ANR due to events not fired on the main thread (#2591)
* This is a fix for events possibly being fired not on the main thread, which could cause the whole app to freeze.

* Fire events on the right thread. No need to use UI thread, and fix the still works
2019-11-18 09:52:35 -03:00
Hanno Fellmann
66e99d8027 fix(exif): writing EXIF data with correct data type (#2396) 2019-08-02 11:09:50 -03:00
Laurin Quast
409d2a9eea break(androidX): upgrading to sdk 28 and androidx (#2068) (#2306)
* upgrading to sdk 28 and androidx

* revert attempt to fix build

* fixing build

* build version fix

* updating example app

* manifest update

* using stable release, instead of beta

* androidx migration doc

* migration doc update

* follow on androidx upgrade after rebase
2019-07-14 16:08:03 -03:00
Laurin Quast
72a8d7f34c
fix: revert breaking change upgrading to sdk 28 and androidx
This reverts commit e2a895ad1c.
2019-06-06 21:00:59 +02:00
Greg Alexander
e2a895ad1c feat(androidX): upgrading to sdk 28 and androidx (#2068)
* upgrading to sdk 28 and androidx

* revert attempt to fix build

* fixing build

* build version fix

* updating example app

* manifest update

* using stable release, instead of beta

* androidx migration doc

* migration doc update

* follow on androidx upgrade after rebase
2019-06-02 16:20:57 -03:00
Valentin
8ad809ee88 feat(android): write Exif tags to modified image file (#2263) 2019-05-15 09:10:03 -03:00
Telmen
a6b619cb73 feat(android): front camera face detect (#2257) 2019-05-09 12:22:22 -03:00
Daniil Ovoshchnikov
0ab570a636 feat(mlkit): Migrate Face, Barcode and Text Recognition to Firebase MLKit (iOS - text, Android - all) (#2075)
* switch to firebase mlkit for text recognition

* migrate android to MLKit

migrate Text detection android to MLKit
update gradle of example app
Update build.gradle
separate gms vision facedetector to general flavor

migrate faceDetector to mlkit and fix incorrect bounds due to padding

migrate barCode detector to mlkit
update android instructions in readme
safe face implementation move gms to generalImplementation

* add mlkit example

setup android of mlkit example

setup ios of mlkit example
fix typo in readme
update example project readme

* amend mlkit migration to include raw data

add barcode detection in basic and mlkit examples

* fix duplicate bridgeDidBackground method

BREAKING CHANGE: We migrated to MLKit instead of Google Mobile Vision
2019-03-11 08:56:24 -03:00
Shashank Kushwah
9d56a21ddc [Android] Expose barcode bounds and source dimension from google vision barcode scanner (#2095)
* added react-navigation

* added barcode scanner example

* exposed barcode bounds and source dimensions in google vision barcode

* updated typescript types for google vision barcode
2019-03-09 11:41:15 -03:00
Matt Oakes
f7fb3e361d fix(android): use the correct camera orientation to fix image detection (#2050), Fixes #1714 2019-01-18 10:30:35 +01:00
Raphael Hovsepyan
aea0db22f7 Added origin key for result points and added camera width and height (#1824) 2018-10-19 09:31:01 -03:00
Ivan Polomani
8de827e6c2 fix: Error retrieving camcorder profile params (#1835)
I got this error when I call `recordAsync(...)` with `quality: RNCamera.Constants.VideoQuality['480p']` on Samsung Galaxy Tab S 10.5.
```
Error: Error retrieving camcorder profile params
    at createErrorFromErrorData (NativeModules.js:123)
    at NativeModules.js:80
    at MessageQueue.__invokeCallback (MessageQueue.js:400)
    at MessageQueue.js:139
    at MessageQueue.__guardSafe (MessageQueue.js:316)
    at MessageQueue.invokeCallbackAndReturnFlushedQueue (MessageQueue.js:138)
```
It happens because there is no check if device actually supports given quality.
To make the `CamcorderProfile.get(quality)` call safe we need to check if there is appropriate CamcorderProfile by calling `CamcorderProfile.hasProfile(quality))`.

This PR fixes that issue.
2018-10-04 14:55:59 -03:00
Josh Sacks
b8132bf8ab added Android event to emit when picture is taken 2018-07-30 12:33:30 -04:00
Joao Fidelis
497a703964 feat(preview): add android code 2018-05-31 14:27:30 -03:00
serhiiavsheniuk
e3bdc92ebb Fix camera issues. 2018-04-13 14:18:47 +02:00
Serhii Avsheniuk
8f72ef949f Add GoogleVision barcode scanner. 2018-04-10 23:32:11 +02:00
Aldo Culquicondor
fcaa945286 feat(android): integrating Google Vision's text recognition 2018-03-22 11:32:27 -05:00
Will Wheeler
17eebff45c Fix stream error and date format error
Fixes #1220
2018-03-15 15:40:30 -07:00
Joao Fidelis
ad1b140790 Organize imports and add missing method from Expo implementation (android) 2018-02-01 17:09:19 -02:00
Joao Fidelis
07e6e566d5 Issue ##1099: Make takePictureAsync return { width, height, base64, exif } 2018-01-22 19:25:35 -02:00
Sibelius Seraphini
a0817132d6 rename expo to simple RN, add js files, and export them inside the same camera package 2018-01-01 19:16:02 -02:00