react-native-camera-kit
react-native-camera-kit copied to clipboard
capture() is not working in foreground service: Photo capture failed: Camera is not active.
Describe the bug I'm trying to take pictures by using foreground service when app is in the background. for example taking pictures when the user is in another program. when we are in the app everything is running fine, But when I close the app while the foreground service is active, the camera stops working and gives this error:
01-08 16:02:15.970 31930 31930 E CameraKit: CameraView: Photo capture failed: Camera is not active.
01-08 16:02:15.970 31930 31930 E CameraKit: androidx.camera.core.ImageCaptureException: Camera is not active.
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture$ImageCaptureRequest.lambda$notifyCallbackError$1$androidx-camera-core-ImageCapture$ImageCaptureRequest(ImageCapture.java:2312)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture$ImageCaptureRequest$$ExternalSyntheticLambda0.run(Unknown Source:8)
01-08 16:02:15.970 31930 31930 E CameraKit: at android.os.Handler.handleCallback(Handler.java:914)
01-08 16:02:15.970 31930 31930 E CameraKit: at android.os.Handler.dispatchMessage(Handler.java:100)
01-08 16:02:15.970 31930 31930 E CameraKit: at android.os.Looper.loop(Looper.java:224)
01-08 16:02:15.970 31930 31930 E CameraKit: at android.app.ActivityThread.main(ActivityThread.java:7551)
01-08 16:02:15.970 31930 31930 E CameraKit: at java.lang.reflect.Method.invoke(Native Method)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)
01-08 16:02:15.970 31930 31930 E CameraKit: Caused by: androidx.camera.core.CameraControl$OperationCanceledException: Camera is not active.
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.camera2.internal.Camera2CameraControlImpl.submitStillCaptureRequests(Camera2CameraControlImpl.java:468)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture.issueTakePicture(ImageCapture.java:1728)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture.lambda$takePictureInternal$9$androidx-camera-core-ImageCapture(ImageCapture.java:1298)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture$$ExternalSyntheticLambda9.attachCompleter(Unknown Source:4)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.concurrent.futures.CallbackToFutureAdapter.getFuture(CallbackToFutureAdapter.java:102)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture.takePictureInternal(ImageCapture.java:1275)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture.lambda$createPipeline$1$androidx-camera-core-ImageCapture(ImageCapture.java:492)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture$$ExternalSyntheticLambda4.capture(Unknown Source:2)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture$ImageCaptureRequestProcessor.processNextRequest(ImageCapture.java:1439)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture$ImageCaptureRequestProcessor.sendRequest(ImageCapture.java:1380)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture.sendImageCaptureRequest(ImageCapture.java:1150)
01-08 16:02:15.970 31930 31930 E CameraKit: at androidx.camera.core.ImageCapture.takePicture(ImageCapture.java:1078)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.rncamerakit.CKCamera.capture(CKCamera.kt:337)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.rncamerakit.RNCameraKitModule.capture$lambda-0(RNCameraKitModule.kt:37)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.rncamerakit.RNCameraKitModule.$r8$lambda$2wgx5dg-9oV6vRqRtMkBMHg-BYg(Unknown Source:0)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.rncamerakit.RNCameraKitModule$$ExternalSyntheticLambda0.run(Unknown Source:8)
01-08 16:02:15.970 31930 31930 E CameraKit: at android.os.Handler.handleCallback(Handler.java:914)
01-08 16:02:15.970 31930 31930 E CameraKit: at android.os.Handler.dispatchMessage(Handler.java:100)
01-08 16:02:15.970 31930 31930 E CameraKit: at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
01-08 16:02:15.970 31930 31930 E CameraKit: ... 5 more
Here is my code:
import React, {useRef, useState, useEffect} from 'react';
import {
Button,
PermissionsAndroid,
SafeAreaView,
StatusBar,
StyleSheet,
Text,
View,
LoadingView,
ActivityIndicator,
Image,
TouchableOpacity,
} from 'react-native';
import {useIsForeground} from './hooks/useIsForeground';
import RNFS from 'react-native-fs';
import notifee, {AndroidColor} from '@notifee/react-native';
import {Camera, CameraType} from 'react-native-camera-kit';
const requestCameraPermission = async () => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('You can use the camera');
} else {
console.log('Camera permission denied');
}
} catch (err) {
console.warn(err);
}
};
const HelloWorldApp = () => {
const isAppForeground = useIsForeground();
console.log('In Foreground?: ', isAppForeground);
const [finalPath, setPhotoPath] = useState('');
const [isCameraReady, setIsCameraReady] = useState(false);
useEffect(() => {
console.log('useEffect');
if (isCameraReady) {
notifee.registerForegroundService(() => {
console.log('registerForegroundService');
return new Promise(() => {
setInterval(async () => {
console.log('setInterval');
const {uri} = await this.camera.capture();
}, 2000);
});
});
}
}, [isCameraReady]);
async function onDisplayNotification() {
setIsCameraReady(true);
// Request permissions (required for iOS)
await notifee.requestPermission();
// Create a channel (required for Android)
const channelId = await notifee.createChannel({
id: 'default',
name: 'Default Channel',
});
// Display a notification
await notifee.displayNotification({
title: 'Foreground service',
body: 'This notification will exist for the lifetime of the service runner',
android: {
channelId,
asForegroundService: true,
color: AndroidColor.RED,
colorized: true,
},
});
}
return (
<View style={styles.container}>
<Camera
ref={ref => (this.camera = ref)}
cameraType={CameraType.Front} // front/back(default)
style={styles.camera}
/>
<Image
source={{uri: finalPath + '?' + new Date()}}
style={[styles.image]}
/>
<TouchableOpacity style={styles.button} onPress={onDisplayNotification}>
<Text>Start F Service</Text>
</TouchableOpacity>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'yellow',
},
camera: {
...StyleSheet.absoluteFill,
},
image: {
flex: 1,
},
button: {
alignItems: 'center',
backgroundColor: '#36b8ff',
padding: 10,
},
});
export default HelloWorldApp;
To Reproduce Steps to reproduce the behavior:
- Use my code.
- Click to the button.
- Close the app.
Expected behavior Taking picture successfully by using foreground service when app is in the background.
Also when I remove the app from Recents Tabs I get new error:
TypeError: Cannot read property 'capture' of null