рдХреИрдорд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рд╣рдо рд╕рднреА рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди рдореЗрдВ, рд╣рдо рджреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:
camera
рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХреИрдорд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреИрдорд░реЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ "рдЕрдиреБрдХреВрд▓рд┐рдд" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИредimage-picker
рдХреИрдорд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ File
(рдЫрд╡рд┐ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓) рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, image-picker
рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЙрдкрд▓рдмреНрдз рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐, рдХреИрдорд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЪрдпрдирд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдЖрдк рд╕реНрд░реЛрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдХреИрдорд░рд╛
1. рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝реЗрдВ
рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕
рдЖрдИрдУрдПрд╕
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ ios/Runner/Info.plist
:
<key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string>
рдПрдВрдбреНрд░реЙрдпрдб
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ android/app/build.gradle
21 рдореЗрдВ Android sdk рдХрд╛ рдиреНрдпреВрдирддрдо рд╕рдВрд╕реНрдХрд░рдгред
minSdkVersion 21
рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
рдЖрдИрдУрдПрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ , рд╣рдо рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХреИрдорд░реЗ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ "рд▓рд╛рдЗрд╡" рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдВрдбреНрд░реЙрдЗрдб рдПрдХ рдореЙрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рджреЗрдЦреЗрдВ), рдЬреЛ рдХреИрдорд░рд╛ рд▓реЗрдВрд╕ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓рддрд╛ рд╣реИред
рдорд╛рдирдХ рдкреНрд▓рдЧ рдпрджрд┐ рдЖрдк рдорд╛рдирдХ рдкреНрд▓рдЧ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВрдПрдореБрд▓реЗрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдЙрдиреНрдирдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рд░рд┐рдпрд░ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП VirtualScene
рд╕реЗрдЯ рдХрд░реЗрдВред

рд╣рдо рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдХреИрдорд░рд╛ рдЖрднрд╛рд╕реА рдХрдорд░реЗ рдХреЛ "рджрд┐рдЦрд╛рддрд╛ рд╣реИ", рдЬрд┐рд╕реЗ рдорд╛рдЙрд╕ рдФрд░ рдбреАрдПрд╕рдбреА рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЯрд┐рдк рдХреЗ рд▓рд┐рдП Tonn_Tamerlan рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
2. рд╣рдо рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╣рдо рд╕рднреА рдЙрдкрд▓рдмреНрдз рдХреИрдорд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ availableCameras
рд╣реИред
final cameras = await availableCameras();
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рдХреИрдорд░реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг ( List<CameraDescription>
) рдХрд╛ рдПрдХ рд╕рд░рдгреА List<CameraDescription>
, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдХреИрдорд░рд╛ рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ (рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдЯрд╛рдЗрдк (рдмреИрдХ, рдлреНрд░рдВрдЯ, рдПрдХреНрд╕рдЯрд░реНрдирд▓) рдФрд░ рд╡рд╣ рдХреЛрдг рдЬрд┐рд╕рд╕реЗ рдЖрдк рдлреЛрдЯреЛ рдХреЛ рдШреБрдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╣ рдЗрд╕рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рдЙрдирдХрд╛ рдЙрдиреНрдореБрдЦреАрдХрд░рдгред
рдХреИрдорд░реЗ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреИрдорд░рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдЬреИрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ CameraController
, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рдХреИрдорд░рд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди (рдХрдо, рдордзреНрдпрдо, рдЙрдЪреНрдЪ) рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
void _setCameraController(CameraDescription cameraDescription) async { _controller = CameraController(cameraDescription, ResolutionPreset.medium); ... await _controller.initialize(); ... if (mounted) { setState(() {}); } }
рдЕрдЧрд▓рд╛, рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╡рд┐рдЬреЗрдЯ "рдЬреАрд╡рд┐рдд" рд╣реИ, рд╣рдо рдЗрд╕ рд╡рд┐рдЬреЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред ( рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдХреНрд╕реНрдЯ )
рд╣рдо CameraPreview
рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рдпрдВрддреНрд░рдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ
AspectRatio( aspectRatio: _controller.value.aspectRatio, child: CameraPreview(_controller))
CameraPreview
рд╡рд┐рдЬреЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдХреИрдорд░реЗ рд╕реЗ рддрд╕реНрд╡реАрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЖрдпрд╛рдо рдорд╛рддрд╛-рдкрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд, рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдЪреНрдЪреЗ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЕрдЪреНрдЫрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рд╣рдореЗрдВ рдХрдВрдЯреНрд░реЛрд▓рд░ _controller.value.aspectRatio
рд╕реЗ рдЕрдиреБрдкрд╛рдд рдорд┐рд▓рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИ
рдирд┐рдпрдВрддреНрд░рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдРрдк рджреЗрдЦреЗрдВ 3. рдЕрдм рд╣рдо рдПрдХ рдлреЛрдЯреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╢реВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХред рд╣рдо takePicture(String path)
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлреЛрдЯреЛ ( рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдХреНрд╕реНрдЯ ) takePicture(String path)
ред рдпрд╣ рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдХреЗ рд╕рд╛рде рдмрдЪрд╛рддрд╛ рд╣реИред
Future<void> _takePhoto(BuildContext context) async { ... await _controller.takePicture(filePath); ... }
рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ path_provider рдкреНрд▓рдЧрдЗрди рдФрд░ рдЙрд╕рдХреЗ getApplicationDocumentsDirectory
рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдирд┐рдЬреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЕрдЧрд▓рд╛, рд╣рдо рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдмрдирд╛рдПрдВ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ:
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';
рдЪрд┐рддреНрд░ рд▓реЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдЖрд░рдВрднрд┐рдХ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░ рдЕрдм рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
if (!_controller.value.isInitialized) { return null; } ... if (_controller.value.isTakingPicture) { return null; }
рддрд╕реНрд╡реАрд░ рд▓реА рдЧрдИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдорд╛рдирдХ Image
рд╡рд┐рдЬреЗрдЯ, File
рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
Image.file(File(filePath))
рдкреНрд░рд╛рдкреНрдд рдЪрд┐рддреНрд░ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдЦред рд╡реАрдбрд┐рдпреЛ ( рдлрд╝рдВрдХреНрд╢рди рдкрд╛рда ) рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: startVideoRecording(String filePath)
рдФрд░ stopVideoRecording()
ред
Future<void> _startVideoRecording() async { ... await _controller.startVideoRecording(filePath); ... } Future<void> _stopVideoRecording(BuildContext context) async { ... await _controller.stopVideoRecording(); ... }
startVideoRecording
рдПрдХ рд╡реАрдбрд┐рдпреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ (рдлреЛрдЯреЛрдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд), stopVideoRecording
рдмрд╕ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╢реВрдЯрд┐рдВрдЧ рдЕрдм рдкреНрд░рдЧрддрд┐ рдкрд░ рдирд╣реАрдВ рд╣реИред
if (_controller.value.isRecordingVideo) { return null; }
рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдЗрд╕реЗ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ video_player рдкреНрд▓рдЧрдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХреЛрдб, рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдХрд╛рд▓реЗ рдЧрдПред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ
рдЫрд╡рд┐ рдкрд┐рдХрд░
1. рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝реЗрдВ
рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕
рдЖрдИрдУрдПрд╕
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ 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>
рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
IOS рдореЗрдВ, рд╣рдо рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХреИрдорд░реЗ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╣рдореЗрдВ "рд▓рд╛рдЗрд╡" рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

2. image-picker
рдлреЛрдЯреЛ / рд╡реАрдбрд┐рдпреЛ рдпрд╛ рдлрд╛рдЗрд▓ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рдВрдЫрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреЛрдЯреЛ рдпрд╛ pickVideo
рд▓рд┐рдП pickImage
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реНрд░реЛрдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
... final File video = await ImagePicker.pickVideo(source: ImageSource.camera); final File photo = await ImagePicker.pickImage(source: ImageSource.gallery);
рдЧреИрд▓рд░реА рдФрд░ рдХреИрдорд░рд╛ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдЪрдпрдирд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рддреЛ null
рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо camera
рдкреНрд▓рдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐ рд╡рд┐рдЬреЗрдЯ - рдЗрд╕ рдмрд╛рд░ рдЖрдкрдХреЛ рдЗрд╕реЗ File
рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╢реБрд░реВ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдорд┐рд▓реА рдереАред
Image.file(photo)
рд╡реАрдбрд┐рдпреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП video_player ред рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХреЛрдб, рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдХрд╛рд▓реЗ рдЧрдПред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, image-picker
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдПрдХ рдЫрд╡рд┐ рдпрд╛ рд╡реАрдбрд┐рдпреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред camera
рд╣рдореЗрдВ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреИрдорд░рд╛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рдо рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!