본문으로 이동

플러터:마이크 입력

학교의 모든 지식. SMwiki
Sam (토론 | 기여)님의 2025년 11월 17일 (월) 03:02 판

틀:플러터 Dart:개요 플러터에 대한 지식 분류

  1. 플러터:개요
    1. 플러터:VSCode
    2. 플러터:안드로이드 스튜디오
  2. 플러터:실행
  3. 플러터:개념 잡기
    1. 플러터:화면 하나 만들기
    2. 플러터:변하는 화면(StatefulWidget)
    3. 플러터:화면 전환(화면 쌓기, 하단 네비게이션 바)
    4. 플러터:화면 전환(Drawer)
    5. 플러터:입력 관련
      1. 플러터:버튼
      2. 플러터:키보드 입력
      3. 플러터:슬라이더
    6. 플러터:그래프 그리기(fl chart)
    7. 플러터:데이터 저장(간단한 데이터)
    8. 플러터:인증(Firebase 인증)(미완)
    9. 플러터:인증(OAuth2)(미완)
  4. 권한 사용
    1. 플러터:마이크 입력
  5. 위젯
    1. 플러터:아이콘
    2. 플러터:레이아웃 계열 위젯
    3. 플러터:네비게이션 계열 위젯
    4. 플러터:버튼
    5. 플러터:상태관리(미완)
  6. 플러터:DB연결
    1. 플러터:Firebase(미완)
    2. 플러터:MySQL(미완)
  7. 디자인
    1. 플러터:테마
    2. 플러터:앱바
  8. 플러터:배포
    1. 플러터:배포(안드로이드)(미완)
  9. 플러터:참고자료
  10. 플러터:위젯
    1. 플러터:공간배치용 위젯
  11. 플러터:구글 AdMob(미완)
  12. 플러터:라이브러리
    1. 플러터:logger

개요

기기에서 마이크를 사용하는 법.

사전준비 권한 설정

권한 부여

항목 설명 비고
안드로이드 android/app/src/main/AndroidManifest.xml 에 넣는다.
  • 권한은 <application> 태그 밖, <manifest> 태그 안에 위치해야 함.
  • <uses-permission android:name="android.permission.RECORD_AUDIO"/>
아이폰 ios/Runner/Info.plist에 넣는다. <key>NSMicrophoneUsageDescription</key>

<string>앱에서 음성 입력을 사용합니다.</string>

Windows,

Web

별도 설정 불필요. 자동으로 팝업이 뜸.

필요한 패키지 점검

항목 설명 비고
패키지 설치 dependencies:

  flutter:

    sdk: flutter

permission_handler: ^11.0.0

noise_meter: ^5.0.2

noise_meter는 db를 읽는다.

아마 시간이 지나면 오래된 버전이라 문제가 발생할 수 있음. flutter pub get

데시벨 측정 예시 코드

마찬가지로 패키지 버전에 따라 함수명이 달라지기도 함. 오래되면 문제가 발생할 수 있음.

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:noise_meter/noise_meter.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  NoiseMeter? _noiseMeter;
  StreamSubscription<NoiseReading>? _subscription;
  double _decibel = 0;

  @override
  void initState() {
    super.initState();
    _initMicrophone();
  }

  Future<void> _initMicrophone() async {
    // 마이크 권한 요청
    if (await Permission.microphone.request().isGranted) {
      _noiseMeter = NoiseMeter(onError: (e) {
        print("Noise meter error: $e");
      });

      _subscription = _noiseMeter!.noiseStream.listen((noise) {
        setState(() {
          _decibel = noise.meanDecibel;
        });
      });

      _noiseMeter!.start();
    } else {
      print("마이크 권한 거부됨");
    }
  }

  @override
  void dispose() {
    _subscription?.cancel();
    _noiseMeter?.stop();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("데시벨 측정기")),
        body: Center(
          child: Text(
            "${_decibel.toStringAsFixed(1)} dB",
            style: const TextStyle(fontSize: 50),
          ),
        ),
      ),
    );
  }
}