Мое приложение не может сохранить записанное видео на Android 14.Android

Форум для тех, кто программирует под Android
Anonymous
Мое приложение не может сохранить записанное видео на Android 14.

Сообщение Anonymous »

Полная ссылка на проект: https://github.com/rdtmaster/camcam
Контекст: я разрабатываю приложение, которое позволяет пользователю выбирать камеру (переднюю/заднюю), выбирать фигуру (форму круга или прямоугольника), затем открывать предварительный просмотр камеры и рисовать нужную фигуру (форму) над ней, а также позволяя пользователю запускать/останавливать запись так, чтобы фигура не была видна в полученном видео. Однако я борюсь с сохранением записанной части видео. Вот несколько соответствующих фрагментов кода:

Код: Выделить всё

//lib/main.lib
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:android_intent_plus/android_intent.dart';
import 'package:android_intent_plus/flag.dart';

Future saveVideoToGallery(String videoPath) async {
final fileName = videoPath.split('/').last;
final videoFile = File(videoPath);

if (await Permission.manageExternalStorage.isGranted) {
try {
final mediaStoreUri = Uri.parse('content://media/external/video/media');
final intent = AndroidIntent(
action: 'android.intent.action.MEDIA_SCANNER_SCAN_FILE',
data: 'file://$videoPath',
);
await intent.launch();
} catch (e) {
print('Error while scanning media: $e');
}
} else {
print('Permission denied to manage external storage');
}
}
//...
class _CameraPreviewScreenState extends State {
late CameraController _controller;
late Future _initializeControllerFuture;
bool isRecording = false;
late String videoPath;

@override
void initState() {
super.initState();
_controller = CameraController(widget.camera, ResolutionPreset.high);
_initializeControllerFuture = _controller.initialize();
_requestPermissions();
}
Future _requestPermissions() async {
Map statuses = await [
Permission.camera,
Permission.microphone,
Permission.photos, // Request media access on Android 13+
Permission.videos, // For video media access on Android 13+
].request();

if (await Permission.camera.isPermanentlyDenied ||
await Permission.microphone.isPermanentlyDenied ||
await Permission.photos.isPermanentlyDenied ||
await Permission.videos.isPermanentlyDenied) {
await openAppSettings();
}
}

@override
void dispose() {
_controller.dispose();
super.dispose();
}

Future _toggleRecording() async {
try {
// Check if all required permissions are granted
bool hasPermissions = await Permission.camera.isGranted &&
await Permission.microphone.isGranted &&
(await Permission.storage.isGranted ||
await Permission.photos.isGranted);

if (!hasPermissions) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Please grant camera, microphone, and storage permissions')),
);
await _requestPermissions();
return;
}

if (isRecording) {
final file = await _controller.stopVideoRecording();
setState(() {
isRecording = false;
videoPath = file.path;
});
if (Platform.isAndroid) {
// Request Manage External Storage permission for Android 11 and above
await Permission.manageExternalStorage.request();
}

await saveVideoToGallery(videoPath);

} else {
final directory = await getTemporaryDirectory();  // Use temporary directory
final videoFile = '${directory.path}/${DateTime.now().millisecondsSinceEpoch}.mp4';
await _controller.startVideoRecording();
setState(() {
isRecording = true;
videoPath = videoFile;
});
}
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error during recording: $e')),
);
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _initializeControllerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Stack(
fit: StackFit.expand,
children: [
CameraPreview(_controller),
CustomPaint(
painter: FigurePainter(figureData: widget.figureData),
),
Positioned(
bottom: 20,
right: 20,
child: IconButton(
icon: Icon(
isRecording ? Icons.stop : Icons.videocam,
color: Colors.red,
size: 50,
),
onPressed: _toggleRecording,
),
),
],
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
),
);
}
}
//...
Как вы могли видеть, я делаю все возможное, чтобы запросить разрешения, но всякий раз, когда я нажимаю кнопку записи, отображается панель с информацией о предоставлении разрешений (и системный диалог Android не появляется). Разрешения камеры и микрофона запрашиваются при нажатии кнопки «Открыть», а также находятся в настройках приложения, однако никаких разрешений, связанных с файлами, нет, что также вызывает беспокойство.


Подробнее здесь: https://stackoverflow.com/questions/797 ... android-14

Вернуться в «Android»