我正在尝试制作一款适用于 7 英寸及以上屏幕尺寸的平板电脑的移动应用程序。
应用程序在登录完成后启动时使用相机。
摄像机将录制视频并同时将摄像机显示在屏幕上,作为角落的小方框。
问题是当相机初始化时,即使没有开始录制视频,应用程序也会更改方向并显示一条消息“旋转以获得更好的视图”。这种情况发生在我用来测试应用程序的所有 android studio 平板电脑模拟器设备中。我还没有在真实设备上测试过这个!
代码:
我使用特定方向作为横向锁定应用程序以在应用程序启动时使用。
void main() async {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight])
.then((_) {
runApp(MyApp(prefs));
});
}
相机控制器对象的初始化,我还尝试在这里强制定向两次,但在开始使用相机时它仍然执行相同的行为来旋转屏幕:
void initState() {
super.initState();
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
WidgetsBinding.instance.addPostFrameCallback((_) async {
Timer(
const Duration(seconds: 1),
() async {
await _initCamera();
// await _recordVideo();
},
);
});
}
_initCamera() async {
final cameras = await availableCameras();
final CameraDescription camera = cameras
.where(
(camera) => camera.lensDirection == CameraLensDirection.front)
// ignore: sdk_version_since
.firstOrNull ??
cameras.first;
_cameraController = CameraController(
camera,
ResolutionPreset.max,
enableAudio: true,
);
await _cameraController!.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
await _cameraController!.lockCaptureOrientation(DeviceOrientation.landscapeRight);
_isLoading = false;
isCamera = true;
setState(() {});
}
对于相机预览小部件,即设备角落的小框:
Container(
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
color: isCamera
? isCameraRecording
? Colors.deepOrange
: Colors.black
: Colors.redAccent,
borderRadius: const BorderRadius.all(Radius.circular(10))),
child: isCamera && _cameraController != null
? CameraPreview(_cameraController!)
: null,
)
问题截图: 使用相机时旋转的 Android 平板电脑模拟器
我尝试了以下方法:
但不幸的是,它保持了自动旋转设备的一致行为。
之后我用手机模拟器测试了一下,问题不存在。
该问题与 flutter 无关,而是与所有 Android 平板模拟器有关。
我假设在真正的 Android 平板电脑上进行测试不会产生同样的问题。我将在真实设备平板电脑上测试后更新答案!