Skip to content

Commit 1ab7d12

Browse files
committed
Checks for required camera permissions on init. Returns empty view until camera is permissed.
1 parent 537a913 commit 1ab7d12

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

index.js

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// @author Adam G. Freeman, adamgf@gmail.com
3-
import { NativeModules, requireNativeComponent, View, UIManager, Platform } from 'react-native';
3+
import { NativeModules, requireNativeComponent, View, UIManager, Platform, PermissionsAndroid } from 'react-native';
44

55
import React, { Component } from 'react';
66
import PropTypes from 'prop-types';
@@ -19,7 +19,32 @@ var RNFS = require('react-native-fs')
1919
class CvCamera extends Component {
2020
constructor(props) {
2121
super(props)
22-
this.cvCamera = React.createRef()
22+
this.cvCamera = React.createRef()
23+
if (Platform.OS === 'android' && !PermissionsAndroid.PERMISSIONS.CAMERA) this.requestCameraPermission()
24+
this.state = {
25+
cameraPermissed: Platform.OS === 'ios' ? true : PermissionsAndroid.PERMISSIONS.CAMERA
26+
}
27+
}
28+
async requestCameraPermission() {
29+
const defaultOptions = {
30+
title: 'Permission to use camera',
31+
message: 'We need your permission to use your camera',
32+
buttonPositive: 'Ok',
33+
buttonNegative: 'Cancel',
34+
}
35+
try {
36+
const granted = await PermissionsAndroid.request(
37+
PermissionsAndroid.PERMISSIONS.CAMERA,
38+
this.props.androidCameraPermissionOptions || defaultOptions,
39+
)
40+
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
41+
this.setState({cameraPermissed:true})
42+
} else {
43+
console.log('Camera permission denied')
44+
}
45+
} catch (err) {
46+
console.warn(err)
47+
}
2348
}
2449
setOverlay(overlayMat) {
2550
if (Platform.OS === 'android') {
@@ -37,11 +62,11 @@ class CvCamera extends Component {
3762
async takePicture(filename) {
3863
const outputFilename = RNFS.DocumentDirectoryPath + '/' + filename
3964
const pictureOptions = { 'filename' : outputFilename }
40-
65+
4166
if (Platform.OS === 'android') {
42-
return await NativeModules.CvCameraModule.takePicture(pictureOptions, findNodeHandle(this))
67+
return await NativeModules.CvCameraModule.takePicture(pictureOptions, findNodeHandle(this))
4368
}
44-
else {
69+
else {
4570
return await NativeModules.CvCameraView.takePicture(pictureOptions, findNodeHandle(this))
4671
}
4772
}
@@ -51,30 +76,32 @@ class CvCamera extends Component {
5176
outputFilename = RNFS.ExternalStorageDirectoryPath + '/' + filename
5277
}
5378
const pictureOptions = { 'filename' : outputFilename }
54-
79+
5580
if (Platform.OS === 'android') {
56-
NativeModules.CvCameraModule.startRecording(pictureOptions, findNodeHandle(this))
81+
NativeModules.CvCameraModule.startRecording(pictureOptions, findNodeHandle(this))
5782
}
58-
else {
83+
else {
5984
NativeModules.CvCameraView.startRecording(pictureOptions, findNodeHandle(this))
6085
}
6186
}
62-
async stopRecording() {
87+
async stopRecording() {
6388
if (Platform.OS === 'android') {
64-
return await NativeModules.CvCameraModule.stopRecording(findNodeHandle(this))
89+
return await NativeModules.CvCameraModule.stopRecording(findNodeHandle(this))
6590
}
66-
else {
91+
else {
6792
return await NativeModules.CvCameraView.stopRecording(findNodeHandle(this))
6893
}
6994
}
7095
render() {
96+
if (!this.state.cameraPermissed) return (<View/>)
7197
return (<CvCameraView ref={this.cvCamera} {...this.props} />);
7298
}
7399
}
74100

75101
CvCamera.propTypes = {
76102
...View.propTypes,
77103
facing: PropTypes.string,
104+
androidCameraPermissionOptions: PropTypes.object
78105
};
79106

80107
class CvInvokeGroup extends Component {

0 commit comments

Comments
 (0)