<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>정윤욱의 클라우드 기반 인공지능 개발과 DevOps 실무</title>
    <link>https://yoonuk.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 09:44:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>정윤욱</managingEditor>
    <item>
      <title>안드로이드 스튜디오 깃허브 : 안드로이드 스튜디오 깃허브 연결</title>
      <link>https://yoonuk.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;이런경우에는 일단 깃허브에서 Token을 가져와야 한다.&amp;nbsp;&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;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rqvB3/btrJEK6wUPr/XpVZmVnUk2feh3HK5dSKw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rqvB3/btrJEK6wUPr/XpVZmVnUk2feh3HK5dSKw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rqvB3/btrJEK6wUPr/XpVZmVnUk2feh3HK5dSKw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrqvB3%2FbtrJEK6wUPr%2FXpVZmVnUk2feh3HK5dSKw1%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;1280&quot; height=&quot;884&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&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;깃허브에 들어간 뒤 Settings 를 클릭 해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7uihn/btrJA5kdvZU/JMCrd9bacoAVy1RJfX7QIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7uihn/btrJA5kdvZU/JMCrd9bacoAVy1RJfX7QIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7uihn/btrJA5kdvZU/JMCrd9bacoAVy1RJfX7QIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7uihn%2FbtrJA5kdvZU%2FJMCrd9bacoAVy1RJfX7QIK%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;411&quot; height=&quot;541&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Developer settings를 눌러준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb1oIp/btrJA37P9K7/hfgLJOB2aAvRvkX5kEktK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb1oIp/btrJA37P9K7/hfgLJOB2aAvRvkX5kEktK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb1oIp/btrJA37P9K7/hfgLJOB2aAvRvkX5kEktK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb1oIp%2FbtrJA37P9K7%2FhfgLJOB2aAvRvkX5kEktK0%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;1229&quot; height=&quot;800&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Personal access tokens을 눌러준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6OpEW/btrJD4KV9fW/bliqjCkW4pRY6X6S18C9KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6OpEW/btrJD4KV9fW/bliqjCkW4pRY6X6S18C9KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6OpEW/btrJD4KV9fW/bliqjCkW4pRY6X6S18C9KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6OpEW%2FbtrJD4KV9fW%2FbliqjCkW4pRY6X6S18C9KK%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;1233&quot; height=&quot;463&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWjia/btrJBmMNrTT/bJsSeB0XiWNBpebpW2XWc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWjia/btrJBmMNrTT/bJsSeB0XiWNBpebpW2XWc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWjia/btrJBmMNrTT/bJsSeB0XiWNBpebpW2XWc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWjia%2FbtrJBmMNrTT%2FbJsSeB0XiWNBpebpW2XWc0%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;1126&quot; height=&quot;242&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn5LPB/btrJD3ebsY1/PM9ryGzcUa8a6biOSTQII0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn5LPB/btrJD3ebsY1/PM9ryGzcUa8a6biOSTQII0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn5LPB/btrJD3ebsY1/PM9ryGzcUa8a6biOSTQII0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn5LPB%2FbtrJD3ebsY1%2FPM9ryGzcUa8a6biOSTQII0%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;667&quot; height=&quot;794&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mm8ei/btrJBIWpuqA/P9oEonY2xvp5DHX04luKA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mm8ei/btrJBIWpuqA/P9oEonY2xvp5DHX04luKA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mm8ei/btrJBIWpuqA/P9oEonY2xvp5DHX04luKA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMm8ei%2FbtrJBIWpuqA%2FP9oEonY2xvp5DHX04luKA1%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;401&quot; height=&quot;334&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/camyvF/btrJBmszKr8/7Gt0rfZGjT9exjbRFYLZzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/camyvF/btrJBmszKr8/7Gt0rfZGjT9exjbRFYLZzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/camyvF/btrJBmszKr8/7Gt0rfZGjT9exjbRFYLZzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcamyvF%2FbtrJBmszKr8%2F7Gt0rfZGjT9exjbRFYLZzk%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;1021&quot; height=&quot;654&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&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;현재 나는 토큰을 넣어 연결한 상태인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 처음이면 새로만들라거나 연결하라고 적혀져 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Lvj2/btrJC4xEkf7/dsp2p3HbpPdn1tsJ1wizg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Lvj2/btrJC4xEkf7/dsp2p3HbpPdn1tsJ1wizg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Lvj2/btrJC4xEkf7/dsp2p3HbpPdn1tsJ1wizg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Lvj2%2FbtrJC4xEkf7%2Fdsp2p3HbpPdn1tsJ1wizg0%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;980&quot; height=&quot;661&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이 화면에서 내가 아까만든 토큰을 연결하게 되면 내가 연결한 깃허브가 뜰 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkobad/btrJBl1si7P/NzMOzKoBLXWe90ficM1CjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkobad/btrJBl1si7P/NzMOzKoBLXWe90ficM1CjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkobad/btrJBl1si7P/NzMOzKoBLXWe90ficM1CjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkobad%2FbtrJBl1si7P%2FNzMOzKoBLXWe90ficM1CjK%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;1086&quot; height=&quot;712&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgYrb/btrJA4TcVhg/V8XcNuXWbvsPaS511bjESK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgYrb/btrJA4TcVhg/V8XcNuXWbvsPaS511bjESK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgYrb/btrJA4TcVhg/V8XcNuXWbvsPaS511bjESK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgYrb%2FbtrJA4TcVhg%2FV8XcNuXWbvsPaS511bjESK%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;992&quot; height=&quot;694&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&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;돌아오면 Git라는 것이 보일 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git&amp;nbsp; =&amp;gt;&amp;nbsp; GitHub =&amp;gt; Share Project on GitHub를 클릭 해 주면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNopJ4/btrJFO8FIh8/6PoVwpqeuksb8C7gPKg2MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNopJ4/btrJFO8FIh8/6PoVwpqeuksb8C7gPKg2MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNopJ4/btrJFO8FIh8/6PoVwpqeuksb8C7gPKg2MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNopJ4%2FbtrJFO8FIh8%2F6PoVwpqeuksb8C7gPKg2MK%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;1244&quot; height=&quot;724&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjBJmG/btrJBk2x2ry/IcTN0TNDK4jkItBcxytmdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjBJmG/btrJBk2x2ry/IcTN0TNDK4jkItBcxytmdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjBJmG/btrJBk2x2ry/IcTN0TNDK4jkItBcxytmdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjBJmG%2FbtrJBk2x2ry%2FIcTN0TNDK4jkItBcxytmdk%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;382&quot; height=&quot;680&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 코드가 나오게 될것이고 Share를 눌러주고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;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;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnbcNd/btrJBlmVrm3/PyNNZEuIOf63btamW3Oyg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnbcNd/btrJBlmVrm3/PyNNZEuIOf63btamW3Oyg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnbcNd/btrJBlmVrm3/PyNNZEuIOf63btamW3Oyg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnbcNd%2FbtrJBlmVrm3%2FPyNNZEuIOf63btamW3Oyg0%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;1280&quot; height=&quot;483&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/122</guid>
      <comments>https://yoonuk.tistory.com/122#entry122comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:46:00 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 구글 맵 구현하기 / 구글 맵 보여주기</title>
      <link>https://yoonuk.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 스튜디오 구글 맵 구현하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gradle 설정 또한 해주어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;-------------------------------------------------Manifest-----------------------------------------------------------&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;activity 사이에 넣어주면 된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;uses-library android:name=&quot;com.google.android.maps&quot; /&amp;gt;
&amp;lt;uses-library
    android:name=&quot;org.apache.http.legacy&quot;
    android:required=&quot;false&quot; /&amp;gt;

&amp;lt;meta-data
    android:name=&quot;com.google.android.geo.API_KEY&quot;
    android:value=&quot;AIzaSyARSwWyc4Bly9Wdaqc0Ba9Pp46VXAL2Agc&quot; /&amp;gt;
&amp;lt;meta-data
    android:name=&quot;com.google.android.gms.version&quot;
    android:value=&quot;@integer/google_play_services_version&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;첫번째 value에는 내가 가져온 구글 맵 API_Key를 입력하면 된다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두번째 value에는 구글 맵 Version 를 입력하면 된다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르겠는 경우 value 값에 아래와 같이 넣고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 value에 &quot;@integer/google_play_services_version&quot; 이라 적으면 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;integer name=&quot;google_play_services_version&quot;&amp;gt;12451000&amp;lt;/integer&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;---------------------------------------settings.gradle---------------------------------------------&lt;/h3&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()


    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()

    }
}


rootProject.name = &quot;GoogleMapTest&quot;
include ':app'
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;---------------------------------------bulid.gradle(Module)---------------------------------------&lt;/h3&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;dependencies {
    implementation 'com.google.android.gms:play-services-maps:15.0.0'
    implementation 'com.google.android.gms:play-services-location:15.0.0'
    implementation 'com.google.android.gms:play-services-places:15.0.0'


    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;---------------------------------------MainActivity------------------------------------------------&lt;/h3&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;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class MainActivity extends AppCompatActivity implements GoogleMap.OnMyLocationButtonClickListener,
        GoogleMap.OnMyLocationClickListener,
        OnMapReadyCallback {


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


        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);



        LatLngBounds australiaBounds = new LatLngBounds(
                new LatLng(-44, 113), // SW bounds
                new LatLng(-10, 154)  // NE bounds
        );
        @SuppressLint(&quot;MissingPermission&quot;)
        @Override
        public void onMapReady(GoogleMap map) {
            map.setMyLocationEnabled(true);
            map.setOnMyLocationButtonClickListener(this);
            map.setOnMyLocationClickListener(this);
            // map.setOnMarkerClickListener(markerClickListener);
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 17));




            // 구글맵 마커 사이즈 조절하는 코드
            BitmapDrawable bitmapdraw=(BitmapDrawable)getResources().getDrawable(R.drawable.pin3);
            Bitmap b=bitmapdraw.getBitmap();
            Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false);
            BitmapDrawable bitmapdraw2=(BitmapDrawable)getResources().getDrawable(R.drawable.selectpin);
            Bitmap b2=bitmapdraw2.getBitmap();
            Bitmap smallMarker2 = Bitmap.createScaledBitmap(b2, width, height, false);


            // 임의로 전동 킥보드 넣는 코드
            LatLng scooter1 = new LatLng(37.544121, 126.677024);
            map.addMarker(new MarkerOptions()
                    .position(scooter1)
                    .title(&quot;1번 전동킥보드&quot;)
                    .icon(BitmapDescriptorFactory.fromBitmap(smallMarker)));
            map.moveCamera(CameraUpdateFactory.newLatLng(scooter1));

            map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    String marker_id=marker.getId();

                    if(marker_id != null){
                        marker.setIcon(BitmapDescriptorFactory.fromBitmap(smallMarker2));
                        getTitle = marker.getTitle();
                        Toast.makeText(MainActivity.this, getTitle, Toast.LENGTH_SHORT).show();

                    }else{

                    }

                    return false;
                }

            });

        }


        @Override
        public void onMyLocationClick(@NonNull Location location) { }


        @Override
        public boolean onMyLocationButtonClick() {
            Toast.makeText(this, &quot;내 위치보기&quot;, Toast.LENGTH_SHORT)
                    .show();

            // Return false so that we don't consume the event and the default behavior still occurs
            // (the camera animates to the user's current position).
            return false;
        }
    }
}
&lt;/code&gt;&lt;/pre&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OsLrn/btrJC4qTdsN/alKHkiXMk6jHpYhKrjvSp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OsLrn/btrJC4qTdsN/alKHkiXMk6jHpYhKrjvSp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OsLrn/btrJC4qTdsN/alKHkiXMk6jHpYhKrjvSp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOsLrn%2FbtrJC4qTdsN%2FalKHkiXMk6jHpYhKrjvSp1%2Fimg.jpg&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;606&quot; height=&quot;1280&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&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;&lt;a href=&quot;https://developers.google.com/maps/documentation/android-sdk/start?hl=ko&quot;&gt;https://developers.google.com/maps/documentation/android-sdk/start?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1660376716275&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Android용 Maps SDK 빠른 시작 &amp;nbsp;|&amp;nbsp; Google Developers&quot; data-og-description=&quot;지금 바로 Android 앱용 Google 지도 프로젝트를 시작해 보세요. SDK 설치부터 앱 빌드 및 실행에 이르기까지 필요한 모든 것을 찾는 방법은 다음과 같습니다.&quot; data-og-host=&quot;developers.google.com&quot; data-og-source-url=&quot;https://developers.google.com/maps/documentation/android-sdk/start?hl=ko&quot; data-og-url=&quot;https://developers.google.com/maps/documentation/android-sdk/start?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eumoUl/hyNRbfoClv/Q6lWzq4iuYC0yfFuA2h4wK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/cx832g/hyNQX2yH1c/AFUMl8tkfMHNZqj2oCKno0/img.png?width=756&amp;amp;height=1380&amp;amp;face=0_0_756_1380&quot;&gt;&lt;a href=&quot;https://developers.google.com/maps/documentation/android-sdk/start?hl=ko&quot; data-source-url=&quot;https://developers.google.com/maps/documentation/android-sdk/start?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eumoUl/hyNRbfoClv/Q6lWzq4iuYC0yfFuA2h4wK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/cx832g/hyNQX2yH1c/AFUMl8tkfMHNZqj2oCKno0/img.png?width=756&amp;amp;height=1380&amp;amp;face=0_0_756_1380');&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;Android용 Maps SDK 빠른 시작 &amp;nbsp;|&amp;nbsp; Google Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지금 바로 Android 앱용 Google 지도 프로젝트를 시작해 보세요. SDK 설치부터 앱 빌드 및 실행에 이르기까지 필요한 모든 것을 찾는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 API 발급하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hanul0147.tistory.com/322&quot;&gt;https://hanul0147.tistory.com/322&lt;/a&gt;&lt;/p&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/121</guid>
      <comments>https://yoonuk.tistory.com/121#entry121comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:45:25 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 사진 찍으면 S3에 저장하기</title>
      <link>https://yoonuk.tistory.com/120</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;-------Manifest-------------&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android:networkSecurityConfig 을 해줘야 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&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:networkSecurityConfig=&quot;@xml/network_security_config&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;---------Xml 문서------------------- 새로만들어주기&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;network-security-config&amp;gt;
    &amp;lt;base-config cleartextTrafficPermitted=&quot;true&quot;&amp;gt;
        &amp;lt;trust-anchors&amp;gt;
            &amp;lt;certificates src=&quot;system&quot; /&amp;gt;
        &amp;lt;/trust-anchors&amp;gt;
    &amp;lt;/base-config&amp;gt;
&amp;lt;/network-security-config&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;------------&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;b&gt;------------&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;uses-library android:name=&quot;com.google.android.maps&quot; /&amp;gt;
&amp;lt;uses-library
    android:name=&quot;org.apache.http.legacy&quot;
    android:required=&quot;false&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;provider
    android:name=&quot;androidx.core.content.FileProvider&quot;
    android:authorities=&quot;com.jhn.googlemaptest.fileprovider&quot;
    android:exported=&quot;false&quot;
    android:grantUriPermissions=&quot;true&quot;&amp;gt;
    &amp;lt;meta-data
        android:name=&quot;android.support.FILE_PROVIDER_PATHS&quot;
        android:resource=&quot;@xml/fileprovider&quot; /&amp;gt;
&amp;lt;/provider&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-------------ImageApi----------------&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;interface 입니다&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;package com.jhn.googlemaptest.api;


import com.jhn.googlemaptest.model.ImageRes;


import java.util.Map;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;

public interface ImageApi {
    // 이미지 S3에 저장하기
    @Multipart
    @POST(&quot;/dev/api/v1/posting&quot;)
    Call&amp;lt;ImageRes&amp;gt; posting(@Part MultipartBody.Part image);

    // 라벨링하는 코드
    @GET(&quot;/dev/api/v1/labling&quot;)
    Call&amp;lt;ImageRes&amp;gt; labling(@Part MultipartBody.Part image,
                           @PartMap Map&amp;lt;String, RequestBody&amp;gt; params);

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;------------------ImageRes--------------------&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;package com.jhn.googlemaptest.model;

import java.io.Serializable;

public class ImageRes  {

    private String result;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;---------------------Utils----------------------------&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;package com.jhn.googlemaptest.utils;

public class Utils {
    // AWS URL
    public static final String BASE_URL = &quot;서버리스 또는 aws IAM 주소 &quot;;
    public static final String IMAGE_URL = &quot;S3 주소 &quot;;

    // 저장소 정보
    public static final String PREFERENCES_NAME = &quot;yh_Scooter_DB&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;---------------NetworkClient--------------&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;import android.content.Context;

import com.jhn.googlemaptest.utils.Utils;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class NetworkClient {
    public static Retrofit retrofit;

    public static Retrofit getRetrofitClient(Context context){
        if(retrofit == null){

            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    .connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1, TimeUnit.MINUTES)
                    .writeTimeout(1, TimeUnit.MINUTES)
                    .addInterceptor(loggingInterceptor).build();
            retrofit = new Retrofit.Builder().baseUrl(Utils.BASE_URL)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
&lt;/code&gt;&lt;/pre&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-------------Main Code---------------&lt;/h3&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;Uri fileProvider = FileProvider.getUriForFile(ResultActivity.this,
        &quot;com.jhn.googlemaptest.fileprovider&quot;, photoFile);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.jhn.googlemaptest.api.ImageApi;
import com.jhn.googlemaptest.api.NetworkClient;
import com.jhn.googlemaptest.model.ImageRes;

import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;


import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class ResultActivity extends AppCompatActivity {
    TextView txt1;
    TextView txt2;
    Button button;
    Button button2;
    ImageView imgPhoto;
    public static final int REQ_REGISTER_CHECK = 101;
    public static final int REQ_LOGIN_CHECK = 102;
    public static final int REQ_PHOTO_CAPTURE = 103;
    public static final int REQ_PHOTO_SELECTION = 104;
    

    private ProgressDialog progressDialog;

    String[] permissions = {
            Manifest.permission.INTERNET,
            Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION
    };
    private File photoFile;

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

        txt1 = findViewById(R.id.txt1);
        txt2 = findViewById(R.id.txt2);
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);
        imgPhoto = findViewById(R.id.imgPhoto);


        Intent intent = getIntent();
        long duration = intent.getExtras().getLong(&quot;duration&quot;);

        txt1.setText(&quot;이용시간 : &quot; + (duration / 60000) + &quot;분&quot;);
        txt2.setText(&quot;이용금액 : &quot; + (duration / 60000) * 200 + &quot;원&quot;);



        // 사진촬영하기 버튼
      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              showDialog();
          }
      });

      button2.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {

              Intent intent = new Intent(ResultActivity.this, LastActivity.class);
              startActivity(intent);

          }
      });

    }
    private void camera(){
        int permissionCheck = ContextCompat.checkSelfPermission(
                ResultActivity.this, Manifest.permission.CAMERA);

        if(permissionCheck != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(ResultActivity.this,
                    new String[]{Manifest.permission.CAMERA} ,
                    1000);
            Toast.makeText(ResultActivity.this, &quot;카메라 권한 필요합니다.&quot;,
                    Toast.LENGTH_SHORT).show();
            return;
        } else {
            Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(i.resolveActivity(ResultActivity.this.getPackageManager())  != null  ){
                // 사진의 파일명을 만들기
                String fileName = new SimpleDateFormat(&quot;yyyyMMdd_HHmmss&quot;).format(new Date());
                photoFile = getPhotoFile(fileName);

                Uri fileProvider = FileProvider.getUriForFile(ResultActivity.this,
                        &quot;com.jhn.googlemaptest.fileprovider&quot;, photoFile);
                i.putExtra(MediaStore.EXTRA_OUTPUT, fileProvider);

                startActivityForResult(i, 100);

            } else{
                Toast.makeText(ResultActivity.this, &quot;이폰에는 카메라 앱이 없습니다.&quot;,
                        Toast.LENGTH_SHORT).show();
            }
        }
    }


    private void album(){

        if(checkPermission()){
            displayFileChoose();
        }else{
            requestPermission();
        }
    }

    private File getPhotoFile(String fileName) {
        File storageDirectory = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        try{
            return File.createTempFile(fileName, &quot;.jpg&quot;, storageDirectory);
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }
    }

    private boolean checkPermission(){
        int result = ContextCompat.checkSelfPermission(ResultActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(result == PackageManager.PERMISSION_DENIED){
            return false;
        }else{
            return true;
        }
    }

    private void displayFileChoose() {
        Intent i = new Intent();
        i.setType(&quot;image/*&quot;);
        i.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(i, &quot;SELECT IMAGE&quot;), 300);
    }
    private void requestPermission() {
        if(ActivityCompat.shouldShowRequestPermissionRationale(ResultActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            Toast.makeText(ResultActivity.this, &quot;권한 수락이 필요합니다.&quot;,
                    Toast.LENGTH_SHORT).show();
        }else{

            ActivityCompat.requestPermissions(ResultActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 500);
        }
    }

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {
            case 1000: {
                if (grantResults.length &amp;gt; 0 &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(ResultActivity.this, &quot;권한 허가 되었음&quot;,
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ResultActivity.this, &quot;아직 승인하지 않았음&quot;,
                            Toast.LENGTH_SHORT).show();
                }
                break;
            }
            case 500: {
                if (grantResults.length &amp;gt; 0 &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(ResultActivity.this, &quot;권한 허가 되었음&quot;,
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ResultActivity.this, &quot;아직 승인하지 않았음&quot;,
                            Toast.LENGTH_SHORT).show();
                }

            }

        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }



    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == 100 &amp;amp;&amp;amp; resultCode == RESULT_OK){

            // 카메라로 찍은 사진은 사진으로 바꾸는 코드
            Bitmap photo = BitmapFactory.decodeFile(photoFile.getAbsolutePath());

            ExifInterface exif = null;
            try {
                exif = new ExifInterface(photoFile.getAbsolutePath());
            } catch (IOException e) {
                e.printStackTrace();
            }
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_UNDEFINED);
            photo = rotateBitmap(photo, orientation);

            // 압축시킨다. 해상도 낮춰서
            OutputStream os;
            try {
                os = new FileOutputStream(photoFile);
                photo.compress(Bitmap.CompressFormat.JPEG, 100, os);
                os.flush();
                os.close();
            } catch (Exception e) {
                Log.e(getClass().getSimpleName(), &quot;Error writing bitmap&quot;, e);
            }
            SendImage();

        }else if(requestCode == 300 &amp;amp;&amp;amp; resultCode == RESULT_OK &amp;amp;&amp;amp; data != null &amp;amp;&amp;amp;
                data.getData() != null){

            //  앨범 을 Uri 로 바꾸고 S3에 저장시키는 코드
            Uri albumUri = data.getData( );
            String fileName = getFileName( albumUri );
            try {

                ParcelFileDescriptor parcelFileDescriptor = getContentResolver( ).openFileDescriptor( albumUri, &quot;r&quot; );
                if ( parcelFileDescriptor == null ) return;
                FileInputStream inputStream = new FileInputStream( parcelFileDescriptor.getFileDescriptor( ) );
                photoFile = new File( this.getCacheDir( ), fileName );
                FileOutputStream outputStream = new FileOutputStream( photoFile );
                IOUtils.copy( inputStream, outputStream );

                // 압축시킨다. 해상도 낮춰서
                Bitmap photo = BitmapFactory.decodeFile(photoFile.getAbsolutePath());
                OutputStream os;
                try {
                    os = new FileOutputStream(photoFile);
                    photo.compress(Bitmap.CompressFormat.JPEG, 100, os);
                    os.flush();
                    os.close();
                } catch (Exception e) {
                    Log.e(getClass().getSimpleName(), &quot;Error writing bitmap&quot;, e);
                }
                SendImage();

            } catch ( Exception e ) {
                e.printStackTrace( );
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void showProgress(String message) {
        progressDialog = new ProgressDialog(this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage(message);
        progressDialog.show();
    }

    public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {

        Matrix matrix = new Matrix();
        switch (orientation) {
            case ExifInterface.ORIENTATION_NORMAL:
                return bitmap;
            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                matrix.setScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                matrix.setRotate(180);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_TRANSPOSE:
                matrix.setRotate(90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                break;
            case ExifInterface.ORIENTATION_TRANSVERSE:
                matrix.setRotate(-90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(-90);
                break;
            default:
                return bitmap;
        }
        try {
            Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            bitmap.recycle();
            return bmRotated;
        }
        catch (OutOfMemoryError e) {
            e.printStackTrace();
            return null;
        }
    }

//    private void dismissProgress() {
//        progressDialog.dismiss();
//    }
    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(ResultActivity.this);
        builder.setTitle(&quot;선택하세요&quot;).setItems(R.array.camera_array, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if (i == 0) {
                    // 카메라로 사진찍는 함수 실행
                    camera();
                } else if (i == 1) {
                    // 앨범에서 사진 가져오는 함수 실행
                    album();
                }
            }
        }); AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

    private void SendImage() {
       // S3에 보내는 코드
        Retrofit retrofit = NetworkClient.getRetrofitClient(ResultActivity.this);
        ImageApi api = retrofit.create(ImageApi.class);

        Log.i(&quot;ImageAPi 성공 시 &quot;, &quot;1111&quot;);
            // MemoReq memoReq = new MemoReq(title, datetime, content);

        RequestBody fileBody = RequestBody.create(photoFile,
                MediaType.parse(&quot;image/*&quot;));
        MultipartBody.Part part = MultipartBody.Part.createFormData(
                &quot;image&quot;, photoFile.getName(), fileBody
        );
        Log.i(&quot;img_url&quot;, photoFile.getName());
        Call&amp;lt; ImageRes &amp;gt; call = api.posting(part);
        Log.i(&quot;MyMemoApp&quot;, &quot;2222&quot;);
        call.enqueue(new Callback&amp;lt;ImageRes&amp;gt;() {
            @Override
            public void onResponse(Call&amp;lt;ImageRes&amp;gt; call, Response&amp;lt;ImageRes&amp;gt; response) {
                // dismissProgress();
                if (response.isSuccessful()) {
                    Toast.makeText(getApplicationContext(),&quot;성공적으로 잘 갔습니다.&quot;,Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ResultActivity.this,
                            &quot;문제 발생&quot;,
                            Toast.LENGTH_SHORT).show();
                    return;
                }
            }

            @Override
            public void onFailure(Call&amp;lt;ImageRes&amp;gt; call, Throwable t) {
                // dismissProgress();
                Toast.makeText(ResultActivity.this,
                        &quot;네트워크 문제 발생&quot;,
                        Toast.LENGTH_SHORT).show();
                return;

            }
        });
    }
    //앨범에서 선택한 사진이름 가져오기
    public String getFileName( Uri uri ) {
        Cursor cursor = getContentResolver( ).query( uri, null, null, null, null );
        try {
            if ( cursor == null ) return null;
            cursor.moveToFirst( );
            @SuppressLint(&quot;Range&quot;) String fileName = cursor.getString( cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) );
            cursor.close( );
            return fileName;

        } catch ( Exception e ) {
            e.printStackTrace( );
            cursor.close( );
            return null;
        }
    }

    }&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-140&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/120</guid>
      <comments>https://yoonuk.tistory.com/120#entry120comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:44:48 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 사진찍기/갤러리 불러오기</title>
      <link>https://yoonuk.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;사진찍기와 갤러리 불러오기에 대한 선택지를 주고 선택지에 따라&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;사진찍기 - &amp;gt; 카메라 열기&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;갤러리 불러오기 -&amp;gt; 나의 갤러리 불러오기&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;등을 사용할 수 있다.&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;package com.jhn.googlemaptest;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.media.ExifInterface;
import android.media.Image;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;

import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class ResultActivity extends AppCompatActivity {
    TextView txt1;
    TextView txt2;
    Button button;
    ImageView imgPhoto;
    String imgpath;
    public static final int REQ_REGISTER_CHECK = 101;
    public static final int REQ_LOGIN_CHECK = 102;
    public static final int REQ_PHOTO_CAPTURE = 103;
    public static final int REQ_PHOTO_SELECTION = 104;

    Uri uri;
    File file;

    private ProgressDialog progressDialog;

    String[] permissions = {
            Manifest.permission.INTERNET,
            Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION
    };
    private File photoFile;

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

        txt1 = findViewById(R.id.txt1);
        txt2 = findViewById(R.id.txt2);
        button = findViewById(R.id.button);
        imgPhoto = findViewById(R.id.imgPhoto);


        Intent intent = getIntent();
        long duration = intent.getExtras().getLong(&quot;duration&quot;);

        txt1.setText(&quot;이용시간 : &quot; + (duration / 60000) + &quot;분&quot;);
        txt2.setText(&quot;이용금액 : &quot; + (duration / 60000) * 200 + &quot;원&quot;);


        // 권한확인
        if (!hasPermissions(this)) ActivityCompat.requestPermissions(this, permissions, 1);

        // 사진촬영하기 버튼
      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              showDialog();
          }
      });

    }
    private void camera(){
        int permissionCheck = ContextCompat.checkSelfPermission(
                ResultActivity.this, Manifest.permission.CAMERA);

        if(permissionCheck != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(ResultActivity.this,
                    new String[]{Manifest.permission.CAMERA} ,
                    1000);
            Toast.makeText(ResultActivity.this, &quot;카메라 권한 필요합니다.&quot;,
                    Toast.LENGTH_SHORT).show();
            return;
        } else {
            Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(i.resolveActivity(ResultActivity.this.getPackageManager())  != null  ){
                // 사진의 파일명을 만들기
                String fileName = new SimpleDateFormat(&quot;yyyyMMdd_HHmmss&quot;).format(new Date());
                photoFile = getPhotoFile(fileName);

                Uri fileProvider = FileProvider.getUriForFile(ResultActivity.this,
                        &quot;com.jhn.googlemaptest.fileprovider&quot;, photoFile);
                i.putExtra(MediaStore.EXTRA_OUTPUT, fileProvider);

                startActivityForResult(i, 100);

            } else{
                Toast.makeText(ResultActivity.this, &quot;이폰에는 카메라 앱이 없습니다.&quot;,
                        Toast.LENGTH_SHORT).show();
            }
        }
    }


    private void album(){

        if(checkPermission()){
            displayFileChoose();
        }else{
            requestPermission();
        }
    }

    private File getPhotoFile(String fileName) {
        File storageDirectory = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        try{
            return File.createTempFile(fileName, &quot;.jpg&quot;, storageDirectory);
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }
    }

    private boolean checkPermission(){
        int result = ContextCompat.checkSelfPermission(ResultActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(result == PackageManager.PERMISSION_DENIED){
            return false;
        }else{
            return true;
        }
    }

    private void displayFileChoose() {
        Intent i = new Intent();
        i.setType(&quot;image/*&quot;);
        i.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(i, &quot;SELECT IMAGE&quot;), 300);
    }
    private void requestPermission() {
        if(ActivityCompat.shouldShowRequestPermissionRationale(ResultActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            Toast.makeText(ResultActivity.this, &quot;권한 수락이 필요합니다.&quot;,
                    Toast.LENGTH_SHORT).show();
        }else{

            ActivityCompat.requestPermissions(ResultActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 500);
        }
    }

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {
            case 1000: {
                if (grantResults.length &amp;gt; 0 &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(ResultActivity.this, &quot;권한 허가 되었음&quot;,
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ResultActivity.this, &quot;아직 승인하지 않았음&quot;,
                            Toast.LENGTH_SHORT).show();
                }
                break;
            }
            case 500: {
                if (grantResults.length &amp;gt; 0 &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(ResultActivity.this, &quot;권한 허가 되었음&quot;,
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ResultActivity.this, &quot;아직 승인하지 않았음&quot;,
                            Toast.LENGTH_SHORT).show();
                }

            }

        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    public boolean hasPermissions(Context context) {
        if (context != null &amp;amp;&amp;amp; permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }

    private void getPermission(){
        ActivityCompat.requestPermissions(this, permissions, 1000);
    }

    /* 사진 찍기 메서드 */
    public void showPhotoCaptureActivity(){
        try {
            file = createFile();
            if (file.exists()){
                file.delete();
            }

            file.createNewFile();
        }catch (Exception e){
            Log.e(&quot;createFile Err: &quot;, e.getMessage());
        }

        // SDK 버전에 따른 파일 경로 설정
        if (Build.VERSION.SDK_INT &amp;gt;= 24){
            uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file);
        }else {
            uri = Uri.fromFile(file);
        }

        // 사진촬영
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, REQ_PHOTO_CAPTURE);
        this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
        Toast.makeText(this, &quot;Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri -&amp;gt;&quot; + uri, Toast.LENGTH_LONG).show();

    } // showPhotoCaptureActivity() END

    /* 이미지 파일 생성 메서드 */
    public File createFile() throws IOException {
        String timeStamp = new SimpleDateFormat(&quot;yyyyMMdd_HHmmss&quot;).format(new Date());
        String imageFileName = &quot;JPEG_&quot; + timeStamp + &quot;_&quot;;
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                &quot;.jpg&quot;,         /* suffix */
                storageDir      /* directory */
        );
        imgpath = image.getAbsolutePath();
        return image;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == 100 &amp;amp;&amp;amp; resultCode == RESULT_OK){

            Bitmap photo = BitmapFactory.decodeFile(photoFile.getAbsolutePath());

            ExifInterface exif = null;
            try {
                exif = new ExifInterface(photoFile.getAbsolutePath());
            } catch (IOException e) {
                e.printStackTrace();
            }
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_UNDEFINED);
            photo = rotateBitmap(photo, orientation);

            // 압축시킨다. 해상도 낮춰서
            OutputStream os;
            try {
                os = new FileOutputStream(photoFile);
                photo.compress(Bitmap.CompressFormat.JPEG, 50, os);
                os.flush();
                os.close();
            } catch (Exception e) {
                Log.e(getClass().getSimpleName(), &quot;Error writing bitmap&quot;, e);
            }

//            Intent intent = new Intent(ResultActivity.this, ResultphotoActivity.class);
//            intent.putExtra(&quot;type&quot;, &quot;camera&quot;);
//            intent.putExtra(&quot;filePath&quot;,  photoFile.getAbsolutePath());
//            startActivity(intent);

        }else if(requestCode == 300 &amp;amp;&amp;amp; resultCode == RESULT_OK &amp;amp;&amp;amp; data != null &amp;amp;&amp;amp;
                data.getData() != null){

            Uri albumUri = data.getData( );

//            Intent intent = new Intent(ResultActivity.this, ResultphotoActivity.class);
//            intent.putExtra(&quot;type&quot;, &quot;album&quot;);
//            intent.putExtra(&quot;imageUri&quot;, albumUri.toString());
//            startActivity(intent);

        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    private void showProgress(String message) {
        progressDialog = new ProgressDialog(this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage(message);
        progressDialog.show();
    }

    public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {

        Matrix matrix = new Matrix();
        switch (orientation) {
            case ExifInterface.ORIENTATION_NORMAL:
                return bitmap;
            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                matrix.setScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                matrix.setRotate(180);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_TRANSPOSE:
                matrix.setRotate(90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                break;
            case ExifInterface.ORIENTATION_TRANSVERSE:
                matrix.setRotate(-90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(-90);
                break;
            default:
                return bitmap;
        }
        try {
            Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            bitmap.recycle();
            return bmRotated;
        }
        catch (OutOfMemoryError e) {
            e.printStackTrace();
            return null;
        }
    }

    private void dismissProgress() {
        progressDialog.dismiss();
    }
    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(ResultActivity.this);
        builder.setTitle(&quot;선택하세요&quot;).setItems(R.array.camera_array, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if (i == 0) {
                    // 카메라로 사진찍는 함수 실행
                    camera();
                } else if (i == 1) {
                    // 앨범에서 사진 가져오는 함수 실행
                    album();
                }
            }
        }); AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

    }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/119</guid>
      <comments>https://yoonuk.tistory.com/119#entry119comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:44:13 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오  토큰 허용</title>
      <link>https://yoonuk.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;&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;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Button btnDone = findViewById(R.id.btnDone);

btnDone.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 1. 이메일과 비번을 가져온다
        String email = editEmail.getText().toString().trim();
        String password = editPasswd.getText().toString().trim();
        // 2. 이메일이 정상적인지 확인한다.
        if(email.isEmpty()){
            Toast.makeText(LoginActivity.this, &quot;이메일이 올바르지 않습니다.&quot;,
                    Toast.LENGTH_SHORT).show();
            return;
        }
        // 3. 비밀번호 갯수가 정상적인지 확인한다.
        if(password.isEmpty() || password.length() &amp;lt; 4 ||
                password.length() &amp;gt; 12){
            Toast.makeText(LoginActivity.this, &quot;비밀번호 길이가 맞지 않습니다.&quot;,
                    Toast.LENGTH_SHORT).show();
            return;
        }

        showProgress(&quot;로그인 중입니다...&quot;);
        // 4. 네트워크 통해서 API 호출한다.
        Retrofit retrofit = NetworkClient.getRetrofitClient(LoginActivity.this);
        UserApi api = retrofit.create(UserApi.class);

        // 바디에 데이터 담아서 보낸다.
        UserReq userReq = new UserReq(email, password);
        Call&amp;lt;UserRes&amp;gt; call = api.userLogin(userReq);
        call.enqueue(new Callback&amp;lt;UserRes&amp;gt;() {
            @Override
            public void onResponse(Call&amp;lt;UserRes&amp;gt; call, Response&amp;lt;UserRes&amp;gt; response) {
                Log.i(&quot;MyMemoApp&quot;, &quot;&quot;+response.code());

                dismissProgress();

                // 5. 호출 결과를 보고, 처리해줄 코드를 작성한다.
                if(response.isSuccessful()){
                    // 1. accessToken을 저장하고,
                    SharedPreferences sp = getSharedPreferences(Utils.PREFERENCES_NAME, MODE_PRIVATE);

                    String accessToken = response.body().getAccess_token();

                    SharedPreferences.Editor editor = sp.edit();
                    editor.putString(&quot;accessToken&quot;, accessToken);
                    editor.apply();

                    // 2. 메인액티비티를 띄운다.
                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(intent);
                    finish();
                }else{

                }
            }
            @Override
            public void onFailure(Call&amp;lt;UserRes&amp;gt; call, Throwable t) {
                dismissProgress();
            }

        });&lt;/code&gt;&lt;/pre&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; xml로 보여주는 코드이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        SharedPreferences sp = getSharedPreferences(Utils.PREFERENCES_NAME, MODE_PRIVATE);
        accessToken = sp.getString(&quot;accessToken&quot;, &quot;&quot;);

        if(accessToken.isEmpty()){
            // 로그인 액티비티를 띄운다.
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }else{
            Intent intent = new Intent(MainActivity.this, SelectActivity.class);
            startActivity(intent);
            finish();
        }

    }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;// 저장소 정보
public static final String PREFERENCES_NAME = &quot;자신의 저장소 적기&quot;;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/118</guid>
      <comments>https://yoonuk.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:43:44 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 구글 맵 위치 권한 허용 하기</title>
      <link>https://yoonuk.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java.lang.SecurityException:&amp;nbsp;my&amp;nbsp;location&amp;nbsp;requires&amp;nbsp;permission&amp;nbsp;ACCESS_FINE_LOCATION&amp;nbsp;or&amp;nbsp;ACCESS_COARSE_LOCATION&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;at&amp;nbsp;com.jhn.googlemaptest.MainActivity.onMapReady(MainActivity.java:93)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;아래와 같은 오류가 뜨는 경우가 있을 경우가 있다.&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 오류가 뜨는 이유는 권한에 대한 오류이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b45EHH/btrJAN5bghd/YGqYOkTkToMRdBP1dynTZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b45EHH/btrJAN5bghd/YGqYOkTkToMRdBP1dynTZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b45EHH/btrJAN5bghd/YGqYOkTkToMRdBP1dynTZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb45EHH%2FbtrJAN5bghd%2FYGqYOkTkToMRdBP1dynTZk%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;1134&quot; height=&quot;551&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Android 6.0 (23- 마시멜로)&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;/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;targetsdk 23 으로 바꾸면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그치만 이미 23이상으로 구현 된 코드를 sdk 23으로 바뀐다고 바로 사용되지 않을 것이다.&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;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;targetSdk 23&lt;/code&gt;&lt;/pre&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;이 코드를 넣어 권한을 허용 시켜주면 문제 없이 앱이 사용된다.!&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// 권한 허용
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);

if(permissionCheck == PackageManager.PERMISSION_DENIED){ //포그라운드 위치 권한 확인

    //위치 권한 요청
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
}


int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION);

if(permissionCheck == PackageManager.PERMISSION_DENIED){ //백그라운드 위치 권한 확인
    //위치 권한 요청
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, 0);
}

&lt;/code&gt;&lt;/pre&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;
&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://velog.io/@jaeyunn_15/Android-Android-%EC%9C%84%EC%B9%98-%EA%B6%8C%ED%95%9C-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD&quot;&gt;https://velog.io/@jaeyunn_15/Android-Android-%EC%9C%84%EC%B9%98-%EA%B6%8C%ED%95%9C-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660376594251&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;[Android] Android 위치 권한 변경 사항  &quot; data-og-description=&quot;Android 11 버전 여러 업데이트 사항 중 개인정보 보호기능에서 크게 달라졌다는 글을 보았다.곧 Android 12가 출시 되겠지만 그래도... 여러 프로젝트를 해보면서 지도에서 사용자 위치 접근에 대한 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@jaeyunn_15/Android-Android-%EC%9C%84%EC%B9%98-%EA%B6%8C%ED%95%9C-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD&quot; data-og-url=&quot;https://velog.io/@jaeyunn_15/Android-Android-위치-권한-변경-사항&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iLLXp/hyNH5dunv5/smszJRkDZ1TdkjvGRgKn3K/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/baFwxn/hyNGCKLJqt/048nKqD43v4uSv9nTbx1l0/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://velog.io/@jaeyunn_15/Android-Android-%EC%9C%84%EC%B9%98-%EA%B6%8C%ED%95%9C-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD&quot; data-source-url=&quot;https://velog.io/@jaeyunn_15/Android-Android-%EC%9C%84%EC%B9%98-%EA%B6%8C%ED%95%9C-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iLLXp/hyNH5dunv5/smszJRkDZ1TdkjvGRgKn3K/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/baFwxn/hyNGCKLJqt/048nKqD43v4uSv9nTbx1l0/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&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;[Android] Android 위치 권한 변경 사항  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Android 11 버전 여러 업데이트 사항 중 개인정보 보호기능에서 크게 달라졌다는 글을 보았다.곧 Android 12가 출시 되겠지만 그래도... 여러 프로젝트를 해보면서 지도에서 사용자 위치 접근에 대한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/training/permissions/requesting.html&quot;&gt;https://developer.android.com/training/permissions/requesting.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660376594253&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;앱 권한 요청 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;앱 권한 요청 모든 Android 앱은 액세스가 제한된 샌드박스에서 실행됩니다. 앱이 자체 샌드박스 밖에 있는 리소스나 정보를 사용해야 하는 경우 권한을 선언하고 이 액세스를 제공하는 권한 요청&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/training/permissions/requesting.html&quot; data-og-url=&quot;https://developer.android.com/training/permissions/requesting?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5d3Wp/hyNGJ4b6tt/LIvg2jXwlgQsqkpOhTiOq0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;/figure&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-137&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/117</guid>
      <comments>https://yoonuk.tistory.com/117#entry117comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:43:18 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오  카카오 맵 api 이용하여 맵 띄우기</title>
      <link>https://yoonuk.tistory.com/116</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. SDK파일 다운로드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오 공식문서에서 DownLoad SDK 버튼을 눌러 다운받고 압축을 푼다. 위치는 상관 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오 공식 문서 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://apis.map.kakao.com/android/guide/&quot;&gt;https://apis.map.kakao.com/android/guide/&lt;/a&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;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/py9gb/btrJC4j6g1C/rBJ44ytD1yfU0RqU8GSqxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/py9gb/btrJC4j6g1C/rBJ44ytD1yfU0RqU8GSqxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/py9gb/btrJC4j6g1C/rBJ44ytD1yfU0RqU8GSqxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpy9gb%2FbtrJC4j6g1C%2FrBJ44ytD1yfU0RqU8GSqxk%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;1280&quot; height=&quot;674&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 카카오 개발자 사이트 - 개발자 등록, 앱 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 사이트&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developers.kakao.com/&quot;&gt;https://developers.kakao.com/&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에서 개발자등록을 하고 앱을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 안드로이드 프로젝트 파일의 패키지명이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지명은 프로젝트 파일 중 AndroidManifest.xml 상단에서 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1660376506161&quot; class=&quot;routeros&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;이 부분이 패키지명&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;** 내 프로젝트의 디버그 키 해시 값 구해서 등록하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 생성하고 안드로이드 플랫폼을 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 내 안드로이드 프로젝트의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;키 해시 값&lt;/b&gt;이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/ 카카오 해시키 받아오는 코드
//    private void getAppKeyHash() {
//        try {
//            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
//            for (Signature signature : info.signatures) {
//                MessageDigest md;
//                md = MessageDigest.getInstance(&quot;SHA&quot;);
//                md.update(signature.toByteArray());
//                String something = new String(Base64.encode(md.digest(), 0));
//                Log.e(&quot;Hash key&quot;, something);
//            }
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            Log.e(&quot;name not found&quot;, e.toString());
//        }
//    }&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// getAppKeyHash();   =&amp;gt; 해시키 불러오는 코드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;참고 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://gyubgyub.tistory.com/m/29?category=858295&quot;&gt;https://gyubgyub.tistory.com/m/29?category=858295&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Log.e(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Hash key&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;something) 부분이 해시 키 출력 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Log.e 이므로 로그에 빨간색으로 떠서 쉽게 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 키는 외부에 노출되지 않도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고로 이건 (개발용)디버그 키의 해시값이므로&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배포 시에는 릴리즈 키를 발급해서 릴리즈 키 해시값을 넣어줘야 한다!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgjZYj/btrJBVt1t75/9tZC3SK1PZ9FSoBBIKUycK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgjZYj/btrJBVt1t75/9tZC3SK1PZ9FSoBBIKUycK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgjZYj/btrJBVt1t75/9tZC3SK1PZ9FSoBBIKUycK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgjZYj%2FbtrJBVt1t75%2F9tZC3SK1PZ9FSoBBIKUycK%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;951&quot; height=&quot;265&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pExsC/btrJEMDhyFM/vVjkDihk5z2t6GQjbGCMw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pExsC/btrJEMDhyFM/vVjkDihk5z2t6GQjbGCMw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pExsC/btrJEMDhyFM/vVjkDihk5z2t6GQjbGCMw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpExsC%2FbtrJEMDhyFM%2FvVjkDihk5z2t6GQjbGCMw0%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;1054&quot; height=&quot;400&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMHnN0/btrJAr8MFDO/fqg6QVGsHqlZesPVN2K1Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMHnN0/btrJAr8MFDO/fqg6QVGsHqlZesPVN2K1Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMHnN0/btrJAr8MFDO/fqg6QVGsHqlZesPVN2K1Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMHnN0%2FbtrJAr8MFDO%2Ffqg6QVGsHqlZesPVN2K1Y1%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;1051&quot; height=&quot;432&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dzscn/btrJE3x5lLr/sF54fv54mHShVTYIC8bAMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dzscn/btrJE3x5lLr/sF54fv54mHShVTYIC8bAMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dzscn/btrJE3x5lLr/sF54fv54mHShVTYIC8bAMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDzscn%2FbtrJE3x5lLr%2FsF54fv54mHShVTYIC8bAMK%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;874&quot; height=&quot;737&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※※※※&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;여러 사람이 함께 개발한다면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;개발에 참여하는 모든 사람들의 프로젝트의 키 해시값을 구해서 모두 등록해줘야한다!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;키 해시 값을 등록하지 않은 사람은 테스트 시 카카오맵 부분이 실행되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이걸 모르고 지나쳐서 오류잡는다고 한참 빙빙돌았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 사람들한테 저 코드 실행해서 나오는 키 해시 값 알려달라고해서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;플랫폼 등록 시 키 해시 값 란에 엔터로 구분해 모두 넣어주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※※※※&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 다운 받은 SDK 파일을 프로젝트에 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 안드로이드 스튜디오에서 좌측 상단 Android 옆 화살표를 눌러 Project로 바꿔준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbA6YA/btrJCp9SiOm/WxwtBANaaWeG30Ru1vU2H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbA6YA/btrJCp9SiOm/WxwtBANaaWeG30Ru1vU2H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbA6YA/btrJCp9SiOm/WxwtBANaaWeG30Ru1vU2H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbA6YA%2FbtrJCp9SiOm%2FWxwtBANaaWeG30Ru1vU2H1%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;432&quot; height=&quot;506&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&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;아까 다운 받은 SDK 파일의 압축을 풀고 libs 폴더로 이동하면 이런 모양새다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y9IC1/btrJC4RVbTZ/xnyvTvhxuRKo5izHk7ucWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y9IC1/btrJC4RVbTZ/xnyvTvhxuRKo5izHk7ucWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y9IC1/btrJC4RVbTZ/xnyvTvhxuRKo5izHk7ucWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY9IC1%2FbtrJC4RVbTZ%2FxnyvTvhxuRKo5izHk7ucWk%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;740&quot; height=&quot;184&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&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;맨 아래 jar파일을 app &amp;gt; libs 폴더에 넣어준다.(위에서 Android를 Project로 바꾸지 않았다면 libs폴더가 보이지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app &amp;gt; src &amp;gt; main 위치에 jniLibs라는 새 폴더를 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 3개를 그대로 넣어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS87OC/btrJAq9SLvC/6cJLK6Xb731EM6kYvKXWd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS87OC/btrJAq9SLvC/6cJLK6Xb731EM6kYvKXWd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS87OC/btrJAq9SLvC/6cJLK6Xb731EM6kYvKXWd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS87OC%2FbtrJAq9SLvC%2F6cJLK6Xb731EM6kYvKXWd0%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;505&quot; height=&quot;767&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;971&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;4. app단의 build 파일에 의존성implementation 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 우측 상단에서 Project로 설정했던 걸 Android로 바꿔서 보기가 편하게 만들자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle(Module: app) 파일의 dependencies 부분에&amp;nbsp;아래 코드 두 줄을 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아래 사진의 두 build.gradle 중 아래 것이다)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pAJjG/btrJBFLIU2C/taHmknRzK4UpgKqjaN9lf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pAJjG/btrJBFLIU2C/taHmknRzK4UpgKqjaN9lf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pAJjG/btrJBFLIU2C/taHmknRzK4UpgKqjaN9lf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpAJjG%2FbtrJBFLIU2C%2FtaHmknRzK4UpgKqjaN9lf0%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;492&quot; height=&quot;180&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files('libs/libDaumMapAndroid.jar')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 해 주어야 3번에서 추가한 파일들을 프로젝트가 인식한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SyncNow눌러주는 거 잊지 말기&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId &quot;com.jhn.maptest&quot;
        minSdk 22
        targetSdk 32
        versionCode 1
        versionName &quot;1.0&quot;

        testInstrumentationRunner &quot;androidx.test.runner.AndroidJUnitRunner&quot;
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation files('libs/libDaumMapAndroid.jar')

    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. AndroidMenifest.xml 파일에 Permission과 AppKey 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Permission 코드 추가&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_COARSE_LOCATION&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AppKey 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1660376506191&quot; class=&quot;routeros&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta-data android:name=&quot;com.kakao.sdk.AppKey&quot; android:value=&quot;XXXXXXXXXXXXXXXXXXXXXXXXXXXX&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #008080;&quot;&gt;android:value&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd1144;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에는 개발자 사이트에서 생성한 앱의 네이티브 앱 키를 넣어준다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dd1144;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;앱 키는 아래 사진처럼 확인할 수 있다.&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;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8ZixF/btrJAeIDoH0/PzCm876WCZnC1CgPjTtkLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8ZixF/btrJAeIDoH0/PzCm876WCZnC1CgPjTtkLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8ZixF/btrJAeIDoH0/PzCm876WCZnC1CgPjTtkLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8ZixF%2FbtrJAeIDoH0%2FPzCm876WCZnC1CgPjTtkLk%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;1280&quot; height=&quot;659&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AndroidMenifest.xml&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;com.jhn.maptest&quot;&amp;gt;

    &amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&amp;gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_COARSE_LOCATION&quot; /&amp;gt;


    &amp;lt;application
        android:usesCleartextTraffic=&quot;true&quot;
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:label=&quot;@string/app_name&quot;
        android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
        android:supportsRtl=&quot;true&quot;
        android:theme=&quot;@style/Theme.MapTest&quot;&amp;gt;

        &amp;lt;activity
            android:name=&quot;.MainActivity&quot;
            android:exported=&quot;true&quot;&amp;gt;
            &amp;lt;intent-filter&amp;gt;
                &amp;lt;action android:name=&quot;android.intent.action.MAIN&quot; /&amp;gt;

                &amp;lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/activity&amp;gt;
        &amp;lt;meta-data
            android:name=&quot;com.kakao.sdk.AppKey&quot;
            android:value=&quot;네이티브 값 넣기&quot;/&amp;gt;
    &amp;lt;/application&amp;gt;

&amp;lt;/manifest&amp;gt;&lt;/code&gt;&lt;/pre&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정이 끝났다!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 MapView를 띄우기 위한 코드를 넣고 실행해보자.&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;xml 에는 id값을 갖는 레이아웃요소를 하나 만들어주자.&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;activity_main.xml&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    tools:context=&quot;.MainActivity&quot;&amp;gt;

    &amp;lt;TextView
        android:id=&quot;@+id/textView&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_margin=&quot;20dp&quot;
        android:text=&quot;안드로이드 카카오맵 API 활용 : \nMapView 띄우기&quot;
        android:textColor=&quot;#822FD5&quot;
        android:textSize=&quot;20sp&quot;
        android:textStyle=&quot;bold&quot;
        app:layout_constraintStart_toStartOf=&quot;parent&quot;
        app:layout_constraintTop_toTopOf=&quot;parent&quot; /&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout
        android:id=&quot;@+id/map_view&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;500dp&quot;
        android:layout_marginTop=&quot;20dp&quot;
        app:layout_constraintTop_toBottomOf=&quot;@+id/textView&quot; /&amp;gt;


&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰 바인딩을 사용했다. 앱 해시 키 얻는 부분은 이제 필요 없으니 주석처리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MainActivity.kt&lt;/p&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;package com.jhn.maptest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.ViewGroup;

import net.daum.mf.map.api.MapView;

import java.security.MessageDigest;

public class MainActivity extends AppCompatActivity {

// 카카오 해시키 받아오는 코드
//    private void getAppKeyHash() {
//        try {
//            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
//            for (Signature signature : info.signatures) {
//                MessageDigest md;
//                md = MessageDigest.getInstance(&quot;SHA&quot;);
//                md.update(signature.toByteArray());
//                String something = new String(Base64.encode(md.digest(), 0));
//                Log.e(&quot;Hash key&quot;, something);
//            }
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            Log.e(&quot;name not found&quot;, e.toString());
//        }
//    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// getAppKeyHash();   =&amp;gt; 해시키 불러오는 코드

        MapView mapView = new MapView(this);

        ViewGroup mapViewContainer = (ViewGroup) findViewById(R.id.map_view);
        mapViewContainer.addView(mapView);

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MapView를 보이는 부분은 이 두 줄만 집중하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;mapView&amp;nbsp;=&amp;nbsp;MapView(this)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;binding.clKakaoMapView.addView(mapView)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰 바인딩을 사용하지 않고 바로 id로 접근하거나 findViewById를 쓴다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;binding.부분을 제외하고 뷰 요소 접근해서 .addView(mapView)해주면 된다.&lt;/p&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/116</guid>
      <comments>https://yoonuk.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:42:52 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 앱 시작시 로고 보여주기</title>
      <link>https://yoonuk.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;LogoActivity를 통해 Logo 사진을 만들어 둔 뒤 2초뒤 화면 전환을 해준다.&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xMwp8/btrJBE67b4L/eq884er9un7EJ0yGSXFncK/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;&quot;&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;1053&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcPNMZ/btrJAHKhIPv/rtZSEYpK32SYjnUpjLE3hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcPNMZ/btrJAHKhIPv/rtZSEYpK32SYjnUpjLE3hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcPNMZ/btrJAHKhIPv/rtZSEYpK32SYjnUpjLE3hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcPNMZ%2FbtrJAHKhIPv%2FrtZSEYpK32SYjnUpjLE3hK%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;1053&quot; height=&quot;671&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJcWW/btrJA5kdfNI/6GXC08eBdSuQjiK5NXOYl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJcWW/btrJA5kdfNI/6GXC08eBdSuQjiK5NXOYl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJcWW/btrJA5kdfNI/6GXC08eBdSuQjiK5NXOYl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJcWW%2FbtrJA5kdfNI%2F6GXC08eBdSuQjiK5NXOYl0%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;559&quot; height=&quot;407&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&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;=======================================================&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;activity_logo.xml&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2Zbx/btrJBVne7g0/eTagAHUEk0PrSEnZ8C5Hi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2Zbx/btrJBVne7g0/eTagAHUEk0PrSEnZ8C5Hi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2Zbx/btrJBVne7g0/eTagAHUEk0PrSEnZ8C5Hi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2Zbx%2FbtrJBVne7g0%2FeTagAHUEk0PrSEnZ8C5Hi1%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;1014&quot; height=&quot;664&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/115</guid>
      <comments>https://yoonuk.tistory.com/115#entry115comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:41:13 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 retrofit2</title>
      <link>https://yoonuk.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래 있는 주소는 retrofit 의 공식 사이트이다.&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;&lt;a href=&quot;https://square.github.io/retrofit/&quot;&gt;https://square.github.io/retrofit/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660376418491&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Retrofit&quot; data-og-description=&quot;A type-safe HTTP client for Android and Java&quot; data-og-host=&quot;square.github.io&quot; data-og-source-url=&quot;https://square.github.io/retrofit/&quot; data-og-url=&quot;https://square.github.io/retrofit/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://square.github.io/retrofit/&quot; data-source-url=&quot;https://square.github.io/retrofit/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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;Retrofit&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A type-safe HTTP client for Android and Java&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;square.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비주얼 스튜디오를 통해 데이터 베이스와&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RESTfull 을 사용한 것을 안드로이드 스튜디오를 통해 애뮬레이터에 연결하려 하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAjwCE/btrJAMFeM5S/U7kH7xTyZpYirw0kk72KOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAjwCE/btrJAMFeM5S/U7kH7xTyZpYirw0kk72KOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAjwCE/btrJAMFeM5S/U7kH7xTyZpYirw0kk72KOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAjwCE%2FbtrJAMFeM5S%2FU7kH7xTyZpYirw0kk72KOK%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;1216&quot; height=&quot;796&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bulid.gradle 에서 빨간 박스들을 추가 시켜준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D3lxs/btrJFP0Op7Z/Im7S8RnsC72vikzzuyfMK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D3lxs/btrJFP0Op7Z/Im7S8RnsC72vikzzuyfMK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D3lxs/btrJFP0Op7Z/Im7S8RnsC72vikzzuyfMK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD3lxs%2FbtrJFP0Op7Z%2FIm7S8RnsC72vikzzuyfMK1%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;1156&quot; height=&quot;533&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;===========================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api 파일 안에&amp;nbsp; NetworkClient&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv806F/btrJA4yRhU1/kbrEVcDfvxAq3Xq5mezw10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv806F/btrJA4yRhU1/kbrEVcDfvxAq3Xq5mezw10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv806F/btrJA4yRhU1/kbrEVcDfvxAq3Xq5mezw10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv806F%2FbtrJA4yRhU1%2FkbrEVcDfvxAq3Xq5mezw10%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;1129&quot; height=&quot;703&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api =&amp;gt; UserApi&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sbIhP/btrJA4TcJgx/4nx7Hf37uCmDWCKZ0KEAmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sbIhP/btrJA4TcJgx/4nx7Hf37uCmDWCKZ0KEAmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sbIhP/btrJA4TcJgx/4nx7Hf37uCmDWCKZ0KEAmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsbIhP%2FbtrJA4TcJgx%2F4nx7Hf37uCmDWCKZ0KEAmK%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;888&quot; height=&quot;383&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;============================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model =&amp;gt; UserReq&amp;nbsp; (User의 정보를 요청하는 것이다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLcofJ/btrJANYrvNt/8tkOqaVKkr17xUL9OL2t80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLcofJ/btrJANYrvNt/8tkOqaVKkr17xUL9OL2t80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLcofJ/btrJANYrvNt/8tkOqaVKkr17xUL9OL2t80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLcofJ%2FbtrJANYrvNt%2F8tkOqaVKkr17xUL9OL2t80%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;989&quot; height=&quot;683&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=====================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model =&amp;gt; UserRes (User의 정보를 받는 것이다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yn7s8/btrJCowoi0G/uHZLRO50FdoOu7iViKTWmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yn7s8/btrJCowoi0G/uHZLRO50FdoOu7iViKTWmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yn7s8/btrJCowoi0G/uHZLRO50FdoOu7iViKTWmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyn7s8%2FbtrJCowoi0G%2FuHZLRO50FdoOu7iViKTWmK%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;772&quot; height=&quot;534&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&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;=========================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Utils =&amp;gt; Utils (BASE_URL 에는 Postman 또는 AWS RESTfull 에서 가져온 주소를 적으면 된다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJsEM/btrJAN5a6No/CKje01Mx2zxu6YGwAPX9y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJsEM/btrJAN5a6No/CKje01Mx2zxu6YGwAPX9y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJsEM/btrJAN5a6No/CKje01Mx2zxu6YGwAPX9y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJsEM%2FbtrJAN5a6No%2FCKje01Mx2zxu6YGwAPX9y1%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;1028&quot; height=&quot;410&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;============================================================================&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;MainActivtiy&amp;nbsp; / activity_main.xml&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCmEZp/btrJFP7z3F7/WzFQuyBuHKuCZ5YUF6W7f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCmEZp/btrJFP7z3F7/WzFQuyBuHKuCZ5YUF6W7f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCmEZp/btrJFP7z3F7/WzFQuyBuHKuCZ5YUF6W7f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCmEZp%2FbtrJFP7z3F7%2FWzFQuyBuHKuCZ5YUF6W7f0%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;837&quot; height=&quot;628&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGx6xN/btrJBmszdev/qKvQMaRNATvImz2fkFlt8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGx6xN/btrJBmszdev/qKvQMaRNATvImz2fkFlt8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGx6xN/btrJBmszdev/qKvQMaRNATvImz2fkFlt8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGx6xN%2FbtrJBmszdev%2FqKvQMaRNATvImz2fkFlt8K%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;1245&quot; height=&quot;666&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;============================================================================&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;SignUpActivity / SignUpActivity.xml&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WfGaE/btrJANYrvKF/ZJdy9MV2DBMisnfsH4s4FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WfGaE/btrJANYrvKF/ZJdy9MV2DBMisnfsH4s4FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WfGaE/btrJANYrvKF/ZJdy9MV2DBMisnfsH4s4FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWfGaE%2FbtrJANYrvKF%2FZJdy9MV2DBMisnfsH4s4FK%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;874&quot; height=&quot;429&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chlf9w/btrJFP7z3JI/DI6VeEQ1BbCF9wYBk85PQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chlf9w/btrJFP7z3JI/DI6VeEQ1BbCF9wYBk85PQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chlf9w/btrJFP7z3JI/DI6VeEQ1BbCF9wYBk85PQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchlf9w%2FbtrJFP7z3JI%2FDI6VeEQ1BbCF9wYBk85PQK%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;948&quot; height=&quot;668&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;789&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA0d66/btrJEMiYDDC/uzYWg40qQOdgraqf8HxdVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA0d66/btrJEMiYDDC/uzYWg40qQOdgraqf8HxdVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA0d66/btrJEMiYDDC/uzYWg40qQOdgraqf8HxdVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA0d66%2FbtrJEMiYDDC%2FuzYWg40qQOdgraqf8HxdVK%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;944&quot; height=&quot;789&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;789&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;============================================================================&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;LoginActivity / LoginActivity.xml&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0zOBL/btrJC5XAWc2/CJL1pqaEKnKtXG7RcX4sz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0zOBL/btrJC5XAWc2/CJL1pqaEKnKtXG7RcX4sz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0zOBL/btrJC5XAWc2/CJL1pqaEKnKtXG7RcX4sz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0zOBL%2FbtrJC5XAWc2%2FCJL1pqaEKnKtXG7RcX4sz0%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;675&quot; height=&quot;516&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckIOCY/btrJFOt4gMo/KF57kYaRamuuNFbDkNIBHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckIOCY/btrJFOt4gMo/KF57kYaRamuuNFbDkNIBHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckIOCY/btrJFOt4gMo/KF57kYaRamuuNFbDkNIBHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckIOCY%2FbtrJFOt4gMo%2FKF57kYaRamuuNFbDkNIBHK%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;970&quot; height=&quot;787&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lR0pW/btrJCpWmr2J/geK0L0fjkjU0PqN8UekpB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lR0pW/btrJCpWmr2J/geK0L0fjkjU0PqN8UekpB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lR0pW/btrJCpWmr2J/geK0L0fjkjU0PqN8UekpB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlR0pW%2FbtrJCpWmr2J%2FgeK0L0fjkjU0PqN8UekpB1%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;1016&quot; height=&quot;747&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQzhYD/btrJC4LbQNQ/AtNoenJimJdAxWTSHVsOW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQzhYD/btrJC4LbQNQ/AtNoenJimJdAxWTSHVsOW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQzhYD/btrJC4LbQNQ/AtNoenJimJdAxWTSHVsOW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQzhYD%2FbtrJC4LbQNQ%2FAtNoenJimJdAxWTSHVsOW1%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;840&quot; height=&quot;280&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vehy6/btrJFPmc6x0/gDmhg9GcFVIl0mpbux8kG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vehy6/btrJFPmc6x0/gDmhg9GcFVIl0mpbux8kG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vehy6/btrJFPmc6x0/gDmhg9GcFVIl0mpbux8kG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvehy6%2FbtrJFPmc6x0%2FgDmhg9GcFVIl0mpbux8kG0%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;949&quot; height=&quot;780&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKbWi/btrJELRS1Ge/oBPo7NEaxzbA2YdKzgTRW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKbWi/btrJELRS1Ge/oBPo7NEaxzbA2YdKzgTRW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKbWi/btrJELRS1Ge/oBPo7NEaxzbA2YdKzgTRW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKbWi%2FbtrJELRS1Ge%2FoBPo7NEaxzbA2YdKzgTRW0%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;967&quot; height=&quot;468&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/114</guid>
      <comments>https://yoonuk.tistory.com/114#entry114comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:40:47 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 스튜디오 유튜브 연결하기</title>
      <link>https://yoonuk.tistory.com/113</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Youtube Data API 키 발급&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://console.developers.google.com/&quot;&gt;https://console.developers.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660376386921&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Google 클라우드 플랫폼&quot; data-og-description=&quot;로그인 Google 클라우드 플랫폼으로 이동&quot; data-og-host=&quot;accounts.google.com&quot; data-og-source-url=&quot;https://console.developers.google.com/&quot; data-og-url=&quot;https://accounts.google.com/v3/signin/identifier?dsh=S-368071199%3A1660374364622332&amp;amp;continue=https%3A%2F%2Fconsole.cloud.google.com%2Fapis%2Fdashboard&amp;amp;followup=https%3A%2F%2Fconsole.cloud.google.com%2Fapis%2Fdashboard&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=cloudconsole&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&amp;amp;ifkv=AQN2RmUoosuxXuNuMh4BfGTiMoGCq-Hs1LGyaXm_xa8ieGiOSp7SlJuItSQgJdfBNzOS39lxo1SoCw&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://console.developers.google.com/&quot; data-source-url=&quot;https://console.developers.google.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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;Google 클라우드 플랫폼&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;로그인 Google 클라우드 플랫폼으로 이동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;accounts.google.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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://haruple.tistory.com/161&quot;&gt;https://haruple.tistory.com/161&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[하루플스토리]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;i&gt;2.API를 다운로드 받고, 압축을 풉니다.&lt;/i&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Project - app - libs 에 붙여넣습니다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHipA/btrJC4RU7la/xzn5LGy9Scb6mqHF2Y9Km1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHipA/btrJC4RU7la/xzn5LGy9Scb6mqHF2Y9Km1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHipA/btrJC4RU7la/xzn5LGy9Scb6mqHF2Y9Km1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHipA%2FbtrJC4RU7la%2Fxzn5LGy9Scb6mqHF2Y9Km1%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;600&quot; height=&quot;773&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq6JNw/btrJEL5p1dy/kpldIZmvIbgoEHKOIlY3Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq6JNw/btrJEL5p1dy/kpldIZmvIbgoEHKOIlY3Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq6JNw/btrJEL5p1dy/kpldIZmvIbgoEHKOIlY3Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq6JNw%2FbtrJEL5p1dy%2FkpldIZmvIbgoEHKOIlY3Lk%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;603&quot; height=&quot;615&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJGLk6/btrJELYEM0z/Kn65tVwpEiQkV0vsX8e05K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJGLk6/btrJELYEM0z/Kn65tVwpEiQkV0vsX8e05K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJGLk6/btrJELYEM0z/Kn65tVwpEiQkV0vsX8e05K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJGLk6%2FbtrJELYEM0z%2FKn65tVwpEiQkV0vsX8e05K%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;632&quot; height=&quot;750&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의해야 할 점은 extends에서 AppCompatActivity가 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;YouTubeBaseActivity를 꼭 extends&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해야합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;여기까지 진행하고 본인 스마트폰을 연결하여 테스트 해보시면 됩니다!&lt;/p&gt;</description>
      <category>프론트엔드/안드로이드 스튜디오</category>
      <author>정윤욱</author>
      <guid isPermaLink="true">https://yoonuk.tistory.com/113</guid>
      <comments>https://yoonuk.tistory.com/113#entry113comment</comments>
      <pubDate>Sat, 13 Aug 2022 16:39:49 +0900</pubDate>
    </item>
  </channel>
</rss>