본문으로 이동

플러터:마이크 입력: 두 판 사이의 차이

학교의 모든 지식. SMwiki
새 문서: {{플러터}} == 개요 == 기기에서 마이크를 사용하는 법. == 사전준비 권한 설정 == {| class="wikitable" |+ !항목 !설명 !비고 |- |안드로이드 |android/app/src/main/AndroidManifest.xml 에 넣는다. |<uses-permission android:name="android.permission.RECORD_AUDIO"/> |- |아이폰 |ios/Runner/Info.plist에 넣는다. |<key>NSMicrophoneUsageDescription</key> <string>앱에서 음성 입력을 사용합니다.</string> |- |패키지 설치 |dependenci...
 
잔글편집 요약 없음
5번째 줄: 5번째 줄:


== 사전준비 권한 설정 ==
== 사전준비 권한 설정 ==
=== 권한 부여 ===
{| class="wikitable"
{| class="wikitable"
|+
!항목
!항목
!설명
!설명
13번째 줄: 14번째 줄:
|안드로이드
|안드로이드
|android/app/src/main/AndroidManifest.xml 에 넣는다.
|android/app/src/main/AndroidManifest.xml 에 넣는다.
|<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
* 권한은 <code><application></code> 태그 밖, <code><manifest></code> 태그 안에 위치해야 함.
* <uses-permission android:name="android.permission.RECORD_AUDIO"/>
|-
|-
|아이폰
|아이폰
19번째 줄: 22번째 줄:
|<key>NSMicrophoneUsageDescription</key>
|<key>NSMicrophoneUsageDescription</key>
<string>앱에서 음성 입력을 사용합니다.</string>
<string>앱에서 음성 입력을 사용합니다.</string>
|-
|Windows,
Web
|별도 설정 불필요. 자동으로 팝업이 뜸.
|
|}
=== 필요한 패키지 점검 ===
{| class="wikitable"
!항목
!설명
!비고
|-
|-
|패키지 설치
|패키지 설치
27번째 줄: 42번째 줄:
    sdk: flutter
    sdk: flutter


  permission_handler: ^10.5.0
permission_handler: ^11.0.0


  noise_meter: ^1.1.0
noise_meter: ^5.0.2
|noise_meter는 db를 읽는다.
|noise_meter는 db를 읽는다.
아마 시간이 지나면 오래된 버전이라 문제가 발생할 수 있음.
flutter pub get
|}
|}


== 데시벨 측정 예시 코드 ==
== 데시벨 측정 예시 코드 ==
마찬가지로 패키지 버전에 따라 함수명이 달라지기도 함. 오래되면 문제가 발생할 수 있음.<syntaxhighlight lang="dart">import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:noise_meter/noise_meter.dart';
import 'package:noise_meter/noise_meter.dart';


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


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


  const MyApp({super.key});
  @override
 
  State<MyApp> createState() => _MyAppState();
  @override
 
  State<MyApp> createState() => _MyAppState();
 
}
}


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


  NoiseMeter? _noiseMeter;
  @override
 
  void initState() {
  StreamSubscription<NoiseReading>? _subscription;
    super.initState();
 
    _initMicrophone();
  double _decibel = 0;
  }
 
  @override
 
  void initState() {
 
    super.initState();
 
    _initMicrophone();
 
  }
 
  Future<void> _initMicrophone() async {
 
    // 권한 요청


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


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


        print("Noise meter error: $e");
      _noiseMeter!.start();
    } else {
      print("마이크 권한 거부됨");
    }
  }


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


      _subscription = _noiseMeter!.noiseStream.listen((noise) {
  @override
 
  Widget build(BuildContext context) {
        setState(() {
    return MaterialApp(
 
      home: Scaffold(
          _decibel = noise.meanDecibel;
        appBar: AppBar(title: const Text("데시벨 측정기")),
 
        body: Center(
        });
          child: Text(
 
            "${_decibel.toStringAsFixed(1)} dB",
      });
            style: const TextStyle(fontSize: 50),
 
          ),
      _noiseMeter!.start();
        ),
 
      ),
    } else {
    );
 
  }
      print("마이크 권한 거부됨");
}</syntaxhighlight>
 
    }
 
  }
 
  @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),
 
          ),
 
        ),
 
      ),
 
    );
 
  }
 
}

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),
          ),
        ),
      ),
    );
  }
}