Как во Flutter сохранить изображение с камеры в папку типа DCIM?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как во Flutter сохранить изображение с камеры в папку типа DCIM?

Сообщение Anonymous »

Не в моей лиге, но я собрал основу приложения для камеры (на самом деле это сделал MS Copilot).
Редактирование: скриншот приложения в действии:
/>
Изображение

Последняя проблема – фотография сохранена там, где я хочу, например. «Внутреннее общее хранилище/DCIM/AppTestPhotos».
Непосредственно связанный код:
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.camera),
onPressed: () async {
final XFile photo = await controller.takePicture();
String filePath = photo.path;
print('File path from photo.path: $filePath');

await Gal.putImage(filePath);
print('Image saved at: $filePath');
},
),

Используя путь по умолчанию из XFile, путь к файлу указывается следующим образом:
/data/user/0/com.example.cam_test_2_one_screen/cache/CAP555419134659270816.jpg
...который отображается в папке «Внутреннее общее хранилище/Изображения» на телефоне. Я пытался изменить путь, чтобы он отображался во «Внутреннем общем хранилище/DCIM/AppTestPhotos», но безуспешно.
[img]https://i. stack.imgur.com/7Z49q.jpg[/img]

Есть мысли о том, как заставить это работать? Кажется, это так близко.
Поскольку он не слишком длинный, вот полный файл main.dart:
import 'dart:math';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
import 'package:gal/gal.dart';
import 'package:path/path.dart' as p;

List cameras = [];

void main() async {
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
runApp(const CameraApp());
}

class CameraApp extends StatelessWidget {
const CameraApp({super.key});

@override
Widget build(BuildContext context) {
return const MaterialApp(
home: CameraScreen(),
);
}
}

class CameraScreen extends StatefulWidget {
const CameraScreen({super.key});

@override
// ignore: library_private_types_in_public_api
_CameraScreenState createState() => _CameraScreenState();
}

class _CameraScreenState extends State {
late CameraController controller;
bool showFocusCircle = false;
double x = 0;
double y = 0;

@override
void initState() {
super.initState();
controller = CameraController(cameras[0], ResolutionPreset.medium);
controller.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
}

@override
Widget build(BuildContext context) {
if (!controller.value.isInitialized) {
return Container();
}
return Scaffold(
appBar: AppBar(title: const Text('Take a picture')),
body: GestureDetector(
onTapUp: (details) {
_onTap(details);
},
child: Stack(
children: [
Center(child: CameraPreview(controller)),
if (showFocusCircle)
Positioned(
top: y - 20,
left: x - 20,
child: Container(
height: 40,
width: 40,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: Colors.white, width: 1.5),
),
),
),
],
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.camera),
onPressed: () async {
final XFile photo = await controller.takePicture();
String filePath = photo.path;
print('File path from photo.path: $filePath');

await Gal.putImage(filePath);
print('Image saved at: $filePath');
},
),
// floatingActionButton: FloatingActionButton(
// child: const Icon(Icons.camera),
// onPressed: () async {
// final XFile photo = await controller.takePicture();
// final Directory? extDir = await getExternalStorageDirectory();
// if (extDir != null) {
// final String dirPath = '${extDir.path}/DCIM/AppTestPhotos';
// await Directory(dirPath).create(recursive: true);
// final String filePath = '$dirPath/${DateTime.now()}.jpg';
// await photo.saveTo(filePath);
// print('Picture saved at: $filePath');
// }
// },
// ),

// floatingActionButton: FloatingActionButton(
// child: const Icon(Icons.camera),
// onPressed: () async {
// final XFile photo = await controller.takePicture();
// final Directory? extDir = await getExternalStorageDirectory();
// if (extDir != null) {
// final String dirPath = '${extDir.path}/AppTestPhotos';
// await Directory(dirPath).create(recursive: true);
// final String filePath = '$dirPath/${DateTime.now()}.jpg';
// await photo.saveTo(filePath);
// print('Picture saved at: $filePath');
// }
// },
// ),

// floatingActionButton: FloatingActionButton(
// child: Icon(Icons.camera),
// onPressed: () async {
// final XFile photo = await controller.takePicture();
// print('Picture saved at: ${photo.path}');
// },
// ),
);
}

Future _onTap(TapUpDetails details) async {
if (controller.value.isInitialized) {
showFocusCircle = true;
x = details.localPosition.dx;
y = details.localPosition.dy;
double fullWidth = MediaQuery.of(context).size.width;
double cameraHeight = fullWidth * controller.value.aspectRatio;
double xp = x / fullWidth;
double yp = y / cameraHeight;
Offset point = Offset(xp, yp);
await controller.setFocusPoint(point);
setState(() {
Future.delayed(const Duration(seconds: 2)).whenComplete(() {
setState(() {
showFocusCircle = false;
});
});
});
}
}
}

Future _requestStoragePermission() async {
final status = await Permission.storage.request();
print('Permission status: $status');
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... -like-dcim
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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