Parking

Program slika i salje sliku na server svake minute.

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:keep_screen_on/keep_screen_on.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final cameras = await availableCameras();
  runApp(MyApp(camera: cameras.first));
}

class MyApp extends StatelessWidget {
  final CameraDescription camera;

  const MyApp({Key? key, required this.camera}) : super(key: key);

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

class CameraScreen extends StatefulWidget {
  final CameraDescription camera;

  const CameraScreen({Key? key, required this.camera}) : super(key: key);

  @override
  CameraScreenState createState() => CameraScreenState();
}

class CameraScreenState extends State<CameraScreen> {
  late CameraController _controller;
  late Timer _timer;
  bool _isRunning = false;
  bool _isInitialized = false;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
    KeepScreenOn.turnOn(); //da ne ode u sleep mode
  }

  Future<void> _initializeCamera() async {
    // Request camera permission
    final status = await Permission.camera.request();
    if (status.isGranted) {
      _controller = CameraController(
        widget.camera,
        ResolutionPreset.medium,
      );

      try {
        await _controller.initialize();
        setState(() {
          _isInitialized = true;
        });
      } catch (e) {
        print('Error initializing camera: $e');
      }
    } else {
      print('Camera permission denied');
    }
  }

  void _toggleCapture() {
    setState(() {
      _isRunning = !_isRunning;
      if (_isRunning) {
        _startPeriodicCapture();
      } else {
        _timer.cancel();
      }
    });
  }

  void _startPeriodicCapture() {
    _timer = Timer.periodic(const Duration(seconds: 60), (timer) async {
      await _captureAndUpload();
    });
  }

  Future<void> _captureAndUpload() async {
    try {
      // Capture photo
      final XFile photo = await _controller.takePicture();

      // Prepare the file for upload
      final File imageFile = File(photo.path);
      final bytes = await imageFile.readAsBytes();

      // Upload to server
      final uri = Uri.parse('http://parking.gimnazija.net/api/store');
          final request = http.MultipartRequest('POST', uri)
        ..files.add(http.MultipartFile.fromBytes(
          'photo',
          bytes,
          filename: 'photo_${DateTime.now().millisecondsSinceEpoch}.jpg',
        ));

      final response = await request.send();
      if (response.statusCode == 200) {
        print('Photo uploaded successfully');
      } else {
        print('Failed to upload photo: ${response.statusCode}');
      }

      // Clean up temporary file
      await imageFile.delete();

    } catch (e) {
      print('Error capturing or uploading photo: $e');
    }
  }

  @override
  void dispose() {
    if (_isRunning) {
      _timer.cancel();
    }
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (!_isInitialized) {
      return const Scaffold(
        body: Center(
          child: CircularProgressIndicator(),
        ),
      );
    }

    return Scaffold(
      appBar: AppBar(
        title: const Text('Periodic Photo Upload'),
      ),
      body: Column(
        children: [
          Expanded(
            child: CameraPreview(_controller),
          ),
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text('Enable photo capture: '),
                Switch(
                  value: _isRunning,
                  onChanged: (value) => _toggleCapture(),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}