main.dart
1import 'package:flutter/foundation.dart'; 2import 'package:flutter/material.dart'; 3import 'dart:async'; 4import 'package:intl/intl.dart'; 5import 'package:intl/date_symbol_data_local.dart'; 6import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart'; 7import 'package:flutter_local_notifications/flutter_local_notifications.dart'; 8import 'package:just_audio/just_audio.dart'; 9import 'package:zettaialarm222/alarmpage.dart'; 10import 'package:flutter_local_notifications/flutter_local_notifications.dart'; 11 12bool alarm_runing = false; 13 14final player = AudioPlayer(); 15void main() async{ 16 final FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin(); 17 18 initializeDateFormatting('ja'); 19 WidgetsFlutterBinding.ensureInitialized(); 20 loadAudio(); 21 runApp(const MyApp()); 22} 23 24Future<void> loadAudio() async{ 25 await player.setAsset('assets/audio/alarm.mp3'); 26 debugPrint('音声ファイル読み込み完了'); 27} 28 29Future<void> playalarm() async{ 30 if(player.processingState == ProcessingState.completed) { 31 await loadAudio(); 32 } 33 await player.play(); 34} 35 36class MyApp extends StatefulWidget { 37 const MyApp({Key? key}) : super(key: key); 38 39 @override 40 _MyAppState createState() => _MyAppState(); 41} 42 43class _MyAppState extends State<MyApp> { 44 late DateTime nowTime; 45 late Timer timer; 46 late TimeOfDay selectedTime; 47 final FlutterLocalNotificationsPlugin flnp = FlutterLocalNotificationsPlugin(); 48 49 @override 50 void initState() { 51 super.initState(); 52 nowTime = DateTime.now(); 53 selectedTime = TimeOfDay.now(); 54 timer = Timer.periodic(const Duration(seconds: 1), _onTimer); 55 56 final AndroidInitializationSettings initializationSettingsAndroid = 57 AndroidInitializationSettings('logo'); 58 final InitializationSettings initializationSettings = 59 InitializationSettings(android: initializationSettingsAndroid); 60 flnp.initialize(initializationSettings); 61 } 62 63 void _onTimer(Timer timer) { 64 setState(() { 65 nowTime = DateTime.now(); 66 67 debugPrint('毎秒$alarm_runing'); 68 if (alarm_runing) { 69 debugPrint('アラーム作動中'); 70 } 71 }); 72 } 73 74 @override 75 void dispose() { 76 timer.cancel(); 77 super.dispose(); 78 } 79 80 @override 81 Widget build(BuildContext context) { 82 return MaterialApp( 83 title: 'zettaialarm', 84 theme: ThemeData( 85 appBarTheme: const AppBarTheme(color: Color.fromARGB(255, 0, 0, 0),) 86 ), 87 home: Home(nowTime: nowTime, selectedTime: selectedTime, onTimeSelected: _onTimeSelected), 88 ); 89 } 90 91 void _onTimeSelected(TimeOfDay time) { 92 setState(() { 93 selectedTime = time; 94 }); 95 96 final now = DateTime.now(); 97 final scheduledTime = DateTime(now.year, now.month, now.day, selectedTime.hour, selectedTime.minute); 98 final int id = DateTime.now().millisecondsSinceEpoch ~/ 1000; 99 100 AndroidAlarmManager.oneShotAt( 101 scheduledTime, 102 id, 103 onAlarm, 104 alarmClock: true, 105 allowWhileIdle: true, 106 wakeup: true, 107 exact: true, 108 ); 109 } 110} 111 112void onAlarm() async { 113 alarm_runing = true; 114 debugPrint('アラーム作動'); 115 await _showNotification(); 116 playalarm(); 117 debugPrint('作動直後$alarm_runing'); 118 119 120} 121 122Future<void> _showNotification() async { 123 debugPrint('通知'); 124 const AndroidNotificationDetails androidPlatformChannelSpecifics = 125 AndroidNotificationDetails( 126 'alarm_channel_id', 127 'alarm_channel_name', 128 importance: Importance.max, 129 priority: Priority.high, 130 channelShowBadge: true, 131 ); 132 const NotificationDetails platformChannelSpecifics = 133 NotificationDetails(android: androidPlatformChannelSpecifics); 134 135 // flutterLocalNotificationsPlugin の初期化 136 final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = 137 FlutterLocalNotificationsPlugin(); 138 139 await flutterLocalNotificationsPlugin.show( 140 0, // 通知ID 141 '通知', 142 'アラームが作動しました', 143 platformChannelSpecifics, 144 ); 145} 146 147class Home extends StatelessWidget { 148 final DateTime nowTime; 149 final TimeOfDay selectedTime; 150 final Function(TimeOfDay) onTimeSelected; 151 152 153 154 155 156 157 Home({required this.nowTime, required this.selectedTime, required this.onTimeSelected, Key? key}) : super(key: key); 158 159 @override 160 Widget build(BuildContext context) { 161 return Scaffold( 162 appBar: AppBar( 163 title: const Text( 164 '現在時刻', 165 style: TextStyle(color: Colors.white)) 166 ), 167 body: Center( 168 child: Column( 169 children: [ 170 Text( 171 DateFormat('HH:mm:ss').format(nowTime), 172 style: const TextStyle(fontSize: 50), 173 ), 174 Text( 175 '選択された時間: ${selectedTime.format(context)}', 176 style: const TextStyle(fontSize: 20), 177 ), 178 IconButton( 179 onPressed: () async { 180 final TimeOfDay? newTime = await showTimePicker( 181 context: context, 182 initialTime: selectedTime, 183 ); 184 if (newTime != null) { 185 onTimeSelected(newTime); 186 } 187 }, 188 icon: const Icon(Icons.alarm_add), 189 ), 190 ElevatedButton( 191 child: const Text('画面遷移(デバッグ)'), 192 onPressed: () { 193 Navigator.push( 194 context, 195 MaterialPageRoute(builder: (context) => const AlarmPage()), 196 ); 197 }, 198 ), 199 ], 200 ), 201 ), 202 ); 203 } 204}

0 コメント