react-native-camera-kit/README.md

294 lines
16 KiB
Markdown
Raw Normal View History

2020-10-21 23:03:18 +00:00
<h1 align="center">
2020-10-21 23:21:49 +00:00
🎈 React Native Camera Kit
2020-10-21 23:03:18 +00:00
</h1>
<p align="center">
A <strong>high performance, fully featured, rock solid</strong><br>
camera library for React Native applications
</p>
<p align="center">
<a href="https://github.com/teslamotors/react-native-camera-kit/blob/master/LICENSE">
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="React Native Camera Kit is released under the MIT license." />
</a>
<a href="https://www.npmjs.org/package/react-native-camera-kit">
<img src="https://badge.fury.io/js/react-native-camera-kit.svg" alt="Current npm package version." />
</a>
</p>
2020-10-21 23:21:49 +00:00
<table>
<tr>
<td>
<img src="images/screenshot.jpg"/>
</td>
<td>
<ul>
<li><h3>Cross Platform (iOS and Android)</h3></li>
<li><h3>Optimized for performance and high photo capture rate</h3></li>
<li><h3>QR / Barcode scanning support</h3></li>
<li><h3>Camera preview support in iOS simulator</h3></li>
</ul>
</td>
</tr>
</table>
2016-08-01 13:05:55 +00:00
## Installation
2016-04-18 09:40:16 +00:00
2020-10-21 23:03:18 +00:00
### Mostly automatic install with autolinking (RN > 0.60)
2020-10-21 23:21:49 +00:00
2017-04-10 19:47:35 +00:00
```bash
npm install react-native-camera-kit --save
```
```bash
2020-10-21 23:03:18 +00:00
cd ios && pod install && cd ..
2017-04-10 19:47:35 +00:00
```
2020-10-21 23:03:18 +00:00
### Mostly automatic install with react-native link (RN < 0.60)
2020-10-21 23:21:49 +00:00
2020-10-21 23:03:18 +00:00
```bash
npm install react-native-camera --save
2017-04-10 19:47:35 +00:00
```
2016-07-26 14:21:51 +00:00
2020-10-21 23:03:18 +00:00
```bash
react-native link react-native-camera
2017-04-10 19:47:57 +00:00
```
2016-07-26 14:21:51 +00:00
2020-10-21 23:03:18 +00:00
#### Install using npm or yarn:
```bash
npm install react-native-camera-kit --save
2017-04-10 19:47:35 +00:00
```
2016-07-26 14:21:51 +00:00
2020-10-21 23:03:18 +00:00
Or if you're using yarn:
2016-07-26 14:21:51 +00:00
2020-10-21 23:03:18 +00:00
```bash
yarn add react-native-camera-kit
2017-04-10 19:47:35 +00:00
```
2016-07-26 14:21:51 +00:00
2020-10-21 23:03:18 +00:00
## Running the example project
2018-03-01 14:26:56 +00:00
2020-10-21 23:03:18 +00:00
- `yarn bootstrap`
- `yarn example ios` or `yarn example android`
2018-03-01 14:26:56 +00:00
2017-08-16 07:46:18 +00:00
## APIs
2016-04-18 09:40:16 +00:00
2020-10-21 23:03:18 +00:00
### CameraKitCamera - Camera component
2017-04-10 19:47:35 +00:00
```js
2020-10-21 23:03:18 +00:00
import { CameraKitCamera } from "react-native-camera-kit";
```
2020-10-21 23:03:18 +00:00
```jsx
2016-07-14 14:18:58 +00:00
<CameraKitCamera
2020-10-21 23:03:18 +00:00
ref={(cam) => (this.camera = cam)}
2017-04-10 19:47:35 +00:00
style={{
flex: 1,
2020-10-21 23:03:18 +00:00
backgroundColor: "white",
}}
cameraOptions={{
2020-10-21 23:03:18 +00:00
flashMode: "auto", // on/off/auto(default)
focusMode: "on", // off/on(default)
zoomMode: "on", // off/on(default)
ratioOverlay: "1:1", // optional
ratioOverlayColor: "#00000077", // optional
}}
2020-10-21 23:03:18 +00:00
onReadCode={(
event // optional
) => console.log(event.nativeEvent.codeStringValue)}
resetFocusTimeout={0} // optional
resetFocusWhenMotionDetected={true} // optional
2016-08-01 13:05:55 +00:00
/>
```
2020-10-21 23:03:18 +00:00
| Prop | Type | Description |
| ------------------------------ | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `resetFocusTimeout` | Number | iOS only. Dismiss tap to focus after this many milliseconds. Default `0` (disabled). Example: `5000` is 5 seconds. |
| `resetFocusWhenMotionDetected` | Boolean | iOS only. Dismiss tap to focus when focus area content changes. Native iOS feature, see documentation: https://developer.apple.com/documentation/avfoundation/avcapturedevice/1624644-subjectareachangemonitoringenabl?language=objc). Default `true`. |
| `saveToCameraRoll` | Boolean | Using the camera roll is slower than using regular files stored in your app. On an iPhone X in debug mode, on a real phone, we measured around 100-150ms processing time to save to the camera roll. _<span style="color: red">**Note:**</span> This only work on real devices. It will hang indefinitly on simulators._ |
| `saveToCameraRollWithPhUrl` | Boolean | iOS only. If true, speeds up photo taking by about 5-50ms (measured on iPhone X) by only returning a [rn-cameraroll-compatible](https://github.com/react-native-community/react-native-cameraroll/blob/a09af08f0a46a98b29f6ad470e59d3dc627864a2/ios/RNCAssetsLibraryRequestHandler.m#L36) `ph://..` URL instead of a regular `file://..` URL. |
| `cameraOptions` | Object | See `cameraOptions` below |
### cameraOptions
2016-08-01 13:05:55 +00:00
2020-10-21 23:03:18 +00:00
| Attribute | Values | Description |
| ------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `flashMode` | `'on'`/`'off'`/`'auto'` | Camera flash mode (default is `auto`) |
| `focusMode` | `'on'`/`'off'` | Camera focus mode (default is `on`) |
| `zoomMode` | `'on'`/`'off'` | Camera zoom mode |
| `ratioOverlay` | `['int':'int', ...]` | Show a guiding overlay in the camera preview for the selected ratio. Does not crop image as of v9.0. Example: `['16:9', '1:1', '3:4']` |
| `ratioOverlayColor` | Color | Any color with alpha (default is `'#ffffff77'`) |
2016-08-01 13:05:55 +00:00
### CameraKitCamera API
2016-08-01 13:05:55 +00:00
#### checkDeviceCameraAuthorizationStatus
2017-04-10 19:47:35 +00:00
```js
2016-08-01 13:05:55 +00:00
const isCameraAuthorized = await CameraKitCamera.checkDeviceCameraAuthorizationStatus();
```
2017-04-10 19:47:35 +00:00
2016-08-01 13:05:55 +00:00
return values:
2016-07-14 14:18:58 +00:00
2016-08-01 13:05:55 +00:00
`AVAuthorizationStatusAuthorized` returns `true`
`AVAuthorizationStatusNotDetermined` returns `-1`
2020-10-21 23:03:18 +00:00
otherwise, returns `false`
2016-08-01 13:05:55 +00:00
#### requestDeviceCameraAuthorization
2017-04-10 19:47:35 +00:00
```js
2016-08-01 13:05:55 +00:00
const isUserAuthorizedCamera = await CameraKitCamera.requestDeviceCameraAuthorization();
2016-07-14 14:18:58 +00:00
```
2017-04-10 19:47:35 +00:00
2016-08-01 13:05:55 +00:00
`AVAuthorizationStatusAuthorized` returns `true`
otherwise, returns `false`
#### capture({ ... }) - must have the wanted camera capture reference
2016-08-01 13:05:55 +00:00
Capture image (`{ saveToCameraRoll: boolean }`). Using the camera roll is slower than using regular files stored in your app. On an iPhone X in debug mode, on a real phone, we measured around 100-150ms processing time to save to the camera roll.
2016-07-14 14:18:58 +00:00
2017-04-10 19:47:35 +00:00
```js
const image = await this.camera.capture();
2016-07-14 14:18:58 +00:00
```
2017-08-16 07:46:18 +00:00
#### setFlashMode - must have the wanted camera capture reference
2016-07-14 14:18:58 +00:00
Set flash mode (`auto`/`on`/`off`)
2016-07-14 14:18:58 +00:00
2017-04-10 19:47:35 +00:00
```js
2016-07-14 14:18:58 +00:00
const success = await this.camera.setFlashMode(newFlashData.mode);
```
#### setTorchMode - must have the wanted camera capture reference
Set Torch mode (`on`/`off`)
```js
const success = await this.camera.setTorchMode(newTorchMode);
```
2017-08-16 07:46:18 +00:00
#### changeCamera - must have the wanted camera capture reference
2016-07-14 14:18:58 +00:00
2018-07-03 01:41:09 +00:00
Change to front/rear camera
2016-07-14 14:18:58 +00:00
2017-04-10 19:47:35 +00:00
```js
2016-07-14 14:18:58 +00:00
const success = await this.camera.changeCamera();
```
2017-08-16 07:46:18 +00:00
### CameraKitGalleryView - Gallery grid component
2016-04-18 09:40:16 +00:00
2017-08-15 07:26:25 +00:00
Native Gallery View (based on `UICollectionView`(iOS) and ` RecyclerView` (Android))
2016-08-08 08:22:22 +00:00
2017-03-01 16:45:50 +00:00
![](img/camerakitgalleryview.png)
2017-04-10 19:47:35 +00:00
```js
2019-09-03 14:45:22 +00:00
import { CameraKitGalleryView } from 'react-native-camera-kit';
2016-07-14 14:18:58 +00:00
<CameraKitGalleryView
2017-04-10 19:47:35 +00:00
ref={gallery => this.gallery = gallery}
style={{flex: 1, marginTop: 20}}
minimumInteritemSpacing={10}
minimumLineSpacing={10}
albumName={<ALBUM_NAME>}
columnCount={3}
2017-04-10 19:47:35 +00:00
onTapImage={event => {
2017-08-15 07:26:25 +00:00
// event.nativeEvent.selected - ALL selected images ids
}}
selectedImages={<MAINTAIN_SELECETED_IMAGES>}
selectedImageIcon={require('<IMAGE_FILE_PATH>'))}
unSelectedImageIcon={require('<IMAGE_FILE_PATH>')}
2016-08-01 13:05:55 +00:00
/>
2016-04-18 09:40:16 +00:00
```
2017-03-01 16:41:32 +00:00
2020-10-21 23:03:18 +00:00
| Attribute | Values | Description |
| ------------------------------ | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `minimumInteritemSpacing` | Float | Minimum inner Item spacing |
| `minimumLineSpacing` | Float | Minimum line spacing |
| `imageStrokeColor` | Color | Image stroke color |
| `imageStrokeColorWidth` | Number > 0 | Image stroke color width |
| `albumName` | String | Album name to show |
| `columnCount` | Integer | How many clumns in one row |
| `onTapImage` | Function | Callback when image tapped |
| `selectedImages` | Array | Selected images (will show the selected badge) |
| `selectedImageIcon` | `require(_PATH_)` | - _DEPRECATED_ use Selection - Selected image badge image |
| `unSelectedImageIcon` | `require(_PATH_)` | - _DEPRECATED_ use Selection - Unselected image badge image |
| `selection` | Object | See [Selection section](#selection) |
| `getUrlOnTapImage` | Boolean | iOS only - On image tap return the image internal (tmp folder) uri (intead of `Photos.framework` asset id) |
| `customButtonStyle` | Object | See [Custom Button](#custom-button) section |
| `onCustomButtonPress` | Function | Callback when custom button tapped |
| `contentInset` (iOS) | Object | The amount by which the gellery view content is inset from its edges (similar to `ScrollView` contentInset) |
| `remoteDownloadIndicatorType` | String (`'spinner'` / `'progress-bar'` / `'progress-pie'`) | iOS only - see [Images stored in iCloud](#images-stored-in-iCloud) |
| `remoteDownloadIndicatorColor` | Color | iOS only - Color of the remote download indicator to show |
| `onRemoteDownloadChanged` | Function | iOS only - Callback when the device curentlly download remote image stored in the iCloud. |
2017-03-01 16:41:32 +00:00
#### Custom Button
2017-04-10 19:47:35 +00:00
2020-10-21 23:03:18 +00:00
| Attribute | Values | Description |
| ----------------- | ----------------- | ------------------------------ |
| `image` | `require(_PATH_)` | Custom button image |
| `backgroundColor` | Color | Custom button background color |
2017-03-01 16:41:32 +00:00
#### Selection
2020-10-21 23:03:18 +00:00
| Attribute | Values | Description |
| ------------------ | ---------------------------------- | -------------------------------------------------------------- |
| `selectedImage` | `require(_PATH_)` | Selected image badge image |
| `unselectedImage` | `require(_PATH_)` | Unselected image badge image |
| `imagePosition` | `bottom/top-right/left` / `center` | Selected/Unselected badge image position (Default:`top-right`) |
| `overlayColor` | Color | Image selected overlay color |
| `imageSizeAndroid` | `large`/`medium` | Android Only - Selected badge image size |
#### Images stored in iCloud
2017-08-05 06:23:29 +00:00
2017-08-18 16:35:45 +00:00
On iOS images can be stored in iCould if the device is **low on space** which means full-resolution photos automatically replaced with optimized version and full resolution versions are stored in iCloud.
2017-08-18 16:38:32 +00:00
2020-10-21 23:03:18 +00:00
In this case, we need to download the image from iCloud and _Photos Framework_ by Apple does a great job. Downloading take time and we deal with UI, so we need to show loading/progress indicator.
2017-08-18 16:38:32 +00:00
In order to do so, we provide 3 types of loading/progress inidcators:
2017-08-18 16:35:45 +00:00
Sets `remoteDownloadIndicatorType` prop (and `remoteDownloadIndicatorColor` in order to sets the Color) on CameraKitGalleryView:
2020-10-21 23:03:18 +00:00
| Attribute | Values |
| ---------------- | :----------------------: |
| `'spinner'` | ![](img/spinner.png) |
| `'progress-bar'` | ![](img/progressBar.png) |
| `'progress-pie'` | ![](img/pie.png) |
> In order to simulate this loading behaviour, since reach low on storage situation is hard, add this prop `iCloudDownloadSimulateTime={TIME_IN_SECONDS}`, just **DO NOT FORGET TO REMOVE IT**.
## QR Code
2017-08-05 06:23:29 +00:00
```js
2020-10-21 23:03:18 +00:00
import { CameraKitCameraScreen } from "react-native-camera-kit";
2019-09-03 14:45:22 +00:00
<CameraKitCameraScreen
2020-10-21 23:03:18 +00:00
actions={{ rightButtonText: "Done", leftButtonText: "Cancel" }}
onBottomButtonPressed={(event) => this.onBottomButtonPressed(event)}
scanBarcode={true}
laserColor={"blue"}
frameColor={"yellow"}
onReadCode={(event) => Alert.alert("Qr code found")} //optional
hideControls={false} //(default false) optional, hide buttons and additional controls on top and bottom of screen
showFrame={true} //(default false) optional, show frame with transparent layer (qr code or barcode will be read on this area ONLY), start animation for scanner,that stoped when find any code. Frame always at center of the screen
offsetForScannerFrame={10} //(default 30) optional, offset from left and right side of the screen
heightForScannerFrame={300} //(default 200) optional, change height of the scanner frame
colorForScannerFrame={"red"} //(default white) optional, change colot of the scanner frame
/>;
```
2017-08-15 07:23:33 +00:00
2020-10-21 23:03:18 +00:00
## Contributing
2020-10-21 23:21:49 +00:00
2020-10-21 23:03:18 +00:00
- Pull Requests are welcome, if you open a pull request we will do our best to get to it in a timely manner
- Pull Request Reviews are even more welcome! we need help testing, reviewing, and updating open PRs
- If you are interested in contributing more actively, please contact us.
2017-08-17 11:58:40 +00:00
## Credits
2020-10-21 23:03:18 +00:00
- [M13ProgressSuite](https://github.com/Marxon13/M13ProgressSuite) component by Marxon13 - A suite containing many tools to display progress information on iOS.
2017-08-17 11:58:40 +00:00
2017-08-15 07:23:33 +00:00
## License
The MIT License.
2017-08-15 15:40:45 +00:00
See [LICENSE](LICENSE)