Arbeiten Sie mit der Kamera in Flutter

Die Möglichkeit, die Kamera zu verwenden, ist in vielen Anwendungen vorhanden, und wir alle verwenden sie regelmäßig. In Flutter können wir die Arbeit mit der Kamera mithilfe von zwei offiziellen Plugins implementieren:



Es gibt einen spürbaren Unterschied zwischen ihnen, und es lohnt sich, sie je nach Situation zu verwenden:


  • camera können Sie mit den Kameras interagieren, die dem Gerät in Ihrer Anwendung zur Verfügung stehen, und das Bild im Widget anzeigen. Es eignet sich gut für Aufgaben, bei denen Sie den Betrieb der Kamera für die Anwendung "anpassen" müssen.
  • image-picker startet die Kameraanwendung und gibt ein Objekt vom Typ File (vom Benutzer ausgewählte Bild- oder Videodatei) an Ihre Anwendung zurück. Mit der image-picker können Sie auch eine Datei aus den auf dem Gerät verfügbaren auswählen, während wie bei der Kamera eine separate Anwendung gestartet wird, nach der das ausgewählte Objekt an Ihre Anwendung zurückgegeben wird.



Hier sehen Sie die Quelle .




Kamera


1. Fügen Sie das Plugin gemäß den Anweisungen zu unserem Projekt hinzu


Zusätzliche Einstellungen für das Betriebssystem
iOS
Fügen Sie ios/Runner/Info.plist die folgenden Zeilen ios/Runner/Info.plist :


 <key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string> 

Android
Stellen Sie sicher, dass die Mindestversion von Android SDK in der Datei android/app/build.gradle 21 .


 minSdkVersion 21 

Alle erforderlichen Berechtigungen werden beim Start der Anwendung angefordert.


Arbeit an Emulatoren
Bei iOS können wir die Kamera auf dem Emulator nicht überprüfen, wir benötigen ein "Live" -Gerät.
Android generiert ein Modell (siehe Bild unten), das das ersetzt, was das Kameraobjektiv sieht.


Standardstecker


Wenn Sie nicht auf den Standardstecker schauen möchten

Wählen Sie in den Emulatoreinstellungen Erweiterte Einstellungen und stellen Sie VirtualScene für die Rückfahrkamera ein.

Wir starten den Emulator neu. Jetzt "zeigt" die Kamera den virtuellen Raum, der mit Maus und Wäsche bewegt werden kann.

Danke an Tonn_Tamerlan für den Tipp.


2. Wir gehen zum Code über. Zuerst erhalten wir alle verfügbaren Kameras mit der Funktion availableCameras .


 final cameras = await availableCameras(); 

Diese Funktion gibt eine Reihe von Beschreibungen ( List<CameraDescription> ) der verfügbaren Kameras zurück, wobei jedes Element den Namen der Kamera (es kann nur ein Index sein), den Typ (hinten, vorne, außen) und den Winkel enthält, um den Sie das Foto drehen möchten, damit es angezeigt wird ihre Orientierung.


Zur Steuerung der Kamera benötigen wir einen Objektcontroller wie CameraController , um zu bestimmen, welche der empfangenen Kamerabeschreibungen und Auflösungen (niedrig, mittel, hoch) angegeben werden müssen.


 void _setCameraController(CameraDescription cameraDescription) async { _controller = CameraController(cameraDescription, ResolutionPreset.medium); ... await _controller.initialize(); ... if (mounted) { setState(() {}); } } 

Als Nächstes initialisieren wir den Controller und nachdem wir sichergestellt haben, dass das Widget "aktiv" ist, aktualisieren wir den Status dieses Widgets. ( Funktionstext )


Wir übergeben den initialisierten Controller an das CameraPreview Widget


  AspectRatio( aspectRatio: _controller.value.aspectRatio, child: CameraPreview(_controller)) 

CameraPreview basiert auf dem Texture Widget, das für die Anzeige eines Bildes von der Kamera verantwortlich ist. Die Abmessungen werden vom übergeordneten AspectRatio festgelegt. AspectRatio das AspectRatio Widget, das die Größe des AspectRatio in einem bestimmten Seitenverhältnis bestimmt, ein guter Ansatz. Wir erhalten das Verhältnis vom Controller _controller.value.aspectRatio . Als Ergebnis erhalten wir in der Benutzeroberfläche ein Bild in der Benutzeroberfläche


App-Ansicht nach Controller-Initialisierung


3. Jetzt können wir ein Foto machen oder ein Video aufnehmen.
a. Wir machen ein Foto ( Funktionstext ) mit der Methode takePicture(String path) . Es macht ein Bild und speichert auf dem angegebenen Pfad.


 Future<void> _takePhoto(BuildContext context) async { ... await _controller.takePicture(filePath); ... } 

Um den Pfad abzurufen , benötigen wir das offizielle Plugin path_provider und die Methode getApplicationDocumentsDirectory , die ein privates Verzeichnis getApplicationDocumentsDirectory . Als nächstes bestimmen wir den Namen des Verzeichnisses, das wir probieren möchten, erstellen es gegebenenfalls und wählen den Dateinamen aus:


  final Directory extDir = await getApplicationDocumentsDirectory(); final String dirPath = '${extDir.path}/Pictures/flutter_camera'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${_getTimestamp()}.jpg'; 

Bevor Sie ein Bild aufnehmen, sollten Sie überprüfen, ob der Controller initialisiert ist und das Bild nicht mehr aufgenommen wird.


 if (!_controller.value.isInitialized) { return null; } ... if (_controller.value.isTakingPicture) { return null; } 

Das Bild wurde aufgenommen, wir haben einen Weg dorthin, es wäre schön zu sehen. Mit dem Standard- Image Widget, dem File Objekt und dem Dateipfad wird das Bild auf dem Bildschirm angezeigt.


 Image.file(File(filePath)) 

Abschluss des empfangenen Bildes


b. Für die Aufnahme von Videos ( Funktionstext ) benötigen wir zwei Funktionen: startVideoRecording(String filePath) und stopVideoRecording() .


 Future<void> _startVideoRecording() async { ... await _controller.startVideoRecording(filePath); ... } Future<void> _stopVideoRecording(BuildContext context) async { ... await _controller.stopVideoRecording(); ... } 

startVideoRecording schreibt ein Video und speichert es gemäß dem angegebenen Pfad (erhalten nach dem gleichen Prinzip wie bei einem Foto). stopVideoRecording beendet einfach den Aufnahmevorgang. Stellen Sie vor Beginn der Aufnahme sicher, dass die Aufnahme nicht mehr läuft.


 if (_controller.value.isRecordingVideo) { return null; } 

Als Ergebnis haben wir ein gespeichertes Video und einen Pfad dazu. Zum Abspielen benötigen Sie das Video_player- Plugin. Der gesamte Code für die Wiedergabe des Videos wird in einer separaten Datei gespeichert .


Aufnehmen und in der Benutzeroberfläche abspielen




Bildauswahl


1. Fügen Sie das Plugin gemäß den Anweisungen zu unserem Projekt hinzu


Zusätzliche Einstellungen für das Betriebssystem
iOS
Fügen Sie ios/Runner/Info.plist die folgenden Zeilen ios/Runner/Info.plist :


 <key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string> <key>NSPhotoLibraryUsageDescription</key> <string>Access to PhotoLibrary</string> 

Arbeit an Emulatoren
Unter iOS können wir die Kamera auf dem Emulator nicht überprüfen. Wir benötigen ein "Live" -Gerät.


2. Die image-picker verwendet eine Standardanwendung, um Fotos / Videos zu erstellen oder Dateien anzuzeigen. Um die gewünschte Anwendung zu starten, müssen Sie die Funktion pickImage für das Foto oder pickVideo und den pickVideo angeben.


 ... final File video = await ImagePicker.pickVideo(source: ImageSource.camera); final File photo = await ImagePicker.pickImage(source: ImageSource.gallery); //  pickImage        ,       ... 

Galerie und Kamera



Unsere Anwendung empfängt die ausgewählte Datei, aber wenn nichts ausgewählt wurde, wird null zurückgegeben. Für die Anzeige von Bildern und Videos verwenden wir die gleichen Ansätze wie beim camera Plugin. Für Bilder das Bild-Widget - dieses Mal müssen Sie es nicht in File , da wir ursprünglich ein Objekt dieses Typs erhalten haben.


 Image.file(photo) 

Für das Video-Plugin video_player . Der gesamte Code für die Wiedergabe des Videos wird in einer separaten Datei gespeichert .




Fazit


Wie Sie sehen, ist die image-picker spürbar einfacher zu verwenden und funktioniert hervorragend, wenn Sie nur ein Bild oder Video in eine Anwendung übertragen müssen. camera bietet uns auch alle erforderlichen Funktionen, um die Arbeit des Benutzers mit der Kamera in Ihrer Anwendung anzupassen.
Danke fürs Lesen!

Source: https://habr.com/ru/post/de443336/


All Articles