Support
Quality
Security
License
Reuse
kandi has reviewed cameraview and discovered the below as its top functions. This is intended to give you an instant insight into cameraview implemented functionality, and help decide if they suit your requirements.
Camera preview by placing it in a layout XML (and calling the start method)
Configuration by attributes Aspect ratio (app:aspectRatio) Auto-focus (app:autoFocus) Flash (app:flash)
Usage
<com.google.android.cameraview.CameraView
android:id="@+id/camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:keepScreenOn="true"
android:adjustViewBounds="true"
app:autoFocus="true"
app:aspectRatio="4:3"
app:facing="back"
app:flash="auto"/>
How to handle a device rotation for AVCaptureVideoPreviewLayer?
struct CameraPreview: UIViewRepresentable {
@ObservedObject var camera: CameraModel
class LayerView: UIView {
override func layoutSubviews() {
super.layoutSubviews()
// To disable default animation of layer. You can comment out those lines with `CATransaction` if you want to include
CATransaction.begin()
CATransaction.setDisableActions(true)
layer.sublayers?.forEach({ layer in
layer.frame = frame
})
CATransaction.commit()
}
}
func makeUIView(context: Context) -> some UIView {
let view = LayerView()
camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
camera.preview.frame = view.frame
camera.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
view.layer.addSublayer(camera.preview)
camera.session.startRunning()
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
-----------------------
struct CameraView: View {
@StateObject var model = CameraModel()
var body: some View {
CameraPreview(camera: model)
.safeAreaInset(edge: .bottom, alignment: .center, spacing: 0) {
Color.clear
.frame(height: 0)
.background(Material.bar)
}
.ignoresSafeArea(.all, edges: [.top, .horizontal])
.onAppear() {
model.check()
}
}
}
struct CameraPreview: UIViewRepresentable {
@ObservedObject var camera: CameraModel
class LayerView: UIView {
var parent: CameraPreview! = nil
override func layoutSubviews() {
super.layoutSubviews()
// To disable default animation of layer. You can comment out those lines with `CATransaction` if you want to include
CATransaction.begin()
CATransaction.setDisableActions(true)
layer.sublayers?.forEach({ layer in
layer.frame = UIScreen.main.bounds
})
self.parent.camera.rotate(orientation: UIDevice.current.orientation)
CATransaction.commit()
}
}
func makeUIView(context: Context) -> some UIView {
let view = LayerView()
view.parent = self
camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
camera.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
camera.preview.frame = view.frame
view.layer.addSublayer(camera.preview)
camera.start()
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
struct CameraView_Previews: PreviewProvider {
static var previews: some View {
CameraView()
}
}
class CameraModel: ObservableObject {
@Published var session = AVCaptureSession()
@Published var alert = false
@Published var preview: AVCaptureVideoPreviewLayer!
func check() {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
setUp()
break
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { (status) in
if status {
self.setUp()
}
}
break
case .denied:
self.alert.toggle()
break
default:
break
}
}
func setUp() {
do {
self.session.beginConfiguration()
let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
let input = try AVCaptureDeviceInput(device: device!)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
self.session.commitConfiguration()
}
catch {
print(error.localizedDescription)
}
}
func start() {
self.session.startRunning()
}
func rotate(orientation: UIDeviceOrientation) {
let videoConnection = self.preview.connection
switch orientation {
case .portraitUpsideDown:
videoConnection?.videoOrientation = .portraitUpsideDown
case .landscapeLeft:
videoConnection?.videoOrientation = .landscapeRight
case .landscapeRight:
videoConnection?.videoOrientation = .landscapeLeft
case .faceDown:
videoConnection?.videoOrientation = .portraitUpsideDown
default:
videoConnection?.videoOrientation = .portrait
}
}
}
Swiftui nested navigation issue while using navigation link
struct ChildView: View {
@Environment(\.presentationMode) var presentationMode
@Binding var show: Bool
var body: some View {
Button("Assume capture success"){
show = false
presentationMode.wrappedValue.dismiss()
}
}
}
Error: Required named parameter 'path' must be provided
CameraViewPage({Key? key, required this.path}) : super(key: key);
Navigator.push(context, MaterialPageRoute(builder: (builder)=> CameraViewPage(path: path)));
await _cameraController.takePicture(path: path);
-----------------------
CameraViewPage({Key? key, required this.path}) : super(key: key);
Navigator.push(context, MaterialPageRoute(builder: (builder)=> CameraViewPage(path: path)));
await _cameraController.takePicture(path: path);
-----------------------
CameraViewPage({Key? key, required this.path}) : super(key: key);
Navigator.push(context, MaterialPageRoute(builder: (builder)=> CameraViewPage(path: path)));
await _cameraController.takePicture(path: path);
-----------------------
void takePhoto(BuildContext context) async {
final path = join((await getTemporaryDirectory()).path,"${DateTime.now()}.png");
await _cameraController.takePicture(path);
Navigator.push(context, MaterialPageRoute(builder: (builder)=> CameraViewPage(path:path)));
}
Swift UITapGestureRecognizer not calling
let focusGesture = UITapGestureRecognizer(target: context.coordinator, action: #selector(context.coordinator.tapFocus(_:)))
Swiftui IGStoryKit Vertical Image flips Horizontal when sharing to Instagram Story from my app
var fixOrientation: UIImage? {
guard self.imageOrientation != .up else { return self }
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let rect = CGRect(x: 0,
y: 0,
width: self.size.width,
height: self.size.height)
self.draw(in: rect)
guard let normalizedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
UIGraphicsEndImageContext()
return normalizedImage
}
let image = UIImage(data: self.picData)!
guard let fixedOrientationImage = image.fixOrientation else { return }
// Now pass this `fixedOrientationImage` to IGDispatcher
-----------------------
var fixOrientation: UIImage? {
guard self.imageOrientation != .up else { return self }
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let rect = CGRect(x: 0,
y: 0,
width: self.size.width,
height: self.size.height)
self.draw(in: rect)
guard let normalizedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
UIGraphicsEndImageContext()
return normalizedImage
}
let image = UIImage(data: self.picData)!
guard let fixedOrientationImage = image.fixOrientation else { return }
// Now pass this `fixedOrientationImage` to IGDispatcher
@Published UIImage property not updating in SwiftUI
@ObservedObject var cameraViewModel
@StateObject var cameraViewModel
-----------------------
@ObservedObject var cameraViewModel
@StateObject var cameraViewModel
javascript- getUserMedia on Safari
navigator.mediaDevices
.getUserMedia(constraints)
.then(function (stream) {
cameraView.srcObject = stream
cameraView.onloadedmetadata = function(e) {
cameraView.play()
}
})
.catch(function (error) {
alert(error)
})
-----------------------
<video id="camera--view" muted autoplay playsinline></video>
metadataOutputRectConverted(fromLayerRect:) in Android
private fun cropImage(bitmap: Bitmap, cameraFrame: View, cropRectFrame: View): Bitmap {
val scaleFactor: Double; val widthOffset: Double; val heightOffset: Double
if (cameraFrame.height * bitmap.width > cameraFrame.height * bitmap.width) {
scaleFactor = (bitmap.width).toDouble() / (cameraFrame.width).toDouble()
widthOffset = 0.0
heightOffset = (bitmap.height - cameraFrame.height * scaleFactor) / 2
} else {
scaleFactor = (bitmap.height).toDouble() / (cameraFrame.height).toDouble()
widthOffset = (bitmap.width - cameraFrame.width * scaleFactor) / 2
heightOffset = 0.0
}
val newX = cropRectFrame.left * scaleFactor + widthOffset
val newY = cropRectFrame.top * scaleFactor + heightOffset
val width = cropRectFrame.width * scaleFactor
val height = cropRectFrame.height * scaleFactor
return Bitmap.createBitmap(bitmap, (newX).toInt(), (newY).toInt(), (width).toInt(), (height).toInt())
}
SwiftUI- server not receiving base64 string
func takePic(){
DispatchQueue.global(qos: .background).async {
self.output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
DispatchQueue.main.async {
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false) { (timer) in
self.session.stopRunning()
}
}
DispatchQueue.main.async {
withAnimation{self.isTaken.toggle()}
}
print("pic taken...")
}
}
-----------------------
func takePic(){
DispatchQueue.global(qos: .background).async {
self.output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
self.session.stopRunning()
//DispatchQueue.main.async {
// withAnimation{self.isTaken.toggle()} // << IT ISNT TAKEN YET
//}
//print("pic taken...") // << AGAIN IT ISNT TAKEN YET
}
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
// NOW ITS TAKEN BUT MAY HAVE ERRORS
if error != nil{
return // MAYBE THIS NEED SOME BETTER FEEDBACK FOR THE USER
}
guard let imageData = photo.fileDataRepresentation() else{return} // USER FEEDBACK??
self.picData = imageData
// NOW ITS TAKEN
// I'm assuming this is running on the main thread.
withAnimation{self.isTaken.toggle()} // SO TOGGLE isTaken
}
-----------------------
func takePic(){
DispatchQueue.global(qos: .background).async {
self.output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
self.session.stopRunning()
//DispatchQueue.main.async {
// withAnimation{self.isTaken.toggle()} // << IT ISNT TAKEN YET
//}
//print("pic taken...") // << AGAIN IT ISNT TAKEN YET
}
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
// NOW ITS TAKEN BUT MAY HAVE ERRORS
if error != nil{
return // MAYBE THIS NEED SOME BETTER FEEDBACK FOR THE USER
}
guard let imageData = photo.fileDataRepresentation() else{return} // USER FEEDBACK??
self.picData = imageData
// NOW ITS TAKEN
// I'm assuming this is running on the main thread.
withAnimation{self.isTaken.toggle()} // SO TOGGLE isTaken
}
how can I create a rectangular as big as the screen in Xamarin Forms?
<AbsoluteLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
<xct:CameraView x:Name="cameraView" CameraOptions="Back" CaptureMode="Photo" OnAvailable="CameraView_OnAvailable" AbsoluteLayout.LayoutBounds="0.5,0.5,1,1" AbsoluteLayout.LayoutFlags="All">
<xct:CameraView.Behaviors >
<xct:EventToCommandBehavior Command="{Binding PhotoCapturedCommand}" EventName="MediaCaptured" />
</xct:CameraView.Behaviors>
</xct:CameraView>
<Frame BackgroundColor="Transparent" BorderColor="White" AbsoluteLayout.LayoutBounds="0.5,0.5,0.5,0.5" AbsoluteLayout.LayoutFlags="All"/>
</AbsoluteLayout>
QUESTION
How to handle a device rotation for AVCaptureVideoPreviewLayer?
Asked 2022-Apr-01 at 21:27I have a simple camera preview implementation:
import SwiftUI
import AVFoundation
struct CameraView: View {
@StateObject var model = CameraModel()
var body: some View {
CameraPreview(camera: model)
.safeAreaInset(edge: .bottom, alignment: .center, spacing: 0) {
Color.clear
.frame(height: 0)
.background(Material.bar)
}
.ignoresSafeArea(.all, edges: .top)
.onAppear() {
model.check()
}
}
}
struct CameraPreview: UIViewRepresentable {
@ObservedObject var camera: CameraModel
func makeUIView(context: Context) -> some UIView {
let view = UIView(frame: UIScreen.main.bounds)
camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
camera.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
camera.preview.frame = view.frame
view.layer.addSublayer(camera.preview)
camera.start()
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
struct CameraView_Previews: PreviewProvider {
static var previews: some View {
CameraView()
}
}
class CameraModel: ObservableObject {
@Published var session = AVCaptureSession()
@Published var alert = false
@Published var preview: AVCaptureVideoPreviewLayer!
func check() {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
setUp()
break
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { (status) in
if status {
self.setUp()
}
}
break
case .denied:
self.alert.toggle()
break
default:
break
}
}
func setUp() {
do {
self.session.beginConfiguration()
let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
let input = try AVCaptureDeviceInput(device: device!)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
self.session.commitConfiguration()
}
catch {
print(error.localizedDescription)
}
}
func start() {
self.session.startRunning()
}
}
The problem is that it doesn't handle screen rotations:
I found similar topics, for example, this one, but I am a noobie in iOS development, I can't even understand where to put this solution. I've checked neither View
, nor UIViewRepresentable
have such methods to override.
How to handle screen rotation in AVCaptureVideoPreviewLayer
?
ANSWER
Answered 2022-Apr-01 at 06:29If you want to update layer frame in rotation, you need to create custom UIView
and override layoutSubviews()
. Inside layoutSubviews()
, you need to update frame for sublayers.
The code will be as below.
struct CameraPreview: UIViewRepresentable {
@ObservedObject var camera: CameraModel
class LayerView: UIView {
override func layoutSubviews() {
super.layoutSubviews()
// To disable default animation of layer. You can comment out those lines with `CATransaction` if you want to include
CATransaction.begin()
CATransaction.setDisableActions(true)
layer.sublayers?.forEach({ layer in
layer.frame = frame
})
CATransaction.commit()
}
}
func makeUIView(context: Context) -> some UIView {
let view = LayerView()
camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
camera.preview.frame = view.frame
camera.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
view.layer.addSublayer(camera.preview)
camera.session.startRunning()
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
No vulnerabilities reported
Save this library and start creating your kit
Explore Related Topics
Save this library and start creating your kit