Flutter相机功能插件camera_works的使用
Flutter相机功能插件camera_works的使用
Camera Works 是一个处理相机功能的简单库,重点在于稳定性。它是一个用于 Flutter 的相机插件,在 Android 上使用 CameraX,在 iOS 上使用原生 API,支持拍照、闪光灯和切换摄像头。
我制作了这个插件,因为官方的相机插件存在一些尚未解决的 BUG。
注意:目前该插件仅支持 Android 平台。此插件受到了官方 camera 插件的启发。
特性
- ✅ 切换前后摄像头
- ✅ 拍照
- ✅ 控制闪光灯
开始使用
在你的 pubspec.yaml
文件中添加 camera_works
作为依赖项。
dependencies:
camera_works: ^<最新版本>
Android
确保你在 android/app/build.gradle
文件中设置了一个 minSdkVersion
为 21 或更高版本,因为 CameraX 使用的 camera2 API 只支持 Android 5.0 或以上版本。
注意:你可以在一个设备模拟器(Android 11 或更高版本)或物理设备上运行示例。CameraX 在 Android 10 或更低版本的模拟器上无法工作。更多信息可以查看 这里。
示例代码
以下是使用 camera_works
插件的基本示例:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'camera_page.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 设置屏幕方向为竖屏
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
// 设置系统栏样式
final style = SystemUiOverlayStyle.light.copyWith(statusBarColor: Colors.transparent);
SystemChrome.setSystemUIOverlayStyle(style);
return MaterialApp(
home: CameraPage(), // 主页面为 CameraPage
);
}
}
CameraPage 示例代码
以下是 CameraPage
的详细实现代码:
import 'package:flutter/material.dart';
import 'package:camera_works/camera_works.dart';
class CameraPage extends StatefulWidget {
[@override](/user/override)
_CameraPageState createState() => _CameraPageState();
}
class _CameraPageState extends State<CameraPage> {
CameraController? _controller;
[@override](/user/override)
void initState() {
super.initState();
_initializeCamera();
}
Future<void> _initializeCamera() async {
final cameras = await availableCameras();
if (cameras.isNotEmpty) {
final firstCamera = cameras.first;
_controller = CameraController(
firstCamera,
ResolutionPreset.high,
);
await _controller!.initialize();
setState(() {});
}
}
[@override](/user/override)
void dispose() {
_controller?.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
if (_controller == null || !_controller!.value.isInitialized) {
return const Center(child: CircularProgressIndicator());
}
return Scaffold(
appBar: AppBar(title: Text('相机功能演示')),
body: CameraPreview(_controller!),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
FloatingActionButton(
onPressed: () async {
if (_controller != null && _controller!.value.isInitialized) {
final image = await _controller!.takePicture();
// 处理拍照后的图片
}
},
child: Icon(Icons.camera),
),
FloatingActionButton(
onPressed: () async {
if (_controller != null) {
await _controller!.setFlashMode(FlashMode.torch);
}
},
child: Icon(Icons.flash_on),
),
FloatingActionButton(
onPressed: () async {
if (_controller != null) {
await _controller!.setRotation(90);
await _controller!.flipCamera();
}
},
child: Icon(Icons.flip_camera_ios),
),
],
),
);
}
}
更多关于Flutter相机功能插件camera_works的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter相机功能插件camera_works的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用camera
插件(假设你提到的camera_works
是指官方的camera
插件)来实现相机功能的代码示例。
首先,确保你已经在pubspec.yaml
文件中添加了camera
插件的依赖:
dependencies:
flutter:
sdk: flutter
camera: ^0.14.0+1 # 请检查最新版本号并替换
然后,运行flutter pub get
来获取依赖。
接下来,你需要配置AndroidManifest.xml
和Info.plist
文件以请求相机权限。
Android配置(AndroidManifest.xml
)
确保你有以下权限请求:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 其他配置 -->
</manifest>
iOS配置(Info.plist
)
添加以下权限请求:
<key>NSCameraUsageDescription</key>
<string>需要访问相机</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风</string>
Flutter代码实现
接下来,在你的Flutter应用中实现相机功能。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
List<CameraDescription> cameras;
CameraController? controller;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CameraApp(),
);
}
}
class CameraApp extends StatefulWidget {
@override
_CameraAppState createState() => _CameraAppState();
}
class _CameraAppState extends State<CameraApp> {
CameraController? _controller;
@override
void initState() {
super.initState();
availableCameras().then((availableCameras) {
cameras = availableCameras;
if (cameras.isNotEmpty) {
_controller = CameraController(
cameras[0],
ResolutionPreset.medium,
);
_controller!.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
}
}).catchError((err) {
print('Error: ${err.code}\n${err.message}');
});
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (!_controller!.value.isInitialized) {
return Container();
}
return Scaffold(
appBar: AppBar(
title: Text('Camera Example'),
),
body: Center(
child: CameraPreview(_controller!),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.camera_alt),
onPressed: () async {
try {
final XFile? picture = await _controller!.takePicture();
if (mounted) {
setState(() {});
}
// 如果需要,可以在这里处理图片,例如保存到本地或显示预览
} catch (e) {
print(e);
}
},
),
);
}
}
解释
- 权限请求:在
AndroidManifest.xml
和Info.plist
中请求相机权限。 - 依赖添加:在
pubspec.yaml
中添加camera
插件依赖。 - 相机初始化:在
initState
方法中获取可用的相机列表,并初始化第一个相机。 - 相机预览:使用
CameraPreview
小部件显示相机预览。 - 拍照功能:通过
_controller!.takePicture()
方法拍照,并处理拍摄的图片。
这个示例展示了如何在Flutter应用中实现基本的相机功能。你可以根据需要进一步扩展,例如添加图片预览、保存到相册等功能。