<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꼬장</title>
    <link>https://ggojange.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 10 Mar 2026 03:51:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>꼬장e</managingEditor>
    <image>
      <title>꼬장</title>
      <url>https://t1.daumcdn.net/cfile/tistory/240A7B42528E7E430C</url>
      <link>https://ggojange.tistory.com</link>
    </image>
    <item>
      <title>[펌] Flutter 설치 및 개발 환경 구축하기 for Mac</title>
      <link>https://ggojange.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이번 글에서는&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앱 개발 프레임워크인&lt;span&gt;&amp;nbsp;&lt;/span&gt;Flutter&lt;span&gt;&amp;nbsp;&lt;/span&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;Android Studio,&lt;span&gt;&amp;nbsp;&lt;/span&gt;Xcode&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 설치하여 Android, iOS 앱 개발 환경을 구축하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Android Studio&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 구글이 만든 Android 앱 개발을 위한 공식 개발 도구입니다. Windows, macOS 등 다양한 OS에 설치가 가능합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Xcode는 애플이 만든 iOS 앱 개발을 위한 공식 개발 도구입니다. Xcode 는 macOS 에서만 동작하기 때문에 Windows 환경에서는 iOS 앱을 빌드하고 출시하기가 어렵습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 이유로 이 글은 Android, iOS 모두 출시가 가능한 macOS 환경을 기준으로 진행합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 를 사용하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 시리즈 글은 Flutter 기반으로 앱 개발을 진행합니다. Flutter는 Google이 만든 앱 개발 프레임워크로 한 번의 코드 작성으로 iOS, Android, 웹, 데스크탑 앱까지 만들 수 있기 때문에 개발 효율이 높습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;macOS 터미널 환경 세팅(생략 가능)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;macOS 에서 제공하는 기본 터미널을 사용할 수 있지만, 더 보기 좋고 편하게 이용하기 위해서 터미널 환경을 추가로 설정해줄 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;터미널 환경 세팅은 필수가 아니므로 생략 가능하며, 원하는 경우에 한해 아래 링크를 참고하여 진행해주세요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://daco2020.tistory.com/756&quot;&gt;macOS 터미널 환경 세팅 한 번에 끝내기&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;1. Homebrew 설치&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*이미&lt;span&gt;&amp;nbsp;&lt;/span&gt;Homebrew&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 설치 했다면 이 과정을 생략해주세요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Homebrew&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 Mac용 패키지 관리 도구입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개발에 필요한 다양한 패키지를 설치하기 위해 가장 먼저 설치합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인 Mac의 터미널을 열고 아래 명령어를 입력하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;Homebrew&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;2. Flutter 설치&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 터미널을 열고 아래&lt;span&gt;&amp;nbsp;&lt;/span&gt;brew&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 통해 Flutter 를 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;brew install flutter&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Flutter 를 성공적으로 설치 했다면 doctor 명령어를 통해 현재 Flutter 개발환경 상태를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;flutter doctor&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아직 Android Studio 와 Xcode 를 설치하지 않았기에 관련 부분에 [x] 표시가 되어있을 겁니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;3. Android Studio 설치&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;터미널에서 brew 명령어를 통해 Android Studio 를 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;brew install --cask android-studio&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Android Studio 를 성공적으로 설치 했다면 실행을 해줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Install Type 에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Standard&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;Next&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4eYyq/dJMcafyS5JD/CYFNduksgwpeYk0tP0OZF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4eYyq/dJMcafyS5JD/CYFNduksgwpeYk0tP0OZF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4eYyq/dJMcafyS5JD/CYFNduksgwpeYk0tP0OZF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4eYyq%2FdJMcafyS5JD%2FCYFNduksgwpeYk0tP0OZF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1584&quot; height=&quot;1129&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;License Agreement 화면에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;android-sdk-license&lt;span&gt;&amp;nbsp;&lt;/span&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;android-sdk-arm-dbt-license&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 선택하여 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;Accept&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;Finish&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgjM4C/dJMcafyS5JE/KnLdXUD7yCWjh2hYaDavFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgjM4C/dJMcafyS5JE/KnLdXUD7yCWjh2hYaDavFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgjM4C/dJMcafyS5JE/KnLdXUD7yCWjh2hYaDavFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgjM4C%2FdJMcafyS5JE%2FKnLdXUD7yCWjh2hYaDavFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1588&quot; height=&quot;1131&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Android Studio 설치가 완료되면 아래와 같은 화면이 나타납니다. More Actions&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 누르고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;SDK Manager&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 선택해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RDs60/dJMcafMqBCq/udLMrorJtpqSB0E7NK2hjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RDs60/dJMcafMqBCq/udLMrorJtpqSB0E7NK2hjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RDs60/dJMcafMqBCq/udLMrorJtpqSB0E7NK2hjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRDs60%2FdJMcafMqBCq%2FudLMrorJtpqSB0E7NK2hjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1580&quot; height=&quot;1226&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SDK Tools&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭을 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;Android SDK Command-line Tools (latest)&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 체크하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;OK&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 눌러주세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1uzH7/dJMcafMqBCr/9zagu3o0ADRZM0PutRKzz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1uzH7/dJMcafMqBCr/9zagu3o0ADRZM0PutRKzz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1uzH7/dJMcafMqBCr/9zagu3o0ADRZM0PutRKzz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1uzH7%2FdJMcafMqBCr%2F9zagu3o0ADRZM0PutRKzz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1944&quot; height=&quot;1373&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;License Agreement 화면에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;Accept&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;Next&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 눌러 설치를 진행합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;설치가 완료되었다면 터미널로 다시 돌아가 아래 명령어를 입력해줍니다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;flutter doctor --android-licenses&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다시 flutter doctor 명령어를 입력하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;Android toolchain&lt;span&gt;&amp;nbsp;&lt;/span&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;Android Studio&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목이 [v] 상태로 바뀌었는지 확인합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;4. Xcode 설치&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Xcode 를 설치하기 전에 현재 macOS 를 최신 버전으로 업데이트 할 것을 권장합니다. 만약 macOS 와 Xcode 가 구버전일 경우 iOS 앱 빌드가 정상적으로 되지 않을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;App Store&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 열고 Xcode 를 검색하여 다운로드 및 설치합니다. 이때 platform 선택화면에서 iOS 를 선택해야 iOS Simulator를 사용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 iOS를 선택하지 않고 설치했다면, 추후 Xcode - [Settings] - [Components] 탭에서 추가할 수 있습니다. (아래 이미지 참고)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk0JLT/dJMcag5CR5T/1S6JdfvrlC3I7FK1wRv5M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk0JLT/dJMcag5CR5T/1S6JdfvrlC3I7FK1wRv5M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk0JLT/dJMcag5CR5T/1S6JdfvrlC3I7FK1wRv5M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk0JLT%2FdJMcag5CR5T%2F1S6JdfvrlC3I7FK1wRv5M1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1639&quot; height=&quot;1040&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Xcode 를 성공적으로 설치했다면 다음으로 아래 명령어를 통해 cocoapods 을 설치하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*cocoapods 은 iOS와 macOS 애플리케이션 개발을 위한 의존성 관리 도구입니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;brew install cocoapods&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;cocoapods 까지 설치를 완료했다면 다시 flutter doctor 명령어를 실행해 Flutter 개발 환경을 최종 점검합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ej8UT6/dJMcabJ1Ty0/sVOqqDtKFGSoJrmHiRq21K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ej8UT6/dJMcabJ1Ty0/sVOqqDtKFGSoJrmHiRq21K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ej8UT6/dJMcabJ1Ty0/sVOqqDtKFGSoJrmHiRq21K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fej8UT6%2FdJMcabJ1Ty0%2FsVOqqDtKFGSoJrmHiRq21K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1244&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 모두 [v] 표시로 확인되면다면 Flutter 개발 환경을 성공적으로 구축한 것입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 아직 [x] 표시인 항목이 있다면 안내 메시지에 따라 해당 항목을 설치 또는 명령어를 입력하여 문제를 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://daco2020.tistory.com/898&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://daco2020.tistory.com/898&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771808851966&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Flutter 설치 및 개발 환경 구축하기 for Mac&quot; data-og-description=&quot;이번 글에서는앱 개발 프레임워크인 Flutter 와 Android Studio, Xcode 를 설치하여 Android, iOS 앱 개발 환경을 구축하겠습니다. Android Studio 는 구글이 만든 Android 앱 개발을 위한 공식 개발 도구입니다. Win&quot; data-og-host=&quot;daco2020.tistory.com&quot; data-og-source-url=&quot;https://daco2020.tistory.com/898&quot; data-og-url=&quot;https://daco2020.tistory.com/898&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AoSDP/dJMb8TB6qhb/MPfGkuAdyfsK043lkEn6xk/img.png?width=800&amp;amp;height=570&amp;amp;face=0_0_800_570,https://scrap.kakaocdn.net/dn/uTpak/dJMb83kpLac/bNyXW9YAk2Mq0WBQ7mp0jk/img.png?width=800&amp;amp;height=570&amp;amp;face=0_0_800_570,https://scrap.kakaocdn.net/dn/uKQNi/dJMb82MzUww/S9uascfO17hS6hsJ46vuy1/img.png?width=1944&amp;amp;height=1373&amp;amp;face=0_0_1944_1373&quot;&gt;&lt;a href=&quot;https://daco2020.tistory.com/898&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://daco2020.tistory.com/898&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AoSDP/dJMb8TB6qhb/MPfGkuAdyfsK043lkEn6xk/img.png?width=800&amp;amp;height=570&amp;amp;face=0_0_800_570,https://scrap.kakaocdn.net/dn/uTpak/dJMb83kpLac/bNyXW9YAk2Mq0WBQ7mp0jk/img.png?width=800&amp;amp;height=570&amp;amp;face=0_0_800_570,https://scrap.kakaocdn.net/dn/uKQNi/dJMb82MzUww/S9uascfO17hS6hsJ46vuy1/img.png?width=1944&amp;amp;height=1373&amp;amp;face=0_0_1944_1373');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Flutter 설치 및 개발 환경 구축하기 for Mac&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는앱 개발 프레임워크인 Flutter 와 Android Studio, Xcode 를 설치하여 Android, iOS 앱 개발 환경을 구축하겠습니다. Android Studio 는 구글이 만든 Android 앱 개발을 위한 공식 개발 도구입니다. Win&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;daco2020.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/167</guid>
      <comments>https://ggojange.tistory.com/167#entry167comment</comments>
      <pubDate>Mon, 23 Feb 2026 10:08:26 +0900</pubDate>
    </item>
    <item>
      <title>[Hyper-V] 윈도우 해상도 자유롭게 변경</title>
      <link>https://ggojange.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;가상머신 종료후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows PowerShell 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set-VMVideo -VMName &quot;매니저에서 VM 이름&quot; -HorizontalResolution 2560 -VerticalResolution 1440 -ResolutionType Single&lt;/p&gt;</description>
      <category>OS</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/166</guid>
      <comments>https://ggojange.tistory.com/166#entry166comment</comments>
      <pubDate>Sat, 29 Nov 2025 15:03:44 +0900</pubDate>
    </item>
    <item>
      <title>[vmware]vmware workstation 17 부팅시 가상OS 자동실행</title>
      <link>https://ggojange.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File -&amp;gt; Configure VM Power Actions 접근 자동실행 하고자 하는 OS 체크&lt;/p&gt;</description>
      <category>기타(IT)</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/165</guid>
      <comments>https://ggojange.tistory.com/165#entry165comment</comments>
      <pubDate>Wed, 12 Nov 2025 16:39:28 +0900</pubDate>
    </item>
    <item>
      <title>[펌] CentOS 7.9 Yum 리포지토리 설정 변경 방법 (EOL 문제 해결)</title>
      <link>https://ggojange.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CentOS 7.9에서 yum install 명령어를 실행시 오류 발생 하는건 EOL 상태이기 때문에 발생하는 문제로, 기본 미러 사이트에서 더 이상 패키지를 제공하지 않기 때문입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조치방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;리포지토리&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;열기&lt;/b&gt; &lt;br /&gt;#&amp;nbsp;vi&amp;nbsp;/etc/yum.repos.d/CentOS-Base.repo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. mirrorlist 주석 처리 및 baseurl 에 주소 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[base], [updates], [extras], [centosplus] 등 여러 섹션에서 mirrorlist를 주석 처리하고, baseurl 주소중 &lt;b&gt;mirrorlist.centos.org&lt;/b&gt; 를 &lt;b&gt;vault.centos.org&lt;/b&gt;로 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[base] &lt;br /&gt;name=CentOS-$releasever&amp;nbsp;-&amp;nbsp;Base &lt;br /&gt;#mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=os&amp;amp;infra=$infra&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=os&amp;amp;infra=$infra&lt;/a&gt;&lt;br /&gt;baseurl=&lt;a href=&quot;http://vault.centos.org/centos/$releasever/os/$basearch/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://vault.centos.org/centos/$releasever/os/$basearch/&lt;/a&gt;&lt;br /&gt;gpgcheck=1 &lt;br /&gt;&lt;br /&gt;#released&amp;nbsp;updates &lt;br /&gt;[updates] &lt;br /&gt;name=CentOS-$releasever&amp;nbsp;-&amp;nbsp;Updates &lt;br /&gt;#mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=updates&amp;amp;infra=$infra&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=updates&amp;amp;infra=$infra&lt;/a&gt;&lt;br /&gt;baseurl=&lt;a href=&quot;http://vault.centos.org/centos/$releasever/updates/$basearch/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://vault.centos.org/centos/$releasever/updates/$basearch/&lt;/a&gt;&lt;br /&gt;gpgcheck=1 &lt;br /&gt;&lt;br /&gt;#additional&amp;nbsp;packages&amp;nbsp;that&amp;nbsp;may&amp;nbsp;be&amp;nbsp;useful &lt;br /&gt;[extras] &lt;br /&gt;name=CentOS-$releasever&amp;nbsp;-&amp;nbsp;Extras &lt;br /&gt;#mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=extras&amp;amp;infra=$infra&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=extras&amp;amp;infra=$infra&lt;/a&gt;&lt;br /&gt;baseurl=&lt;a href=&quot;http://vault.centos.org/centos/$releasever/extras/$basearch/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://vault.centos.org/centos/$releasever/extras/$basearch/&lt;/a&gt;&lt;br /&gt;gpgcheck=1 &lt;br /&gt;&lt;br /&gt;#additional&amp;nbsp;packages&amp;nbsp;that&amp;nbsp;extend&amp;nbsp;functionality&amp;nbsp;of&amp;nbsp;existing&amp;nbsp;packages &lt;br /&gt;[centosplus] &lt;br /&gt;name=CentOS-$releasever&amp;nbsp;-&amp;nbsp;Plus &lt;br /&gt;#mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=centosplus&amp;amp;infra=$infra&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=centosplus&amp;amp;infra=$infra&lt;/a&gt;&lt;br /&gt;baseurl=&lt;a href=&quot;http://vault.centos.org/centos/$releasever/centosplus/$basearch/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://vault.centos.org/centos/$releasever/centosplus/$basearch/&lt;/a&gt;&lt;br /&gt;gpgcheck=1 &lt;br /&gt;enabled=0&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;&lt;b&gt;yum&amp;nbsp;install&amp;nbsp;epel-release&lt;/b&gt; &lt;br /&gt;명령어를&amp;nbsp;실행하면&amp;nbsp;vault.centos.org에서&amp;nbsp;패키지를&amp;nbsp;정상적으로&amp;nbsp;가져와&amp;nbsp;설치할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처] &lt;a href=&quot;https://samso.tistory.com/entry/Linux-CentOS7-Yum-리포지토리-설정-변경&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://samso.tistory.com/entry/Linux-CentOS7-Yum-리포지토리-설정-변경&lt;/a&gt;&amp;nbsp;[삼소의&amp;nbsp;삼삼한&amp;nbsp;메모장:티스토리]&lt;/p&gt;</description>
      <category>OS</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/164</guid>
      <comments>https://ggojange.tistory.com/164#entry164comment</comments>
      <pubDate>Tue, 14 Oct 2025 17:46:04 +0900</pubDate>
    </item>
    <item>
      <title>[CentOS7] yum php7 설치</title>
      <link>https://ggojange.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;CentOS 7에 yum을 이용해 php를 설치하면 5.4.x 버전이 설치가 된다&lt;br /&gt;PHP 7.x 버전을 설치하는 방법은 아래와 같다. &lt;br /&gt;&lt;br /&gt;1. 기존버전 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; [root@localhost ~]# yum&amp;nbsp;remove&amp;nbsp;php-*&lt;br /&gt;&lt;br /&gt;2. EPEL&amp;nbsp;설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; EPEL(Extra&amp;nbsp;Packages&amp;nbsp;for&amp;nbsp;Enterprise&amp;nbsp;Linux):&amp;nbsp;최신버전&amp;nbsp;패키지를&amp;nbsp;제공하는&amp;nbsp;저장소 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; [root@localhost ~]# yum install epel-release # 최신버전 패키지 저장소 &lt;br /&gt;&amp;nbsp; [root@localhost ~]#&amp;nbsp; yum install yum-utils&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# yum-config-manager 명령어 사용 가능, yum 저장소 관리를 위해 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; [root@localhost ~]# yum&amp;nbsp;-y&amp;nbsp;install&amp;nbsp;http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3. 원하는&amp;nbsp;버전&amp;nbsp;php&amp;nbsp;활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; [root@localhost ~]# yum-config-manager&amp;nbsp;--enable&amp;nbsp;remi-php74&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; yum-confog-manager는 yum-utils 를 설치할 때 함께 설치되는 프로그램 중 하나이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; PHP 7.1 이나 7.2를 설치하고 싶을 경우, remi-php70 대신 remi-php71 or remi-php72를 활성화한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4. PHP 7설치 필수 모듈을 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; [root@localhost ~]# yum -y install php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; [root@localhost ~]# yum install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 기타 php 서비스 설치 &lt;br /&gt;&amp;nbsp; yum -y install php-fpm &lt;br /&gt;&amp;nbsp; yum -y install&amp;nbsp;&amp;nbsp;php-cli&amp;nbsp;&amp;nbsp;php-redis&amp;nbsp;&amp;nbsp;php-brotli php-intl php-gd php-gmp php-imap php-bcmath php-interbase php-json php-mbstring php-mysqlnd php-odbc php-opcache php-memcached php-tidy php-pdo php-pdo-dblib php-pear php-pgsql php-process php-pecl-apcu php-pecl-geoip php-pecl-imagick php-pecl-hrtime php-pecl-json php-pecl-memcache php-pecl-mongodb php-pecl-rar php-pecl-pq php-pecl-redis4 php-pecl-yaml php-pecl-zip&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;6. 설치 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; [root@localhost ~]# php-v &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/163</guid>
      <comments>https://ggojange.tistory.com/163#entry163comment</comments>
      <pubDate>Wed, 10 Apr 2024 14:36:51 +0900</pubDate>
    </item>
    <item>
      <title>미디어 알람권한 분기처리 (Android 13 / Android 12)</title>
      <link>https://ggojange.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://velog.io/@plashdof/%EC%95%8C%EB%9E%8C%EA%B6%8C%ED%95%9C-%EB%B6%84%EA%B8%B0%EC%B2%98%EB%A6%AC-Android-13-Android-12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@plashdof/%EC%95%8C%EB%9E%8C%EA%B6%8C%ED%95%9C-%EB%B6%84%EA%B8%B0%EC%B2%98%EB%A6%AC-Android-13-Android-12&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;targetSdkVersion&amp;nbsp;33&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manifest 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;uses-permission&amp;nbsp;android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;lt;uses-permission&amp;nbsp;android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;lt;uses-permission&amp;nbsp;android:name=&quot;android.permission.POST_NOTIFICATIONS&quot;/&amp;gt; &lt;br /&gt;&amp;lt;uses-permission&amp;nbsp;android:name=&quot;android.permission.READ_MEDIA_IMAGES&quot;/&amp;gt; &lt;br /&gt;&amp;lt;uses-permission&amp;nbsp;android:name=&quot;android.permission.READ_MEDIA_VIDEO&quot;/&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;uses-permission&amp;nbsp;android:name=&quot;co&lt;a href=&quot;http://m.google.android.gms.permission.AD_ID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;m.google.android.gms.permission.AD_ID&lt;/a&gt;&quot;/&amp;gt; // 광고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private&amp;nbsp;val&amp;nbsp;requiredPermissionList&amp;nbsp;=&amp;nbsp;if(Build.VERSION.SDK_INT&amp;nbsp;&amp;gt;=&amp;nbsp;Build.VERSION_CODES.TIRAMISU){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrayOf(&amp;nbsp;&amp;nbsp;//&amp;nbsp;안드로이드&amp;nbsp;13&amp;nbsp;이상&amp;nbsp;필요한&amp;nbsp;권한들 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.READ_EXTERNAL_STORAGE, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.WRITE_EXTERNAL_STORAGE, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.READ_MEDIA_IMAGES, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.READ_MEDIA_VIDEO, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.POST_NOTIFICATIONS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;}else&amp;nbsp;if&amp;nbsp;(&amp;nbsp;Build.VERSION.SDK_INT&amp;nbsp;&amp;lt;&amp;nbsp;Build.VERSION_CODES.TIRAMISU&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;Build.VERSION.SDK_INT&amp;nbsp;&amp;gt;=&amp;nbsp;Build.VERSION_CODES.M)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrayOf(&amp;nbsp;&amp;nbsp;// 안드로이드 13 미만 마시멜로우 이상 필요한 권한들 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.READ_EXTERNAL_STORAGE, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manifest.permission.WRITE_EXTERNAL_STORAGE &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp;권한&amp;nbsp;체크&amp;nbsp;이후로직 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;onRequestPermissionsResult(int&amp;nbsp;requestCode,&amp;nbsp;@NonNull&amp;nbsp;String[]&amp;nbsp;permissions,&amp;nbsp;@NonNull&amp;nbsp;int[]&amp;nbsp;grandResults)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;READ_PHONE_STATE의&amp;nbsp;권한&amp;nbsp;체크&amp;nbsp;결과를&amp;nbsp;불러온다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(requestCode&amp;nbsp;==&amp;nbsp;1001)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(Build.VERSION.SDK_INT&amp;nbsp;&amp;lt;&amp;nbsp;Build.VERSION_CODES.TIRAMISU)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;check_result&amp;nbsp;=&amp;nbsp;true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;모든&amp;nbsp;퍼미션을&amp;nbsp;허용했는지&amp;nbsp;체크 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;result&amp;nbsp;:&amp;nbsp;grandResults)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(result&amp;nbsp;!=&amp;nbsp;PackageManager.PERMISSION_GRANTED)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;check_result&amp;nbsp;=&amp;nbsp;false; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;권한&amp;nbsp;체크에&amp;nbsp;동의를&amp;nbsp;하지&amp;nbsp;않으면&amp;nbsp;안드로이드&amp;nbsp;종료 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(check_result&amp;nbsp;==&amp;nbsp;true)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finish(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;</description>
      <category>Android</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/161</guid>
      <comments>https://ggojange.tistory.com/161#entry161comment</comments>
      <pubDate>Wed, 11 Oct 2023 16:59:17 +0900</pubDate>
    </item>
    <item>
      <title>Lint found fatal errors while assembling a release target. 임시 해결</title>
      <link>https://ggojange.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle&amp;nbsp;파일에&amp;nbsp;아래의&amp;nbsp;옵션을&amp;nbsp;추가한다. &lt;br /&gt;&lt;br /&gt;android&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lintOptions&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkReleaseBuilds&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Or,&amp;nbsp;if&amp;nbsp;you&amp;nbsp;prefer,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;continue&amp;nbsp;to&amp;nbsp;check&amp;nbsp;for&amp;nbsp;errors&amp;nbsp;in&amp;nbsp;release&amp;nbsp;builds, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;but&amp;nbsp;continue&amp;nbsp;the&amp;nbsp;build&amp;nbsp;even&amp;nbsp;when&amp;nbsp;errors&amp;nbsp;are&amp;nbsp;found: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abortOnError&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;</description>
      <category>Android</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/160</guid>
      <comments>https://ggojange.tistory.com/160#entry160comment</comments>
      <pubDate>Wed, 11 Oct 2023 16:49:46 +0900</pubDate>
    </item>
    <item>
      <title>[윈도우] 자동업데이트 실패시</title>
      <link>https://ggojange.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한 CMD 에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dism.exe /online /cleanup-image /restorehealth 명령어 시도&lt;/p&gt;</description>
      <category>OS</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/159</guid>
      <comments>https://ggojange.tistory.com/159#entry159comment</comments>
      <pubDate>Sun, 24 Sep 2023 09:24:30 +0900</pubDate>
    </item>
    <item>
      <title>[Android Studio]Notification 정보 가져오기 ( java )</title>
      <link>https://ggojange.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://snowdeer.github.io/android/2017/03/26/notification-listener-service-sample/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://snowdeer.github.io/android/2017/03/26/notification-listener-service-sample ( snowdeer's Code Holic )&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 노티피케이션(Notification)의 정보를 가져오는 코드를 작성해보도록 하겠습니다. 안드로이드에서 NotificationListenerService라는 서비스 형태의 컴포넌트를 제공하고 있습니다. API 버전 18부터 사용가능하며, 원할하게 쓰려면 API 버전 19 이상을 추천합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안드로이드 SDK에 기본으로 탑재되어 있기 때문에 gradle 등에 별도로 추가할 필요는 없고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;manifest.xml에 다음과 같이 서비스를 등록해주면 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;androidmanifestxml&quot; style=&quot;background-color: #ffffff; color: #313131; text-align: start;&quot;&gt;AndroidManifest.xml&lt;/h1&gt;
&lt;pre class=&quot;xml&quot; style=&quot;background-color: #000000; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;&amp;lt;application
  android:allowBackup=&quot;true&quot;
  android:icon=&quot;@mipmap/ic_launcher&quot;
  android:label=&quot;@string/app_name&quot;
  android:supportsRtl=&quot;true&quot;
  android:theme=&quot;@style/AppTheme&quot;&amp;gt;
  ...
  &amp;lt;service
    android:name=&quot;.SnowNotificationListenerService&quot;
    android:permission=&quot;android.permission.BIND_NOTIFICATION_LISTENER_SERVICE&quot;&amp;gt;
    &amp;lt;intent-filter&amp;gt;
      &amp;lt;action android:name=&quot;android.service.notification.NotificationListenerService&quot;/&amp;gt;
    &amp;lt;/intent-filter&amp;gt;
  &amp;lt;/service&amp;gt;
&amp;lt;/application&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고, Java 코드는 다음과 같습니다.&lt;/p&gt;
&lt;h1 id=&quot;snownotificationlistenerservicejava&quot; style=&quot;background-color: #ffffff; color: #313131; text-align: start;&quot;&gt;SnowNotificationListenerService.java&lt;/h1&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;import android.app.Notification;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

public class SnowNotificationListenerService extends NotificationListenerService {

  @Override
  public void onCreate() {
    super.onCreate();
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] onCreate()&quot;);
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] onStartCommand()&quot;);
    return super.onStartCommand(intent, flags, startId);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] onDestroy()&quot;);
  }

  @Override
  public void onNotificationPosted(StatusBarNotification sbn) {
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] onNotificationPosted() - &quot; + sbn.toString());
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] PackageName:&quot; + sbn.getPackageName());
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] PostTime:&quot; + sbn.getPostTime());

    Notification notificatin = sbn.getNotification();
    Bundle extras = notificatin.extras;
    String title = extras.getString(Notification.EXTRA_TITLE);
    int smallIconRes = extras.getInt(Notification.EXTRA_SMALL_ICON);
    Bitmap largeIcon = ((Bitmap) extras.getParcelable(Notification.EXTRA_LARGE_ICON));
    CharSequence text = extras.getCharSequence(Notification.EXTRA_TEXT);
    CharSequence subText = extras.getCharSequence(Notification.EXTRA_SUB_TEXT);

    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] Title:&quot; + title);
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] Text:&quot; + text);
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] Sub Text:&quot; + subText);
  }

  @Override
  public void onNotificationRemoved(StatusBarNotification sbn) {
    Log.i(&quot;NotificationListener&quot;, &quot;[snowdeer] onNotificationRemoved() - &quot; + sbn.toString());
  }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고로 이 서비스는 별도로 startService를 해주지 않아도, 사용자의 권한만 주어지면 자동으로 시작되기 때문에 startService를 구현할 필요는 없습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 권한을 요청하는 코드는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Intent intent = new Intent(&quot;android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS&quot;);
startActivity(intent);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만, 위 코드를 매번 호출하는 것은 사용자에게 상당히 번거로운 일이기 때문에, 다음과 같은 코드를 이용해서 기존에 사용자가 해당 App에 권한을 부여한 적이 있는지 확인하는 것이 좋습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;mainactivityjava&quot; style=&quot;background-color: #ffffff; color: #313131; text-align: start;&quot;&gt;MainActivity.java&lt;/h1&gt;
&lt;pre class=&quot;scala&quot; style=&quot;background-color: #000000; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;import android.content.Intent;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    boolean isPermissionAllowed = isNotiPermissionAllowed();

    if(!isPermissionAllowed) {
      Intent intent = new Intent(&quot;android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS&quot;);
      startActivity(intent);
    }
  }

  private boolean isNotiPermissionAllowed() {
    Set&amp;lt;String&amp;gt; notiListenerSet = NotificationManagerCompat.getEnabledListenerPackages(this);
    String myPackageName = getPackageName();

    for(String packageName : notiListenerSet) {
      if(packageName == null) {
        continue;
      }
      if(packageName.equals(myPackageName)) {
        return true;
      }
    }

    return false;
  }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Android</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/158</guid>
      <comments>https://ggojange.tistory.com/158#entry158comment</comments>
      <pubDate>Thu, 7 Sep 2023 16:31:08 +0900</pubDate>
    </item>
    <item>
      <title>[Android Studio] 안드로이드 웹뷰(WebView) 파일선택, 여러개 파일선택</title>
      <link>https://ggojange.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;http://it-archives.com/222114870620/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://it-archives.com/222114870620/&amp;nbsp; (흑곰의 유익한 블로그 2호점)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;아이폰(iOS)&amp;nbsp;하이브리드&amp;nbsp;앱에서는&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;rdquo;file&amp;rdquo;&amp;gt;&amp;nbsp;을&amp;nbsp;사용하면&amp;nbsp;해당&amp;nbsp;요소를&amp;nbsp;클릭&amp;nbsp;시&amp;nbsp;파일선택&amp;nbsp;창(FileChooser)이&amp;nbsp;잘&amp;nbsp;뜨지만,&amp;nbsp;안드로이드&amp;nbsp;웹뷰에서는&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;rdquo;file&amp;rdquo;&amp;gt;&amp;nbsp;요소를&amp;nbsp;클릭해도&amp;nbsp;아무&amp;nbsp;반응이&amp;nbsp;없다. &lt;br /&gt;&lt;br /&gt;안드로이드&amp;nbsp;하이브리드앱에서&amp;nbsp;파일을&amp;nbsp;선택하는&amp;nbsp;기능은&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;구현&amp;nbsp;가능하다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;mFilePathCallback&amp;nbsp;변수를&amp;nbsp;전역변수로&amp;nbsp;선언한다. &lt;br /&gt;&lt;br /&gt;webView&amp;nbsp;를&amp;nbsp;사용할&amp;nbsp;Activity&amp;nbsp;클래스(또는&amp;nbsp;Activity&amp;nbsp;를&amp;nbsp;상속받은&amp;nbsp;클래스)&amp;nbsp;에&amp;nbsp;선언하면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;안드로이드&amp;nbsp;웹뷰에서&amp;nbsp;파일&amp;nbsp;첨부하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ValueCallback&amp;nbsp;mFilePathCallback&amp;nbsp;=&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;WebChromeClient&amp;nbsp;클래스의&amp;nbsp;onShowFileChooser&amp;nbsp;메서드를&amp;nbsp;오버라이딩해서&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;작성한다. &lt;br /&gt;&lt;br /&gt;파일&amp;nbsp;n개&amp;nbsp;선택(파일&amp;nbsp;여러개&amp;nbsp;선택,&amp;nbsp;파일&amp;nbsp;다중선택)&amp;nbsp;하려면&amp;nbsp;intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,&amp;nbsp;true);&amp;nbsp;코드를&amp;nbsp;포함시키자. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;webView.setWebChromeClient(new&amp;nbsp;WebChromeClient()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;안드로이드&amp;nbsp;웹뷰에서&amp;nbsp;파일&amp;nbsp;첨부하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;boolean&amp;nbsp;onShowFileChooser(WebView&amp;nbsp;webView,&amp;nbsp;ValueCallback&amp;nbsp;filePathCallback,&amp;nbsp;FileChooserParams&amp;nbsp;fileChooserParams)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mFilePathCallback&amp;nbsp;=&amp;nbsp;filePathCallback; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent&amp;nbsp;intent&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Intent(Intent.ACTION_GET_CONTENT); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intent.addCategory(Intent.CATEGORY_OPENABLE); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intent.setType(&amp;ldquo;image/*&amp;rdquo;); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;파일&amp;nbsp;n개&amp;nbsp;선택&amp;nbsp;가능하도록&amp;nbsp;처리 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,&amp;nbsp;true); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startActivityForResult(intent,&amp;nbsp;0); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;만약&amp;nbsp;WebChromeClient&amp;nbsp;를&amp;nbsp;상속받아&amp;nbsp;별개의&amp;nbsp;자바파일로&amp;nbsp;구현했다면(ex&amp;nbsp;:&amp;nbsp;public&amp;nbsp;class&amp;nbsp;OOOWebChromeClient&amp;nbsp;extends&amp;nbsp;WebChromeClient&amp;nbsp;{}),&amp;nbsp;startActivityForResult&amp;nbsp;메서드를&amp;nbsp;곧바로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;없을&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;경우&amp;nbsp;WebChromeClient&amp;nbsp;생성자에서&amp;nbsp;activity&amp;nbsp;를&amp;nbsp;받아&amp;nbsp;thisActivity&amp;nbsp;라는&amp;nbsp;멤버변수에&amp;nbsp;저장해놓으면&amp;nbsp;thisActivity.startActivityForResult(intent,&amp;nbsp;0);&amp;nbsp;식으로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;OOOWebChromeClient&amp;nbsp;extends&amp;nbsp;WebChromeClient&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;final&amp;nbsp;Activity&amp;nbsp;thisActivity; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;OOOWebChromeClient(Activity&amp;nbsp;thisActivity)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.thisActivity&amp;nbsp;=&amp;nbsp;thisActivity; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(중략) &lt;br /&gt;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;mFilePathCallback&amp;nbsp;변수가&amp;nbsp;선언된&amp;nbsp;클래스,&amp;nbsp;다시&amp;nbsp;말해서&amp;nbsp;Activify&amp;nbsp;클래스(또는&amp;nbsp;Activity를&amp;nbsp;상속한&amp;nbsp;클래스)&amp;nbsp;하단에&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;작성한다. &lt;br /&gt;&lt;br /&gt;참고로&amp;nbsp;파일을&amp;nbsp;n개&amp;nbsp;선택(여러개&amp;nbsp;선택,&amp;nbsp;다중선택)한&amp;nbsp;경우&amp;nbsp;data.getClipData()&amp;nbsp;값이&amp;nbsp;not&amp;nbsp;null이며,&amp;nbsp;파일을&amp;nbsp;1개&amp;nbsp;선택한&amp;nbsp;경우&amp;nbsp;data.getData()&amp;nbsp;값이&amp;nbsp;not&amp;nbsp;null이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;안드로이드&amp;nbsp;웹뷰에서&amp;nbsp;파일&amp;nbsp;첨부하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;void&amp;nbsp;onActivityResult(int&amp;nbsp;requestCode,&amp;nbsp;int&amp;nbsp;resultCode,&amp;nbsp;@Nullable&amp;nbsp;Intent&amp;nbsp;data)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.e(&amp;ldquo;resultCode::&amp;nbsp;&amp;ldquo;,&amp;nbsp;String.valueOf(resultCode)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(requestCode&amp;nbsp;==&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;resultCode&amp;nbsp;==&amp;nbsp;Activity.RESULT_OK)&amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;파일&amp;nbsp;n개&amp;nbsp;선택한&amp;nbsp;경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(Build.VERSION.SDK_INT&amp;nbsp;&amp;gt;=&amp;nbsp;Build.VERSION_CODES.JELLY_BEAN&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;data&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;data.getClipData()&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;data.getClipData().getItemCount()&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;count&amp;nbsp;=&amp;nbsp;data.getClipData().getItemCount(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uri[]&amp;nbsp;uriArr&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Uri[count]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i=0;&amp;nbsp;i&amp;lt;count;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uriArr[i]&amp;nbsp;=&amp;nbsp;data.getClipData().getItemAt(i).getUri(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mFilePathCallback.onReceiveValue(uriArr); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(data&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;data.getData()&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;파일&amp;nbsp;1개&amp;nbsp;선택한&amp;nbsp;경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(Build.VERSION.SDK_INT&amp;nbsp;&amp;gt;=&amp;nbsp;Build.VERSION_CODES.LOLLIPOP)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mFilePathCallback.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode,&amp;nbsp;data)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mFilePathCallback.onReceiveValue(new&amp;nbsp;Uri[]{data.getData()}); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mFilePathCallback&amp;nbsp;=&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mFilePathCallback.onReceiveValue(null); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;만약&amp;nbsp;WebChromeClient&amp;nbsp;를&amp;nbsp;상속받아&amp;nbsp;별개의&amp;nbsp;자바파일로&amp;nbsp;구현했다면(ex&amp;nbsp;:&amp;nbsp;public&amp;nbsp;class&amp;nbsp;OOOWebChromeClient&amp;nbsp;extends&amp;nbsp;WebChromeClient&amp;nbsp;{}),&amp;nbsp;mFilePathCallback&amp;nbsp;변수를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;없을&amp;nbsp;것이다.&amp;nbsp;OOOWebChromeClien&amp;nbsp;클래스&amp;nbsp;내에&amp;nbsp;mFilePathCallback&amp;nbsp;의&amp;nbsp;getter,&amp;nbsp;setter&amp;nbsp;메서드를&amp;nbsp;만들어서&amp;nbsp;접근하도록&amp;nbsp;하자.&lt;/p&gt;</description>
      <category>Android</category>
      <author>꼬장e</author>
      <guid isPermaLink="true">https://ggojange.tistory.com/157</guid>
      <comments>https://ggojange.tistory.com/157#entry157comment</comments>
      <pubDate>Fri, 1 Sep 2023 16:15:45 +0900</pubDate>
    </item>
  </channel>
</rss>