인프런 커뮤니티 질문&답변

SC Y님의 프로필 이미지
SC Y

작성한 질문수

Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)

갤러리에서 사진 불러오기 (22.4.1 업데이트)

이미지 추가 버튼 누를 시 앱이 팅깁니다.

작성

·

725

0

안녕하세요.

아래의 코드를 적용한 뒤 이미지 추가 버튼을 클릭하면 앱이 아예 꺼집니다.

  //ImagePicker
  final ImagePicker _picker = ImagePicker();
  File? _imageFile; //갤러리 연동을 위해 사용


  Future<void> _getImage() async {
    //ImagePiker
    var image = await _picker.pickImage(source: ImageSource.gallery);

    setState(() {
      _imageFile = File(image!.path);
    });
  }
}

sdk 2.12, imagePicker 패키지는 0.8.4 버전이고 연결이 끊겼다는것 외에는 다른 오류는 출력되지 않습니다.

 

create_page.dart의 전체 코드입니다.

import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart'; //갤러리 또는 카메라 연동하는 패키지

class createPage extends StatefulWidget {
  const createPage({Key? key}) : super(key: key);

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

class _createPageState extends State<createPage> {
  //입력창을 위한 객체 생성
  final TextEditingController createText = TextEditingController();

  //ImagePicker
  final ImagePicker _picker = ImagePicker();
  File? _imageFile; //갤러리 연동을 위해 사용


  //dispose : 객체가 해제될 때 (더 이상 사용되지 않을때) 그 객체에 있던 메모리를 삭제, 자원 관리를 위해 사용
  //_createPageState가 제거될 때 호출됨
  @override
  void dispose() {
    // TODO: implement dispose
    createText.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: _buildAppbar(),

      body: _buildBody(), //메소드 생성해서 정의
      floatingActionButton: FloatingActionButton(
        //갤러리에서 이미지 가져오기 (image_picker 패키지 사용)
        onPressed: _getImage,
        backgroundColor: Colors.blue,
        child: Icon(Icons.add_a_photo),
      ),
    );
  }

  _buildAppbar() {
    return AppBar(
      //앱바 오른쪽에 아이콘 생성
      actions: [
        Icon(Icons.send),
      ],
    );
  }

  _buildBody() {
    return SingleChildScrollView( //스크롤 추가
      child: Column(
        children: [
          //이미지 출력 부분
          //이미지가 선택되지 않았을 때(null)는 텍스트 출력, 선택되었다면 선택된 이미지를 출력
          _imageFile == null ? Text("No Image") : Image.file(_imageFile!),

          //입력창 생성
          TextField(
            controller: createText,
            //텍스트필드의 스타일 설정
            decoration: InputDecoration(
              hintText: "내용을 입력하세요", //기본값
            ),
          )
        ],
      ),
    );
  }

  //갤러리 연동
  //이미지를 File로 만들어 줘야하기 때문에 비동기 처리 방식 사용?
  Future<void> _getImage() async {
    //ImagePiker
    var image = await _picker.pickImage(source: ImageSource.gallery);

    setState(() {
      _imageFile = File(image!.path);
    });
  }
}

 

_getImage 메소드의 문제일까요?

감사합니다.

답변 3

1

iOS 디바이스에서의 카메라 접근 권한 설정이 필요하기 때문입니다.

아마도  iOS에서 앱 접근권한을 엄격하게 하는 정책이 얼마 전에 추가되었기 때문인 것으로 보이네요.

 

ios/Runner/Info.plist 에 다음 내용을 추가합니다.

<key>NSCameraUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>
<key>NSMicrophoneUsageDescription</key>
<string>Used to capture audio for image picker plugin</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>

 

그러면 정상적으로 진행 가능합니다.

 

해당 내용은 다음 주소에서 확인하였습니다.

https://minwook-shin.github.io/flutter-use-image-picker/

감사합니다! 덕분에 해결했습니다 :)

0

SC Y님의 프로필 이미지
SC Y
질문자

이미지 추가 버튼을 누르면  바로 튕기고 Debug에서는 아래 한 줄만 출력됩니다

Lost connection to device.
오준석님의 프로필 이미지
오준석
지식공유자

디버깅 중에 무슨 이유에선가 연결이 해제된 것 같습니다. 

Lost connection to device 가 표시되면 디버깅이나 원인 파악이 어렵습니다.

PC 재부팅 등을 해 보셔서 로그가 나오도록 해야 합니다.

0

오준석님의 프로필 이미지
오준석
지식공유자

run 탭에 에러메시지를 봐야 원인을 알 수가 있습니다.

에러메시지 올려주세요

SC Y님의 프로필 이미지
SC Y

작성한 질문수

질문하기