如何解决Flutter中的相机插件中的自拍相机崩溃
每当我尝试从项目中的let user_data = JSON.parse(sessionStorage.getItem('data'))
插件打开前置摄像头时,应用在Pixel 3XL上崩溃,但是该应用在后置摄像头上运行正常。
插件版本:camera
我的相机课。
camera: ^0.5.8+1
Flutter Doctor输出
class CameraState extends State<Camera> with WidgetsBindingObserver {
CameraController controller;
List<CameraDescription> cameras;
@override initState() {
super.initState();
getCameras();
}
void getCameras() async {
cameras = await availableCameras();
cameras.forEach((camera) {
if (camera.lensDirection == CameraLensDirection.front) {
onNewCameraSelected(camera);
}
});
}
/// Returns a suitable camera icon for [direction].
IconData getCameraLensIcon(CameraLensDirection direction) {
switch (direction) {
case CameraLensDirection.back:
return Icons.camera_rear;
case CameraLensDirection.front:
return Icons.camera_front;
case CameraLensDirection.external:
return Icons.camera;
}
throw ArgumentError('Unknown lens direction');
}
/// Display the preview from the camera (or a message if the preview is not available).
Widget _cameraPreviewWidget() {
if (controller == null || !controller.value.isInitialized) {
return new Center(
child: new Text(
allTranslations.text('camera_no'),style: TextStyle(
color: Colors.white,fontWeight: FontWeight.w600,fontFamily: fontMontserrat,fontStyle: FontStyle.normal,fontSize: 24.0),),);
} else {
final size = MediaQuery.of(context).size;
final deviceRatio = size.width / size.height;
return Transform.scale(
scale: controller.value.aspectRatio / deviceRatio,child: Center(
child: AspectRatio(
aspectRatio: controller.value.aspectRatio,child: CameraPreview(controller),);
}
}
String timestamp() => DateTime.now().millisecondsSinceEpoch.toString();
void onNewCameraSelected(CameraDescription cameraDescription) async {
if (controller != null) {
await controller.dispose();
}
controller = CameraController(cameraDescription,ResolutionPreset.medium,enableAudio: false);
controller.addListener(() {
if (mounted) setState(() {});
});
try {
///
/// APP CRASHES HERE.
///
await controller.initialize();
} on CameraException catch (e) {
print(e);
}
if (mounted) {
setState(() {});
}
}
void onTakePictureButtonPressed() {
takePicture().then((String filePath) {
if (filePath != null) {
// Navigate to other screen.
}
});
}
Future<String> takePicture() async {
if (!controller.value.isInitialized) {
return null;
}
final Directory extDir = await getApplicationDocumentsDirectory();
final String dirPath = '${extDir.path}/Pictures/flutter_test';
await Directory(dirPath).create(recursive: true);
final String filePath = '$dirPath/${timestamp()}.jpg';
if (controller.value.isTakingPicture) {
// A capture is already pending,do nothing.
return null;
}
try {
await controller.takePicture(filePath);
} on CameraException catch (e) {
return null;
}
return filePath;
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Positioned(
left: 0,top: 0,right: 0,bottom: 0,child: _cameraPreviewWidget(),Scaffold(
body: new Container(
color: Colors.transparent,child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,children: <Widget>[
new Text(allTranslations.text('licensescan_back'),textAlign: TextAlign.center,style: const TextStyle(
color: Colors.white,fontWeight: FontWeight.w400,fontFamily: fontSourceSansPro,fontStyle: FontStyle.normal,fontSize: 18.0
)
),Container(height: 10),Padding(
padding: new EdgeInsets.only(left: 40,right: 40),child: new Text(allTranslations.text('licensescan_positionback'),style: const TextStyle(
color: Colors.white,fontSize: 13.0
)
),Expanded(child: new Container()),new FlatButton(
onPressed: onTakePictureButtonPressed,child: new Container(
width: 54,height: 54,decoration: BoxDecoration(
borderRadius: BorderRadius.circular(27),border: Border.all(
color: Colors.white
),color: Colors.transparent
),child: Center(
child: new Container(
width: 45,height: 45,decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.5),color: Colors.white
),)
),new Container(height: 58)
],)
],);
}
}
崩溃日志
Doctor summary (to see all details,run flutter doctor -v):
[✓] Flutter (Channel stable,v1.17.1,on Mac OS X 10.15.1 19B88,locale en-GB)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.2.1)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.48.0)
[✓] Connected device (1 available)
• No issues found!
对此thread也尝试了几乎所有解决方案,但没有运气。
解决方法
我的相机拍照功能崩溃了。
"java.lang.NullPointerException: Attempt to invoke virtual method 'int io.flutter.embedding.engine.systemchannels.PlatformChannel$DeviceOrientation.ordinal()' 在空对象引用 E/AndroidRuntime(18591) 上: io.flutter.plugins.camera.DeviceOrientationManager.getMediaOrientation(DeviceOrientationManager.java:58)"
对我来说帮助添加 在 initialize() 之后等待 controller.lockCaptureOrientation()。 试试这个,也许对你有帮助
try {
///
/// APP CRASHES HERE.
///
await controller.initialize();
await controller.lockCaptureOrientation();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。