Flutter Camera插件takePicture方法在Android 12上无响应问题
Android 12下camera包takePicture()调用冻结无响应问题
原本运行正常的代码,升级到Android 12后出现冻结现象。代码使用camera: ^0.10.5依赖包,调用takePicture()异步方法时发生冻结,无报错信息也无返回结果。
已尝试升级Flutter版本及所有依赖包,也参考了camera依赖包的官方文档并套用新示例,但问题仍未解决。
相关代码
class TakePictureScreen extends StatefulWidget { TakePictureScreen({ Key? key, }) : super(key: key); final CameraDescription camera = getIt<CameraDescription>(); @override TakePictureScreenState createState() => TakePictureScreenState(); } class TakePictureScreenState extends State<TakePictureScreen> with WidgetsBindingObserver { late CameraController _controller; late Future<void> _initializeControllerFuture; void _initializeCameraController() { _controller = CameraController( widget.camera, ResolutionPreset.high, ); initializeControllerFuture = _controller.initialize(); } void initializeCameraController() { _controller = CameraController( widget.camera, ResolutionPreset.high, ); _initializeControllerFuture = _controller.initialize(); } @override void initState() { super.initState(); _initializeCameraController(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (!_controller.value.isInitialized) { return; } if (state == AppLifecycleState.inactive) { _controller.dispose(); } else if (state == AppLifecycleState.resumed) { _initializeCameraController(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Images')), body: FutureBuilder<void>( future: _initializeControllerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { // If the Future is complete, display the preview. return CameraPreview(_controller); } else { // Otherwise, display a loading indicator. return const Center(child: CircularProgressIndicator()); } }, ), // when you click floatingActionButton it takes picture floatingActionButton: FloatingActionButton( onPressed: () async { try { await _initializeControllerFuture; //final image = await _controller.takePicture(); final XFile image = await _controller.takePicture(); //image.saveTo("path"); // after taking picture, send it to custom preview screen context.push( Routes.checkinPreview, arguments: ScreenArguments({ "takenPicture": image.path }), ); } on CameraException catch (e) { context.snackbar(e.description ?? ""); context.snackbar(takePictureError); } on Exception catch (e) { context.snackbar(takePictureError); } }, child: const Icon(Icons.add_a_photo), ), ); } @override void dispose() { _controller.dispose(); super.dispose(); } }
内容的提问来源于stack exchange,提问作者devsefe
相关产品推荐
相关产品推荐

