Terepbejárás geometria hang és képi dokumentáció létrehozása. Gradle verzió frissítése
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
// lib/services/note_photo_service.dart
|
||||
//
|
||||
// Fotó kezelő service:
|
||||
// - Kamera / galéria hozzáférés (image_picker)
|
||||
// - Fájl mentés külső tárhelyre
|
||||
// - SQLite CRUD
|
||||
// - Opcionális Supabase Storage szinkron
|
||||
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import '../models/note_item_photo.dart';
|
||||
import '../services/app_database.dart';
|
||||
|
||||
class NotePhotoService extends GetxService {
|
||||
static NotePhotoService get to => Get.find();
|
||||
|
||||
final _picker = ImagePicker();
|
||||
String? _photoDir;
|
||||
|
||||
@override
|
||||
Future<void> onInit() async {
|
||||
super.onInit();
|
||||
await _initPhotoDir();
|
||||
}
|
||||
|
||||
Future<void> _initPhotoDir() async {
|
||||
final ext = await getExternalStorageDirectory();
|
||||
final dir = Directory(p.join(ext!.path, 'photos'));
|
||||
if (!await dir.exists()) await dir.create(recursive: true);
|
||||
_photoDir = dir.path;
|
||||
}
|
||||
|
||||
// ── Fotó készítése kamerával ─────────────────────────────────────
|
||||
|
||||
Future<NoteItemPhoto?> takePhoto(int noteItemId) async {
|
||||
return _pickAndSave(
|
||||
noteItemId: noteItemId,
|
||||
source: ImageSource.camera,
|
||||
);
|
||||
}
|
||||
|
||||
// ── Fotó választása galériából ───────────────────────────────────
|
||||
|
||||
Future<NoteItemPhoto?> pickFromGallery(int noteItemId) async {
|
||||
return _pickAndSave(
|
||||
noteItemId: noteItemId,
|
||||
source: ImageSource.gallery,
|
||||
);
|
||||
}
|
||||
|
||||
// ── Közös mentési logika ─────────────────────────────────────────
|
||||
|
||||
Future<NoteItemPhoto?> _pickAndSave({
|
||||
required int noteItemId,
|
||||
required ImageSource source,
|
||||
}) async {
|
||||
try {
|
||||
final picked = await _picker.pickImage(
|
||||
source: source,
|
||||
imageQuality: 85, // tömörítés a tárhelyért
|
||||
maxWidth: 2048,
|
||||
maxHeight: 2048,
|
||||
);
|
||||
if (picked == null) return null; // felhasználó visszalépett
|
||||
|
||||
// GPS pozíció a fotókészítés pillanatában
|
||||
final pos = await _currentPosition();
|
||||
|
||||
// Fájl másolása az app saját könyvtárába
|
||||
final fileName =
|
||||
'photo_${noteItemId}_${DateTime.now().millisecondsSinceEpoch}.jpg';
|
||||
final destPath = p.join(_photoDir!, fileName);
|
||||
await File(picked.path).copy(destPath);
|
||||
|
||||
// SQLite mentés
|
||||
final photo = NoteItemPhoto(
|
||||
noteItemId: noteItemId,
|
||||
localPath: destPath,
|
||||
latitude: pos?.latitude,
|
||||
longitude: pos?.longitude,
|
||||
createdAt: DateTime.now(),
|
||||
);
|
||||
|
||||
final id = await AppDatabase.instance.insertNotePhoto(photo);
|
||||
return NoteItemPhoto(
|
||||
id: id,
|
||||
noteItemId: photo.noteItemId,
|
||||
localPath: photo.localPath,
|
||||
latitude: photo.latitude,
|
||||
longitude: photo.longitude,
|
||||
createdAt: photo.createdAt,
|
||||
);
|
||||
} catch (e) {
|
||||
debugPrint('NotePhotoService hiba: $e');
|
||||
Get.snackbar('Hiba', 'Fotó mentése sikertelen.',
|
||||
snackPosition: SnackPosition.BOTTOM);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Fotó törlése ─────────────────────────────────────────────────
|
||||
|
||||
Future<void> deletePhoto(NoteItemPhoto photo) async {
|
||||
// Fájl törlése
|
||||
final file = File(photo.localPath);
|
||||
if (await file.exists()) await file.delete();
|
||||
|
||||
// SQLite törlése
|
||||
await AppDatabase.instance.deleteNotePhoto(photo.id!);
|
||||
}
|
||||
|
||||
// ── Felirat frissítése ────────────────────────────────────────────
|
||||
|
||||
Future<NoteItemPhoto> updateCaption(
|
||||
NoteItemPhoto photo, String caption) async {
|
||||
final updated = photo.copyWith(caption: caption);
|
||||
await AppDatabase.instance.updateNotePhoto(updated);
|
||||
return updated;
|
||||
}
|
||||
|
||||
// ── GPS pozíció ──────────────────────────────────────────────────
|
||||
|
||||
Future<Position?> _currentPosition() async {
|
||||
try {
|
||||
return await Geolocator.getCurrentPosition(
|
||||
locationSettings: const LocationSettings(
|
||||
accuracy: LocationAccuracy.medium,
|
||||
timeLimit: Duration(seconds: 3),
|
||||
),
|
||||
).timeout(const Duration(seconds: 3));
|
||||
} catch (_) {
|
||||
return Geolocator.getLastKnownPosition();
|
||||
}
|
||||
}
|
||||
|
||||
// ── Fotók betöltése ──────────────────────────────────────────────
|
||||
|
||||
Future<List<NoteItemPhoto>> loadPhotos(int noteItemId) =>
|
||||
AppDatabase.instance.listNotePhotos(noteItemId);
|
||||
}
|
||||
Reference in New Issue
Block a user