<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
<title>안드로이드 Q&amp;A - 최근 질문과 답변</title>
<link>http://www.masterqna.com/android/qa</link>
<description>Powered by Question2Answer</description>
<item>
<title>대학사이트 안드로이드 웹 파싱 질문</title>
<link>http://www.masterqna.com/android/93342/%EB%8C%80%ED%95%99%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%B9-%ED%8C%8C%EC%8B%B1-%EC%A7%88%EB%AC%B8?show=104674#a104674</link>
<description>A soft light glided that naked skin as girl reclined stretched across lazily over smooth fine linen sheets, those deep glance lingering on one with one slow, intense curve.Woman moved soft delicate fingertip on the shape across the shoulder, then below, brushing that delicate edge across the soft garment before the thin band fell from her arm.A low sigh escaped soft parted mouth and her envisioned the light caress claiming its role, tracing any delicate with soft spot.Arching the shape, the showed rounded generous contour on her chest, soft points responding by quiet effect from warm look only.Slowly girl widened her form, exposing hidden desire still still stirred in anticipation for gentle contact.The warm hands moved through soft, tracing gentle, light loops while woman whispered one name like the warm breath.Draw forward,” she spoke, her speech rich by longing – here now every inch on mine goes to one.” &lt;br /&gt;
[url=&lt;a href=&quot;https://clickherenow.top/how-ai-companion-apps-actually-handle-a-users-request-to-merge-two-separate-companions/][b]How&quot; rel=&quot;nofollow&quot;&gt;https://clickherenow.top/how-ai-companion-apps-actually-handle-a-users-request-to-merge-two-separate-companions/][b]How&lt;/a&gt; AI Companion Apps Actually Handle a User's Request to Merge Two Separate Companions[/b][/url]</description>
<guid isPermaLink="true">http://www.masterqna.com/android/93342/%EB%8C%80%ED%95%99%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%B9-%ED%8C%8C%EC%8B%B1-%EC%A7%88%EB%AC%B8?show=104674#a104674</guid>
<pubDate>Sat, 03 Oct 2026 01:33:01 +0000</pubDate>
<slash:comments>4</slash:comments>
</item>
<item>
<title>Notification 클릭시 액티비티가 실행되지 않습니다.</title>
<link>http://www.masterqna.com/android/4695/notification-%ED%81%B4%EB%A6%AD%EC%8B%9C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0%EA%B0%80-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104673#a104673</link>
<description>Зима в Буковелі — це класика, але літо там теж варте уваги. Цього літа вирішив поїхати в гори без лиж, і поки готувався, натрапив на сайт, де зібрано реально корисну інфу про відпочинок у цьому регіоні в теплу пору року. &lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
Там є детальні гайди по горах, маршрути, поради, що робити і куди йти, коли сніг уже розтанув. Окремо відзначу матеріал про озеро Молодості — все по ділу, без води, з конкретними порадами. Усе без води, по суті, з практичними рекомендаціями. &lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
Якщо плануєте поїздку в Карпати цього літа або просто хочете подивитися на знайомий курорт з іншого боку — зайдіть, точно знайдете пару ідей. Корисні матеріали зібрані на цьому сайті: [url=&lt;a href=&quot;https://bukovelnaideya.space/]bukovelnaideya.space[/url&quot; rel=&quot;nofollow&quot;&gt;https://bukovelnaideya.space/]bukovelnaideya.space[/url&lt;/a&gt;] &lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
Думаю, буде корисно. Легких мандрівок!</description>
<guid isPermaLink="true">http://www.masterqna.com/android/4695/notification-%ED%81%B4%EB%A6%AD%EC%8B%9C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0%EA%B0%80-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104673#a104673</guid>
<pubDate>Tue, 22 Sep 2026 20:37:38 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
<item>
<title>api26 으로 컴파일 하면 sending message to a Handler on a dead thread 에러가 납니다...</title>
<link>http://www.masterqna.com/android/85133/api26-%EC%9C%BC%EB%A1%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%ED%95%98%EB%A9%B4-sending-message-to-handler-dead-thread-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%82%A9%EB%8B%88%EB%8B%A4?show=104672#a104672</link>
<description>Сторінка [url=&lt;a href=&quot;https://moireceptimultivarki.space/]«Мультиварка&quot; rel=&quot;nofollow&quot;&gt;https://moireceptimultivarki.space/]«Мультиварка&lt;/a&gt;. Рецепти — смачно і просто»[/url] є зручний для українців книга рецептів із сотнею з гаком гарантованими стравами для вашого мультиваркового помічника. У збірці зібрані в одному місці легкі покрокові інструкції на борщів і крем-супів, м'ясних страв, випічки, круп'яних страв, рагу, запіканок, припущених овочів, рибних страв та солодких рецептів. Ключова перевага — це орієнтація на зручність: закинув інгредієнти, натиснув кнопку — і готово. Більшість страв отримуються з невеликою кількістю олії, результат приготування передбачуваний навіть для новачків. Щомісяця з'являються нові страви (зокрема коровай із рисового борошна чи пиріг з полуницею на пісковому тісті), доступна опція отримувати розсилку.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/85133/api26-%EC%9C%BC%EB%A1%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%ED%95%98%EB%A9%B4-sending-message-to-handler-dead-thread-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%82%A9%EB%8B%88%EB%8B%A4?show=104672#a104672</guid>
<pubDate>Wed, 16 Sep 2026 20:46:39 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
<item>
<title>테마(dark light) 변경은 어떻게합니까?</title>
<link>http://www.masterqna.com/android/104598/%ED%85%8C%EB%A7%88-dark-light-%EB%B3%80%EA%B2%BD%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%A9%EB%8B%88%EA%B9%8C?show=104661#a104661</link>
<description>// 테마 상태를 정의하는 Enum&lt;br /&gt;
&lt;br /&gt;
enum class AppTheme { LIGHT, DARK, SYSTEM }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
@Composable&lt;br /&gt;
&lt;br /&gt;
fun App() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var currentTheme by remember { mutableStateOf(AppTheme.SYSTEM) }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 시스템 설정을 따를지, 사용자가 지정한 설정을 따를지 결정&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val isDarkTheme = when (currentTheme) {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppTheme.LIGHT -&amp;gt; false&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppTheme.DARK -&amp;gt; true&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppTheme.SYSTEM -&amp;gt; isSystemInDarkTheme() // Compose 내장 함수&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Theme에 컬러 값을 넘김&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;MaterialTheme(&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;colorScheme = if (isDarkTheme) darkColorScheme() else lightColorScheme()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) {&lt;br /&gt;
&lt;br /&gt;
// 실제 앱의 화면 콘텐츠&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MainScreen(&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentTheme = currentTheme,&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onThemeClick = { selectedTheme -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentTheme = selectedTheme&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
// 테마 변경 버튼이 있는 화면 예시&lt;br /&gt;
&lt;br /&gt;
@Composable&lt;br /&gt;
&lt;br /&gt;
fun MainScreen(currentTheme: AppTheme, onThemeClick: (AppTheme) -&amp;gt; Unit) {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Column {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Text(&amp;quot;현재 테마 선택&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button(onClick = { onThemeClick(AppTheme.LIGHT) }) { Text(&amp;quot;라이트 모드&amp;quot;) }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button(onClick = { onThemeClick(AppTheme.DARK) }) { Text(&amp;quot;다크 모드&amp;quot;) }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button(onClick = { onThemeClick(AppTheme.SYSTEM) }) { Text(&amp;quot;시스템 설정&amp;quot;) }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104598/%ED%85%8C%EB%A7%88-dark-light-%EB%B3%80%EA%B2%BD%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%A9%EB%8B%88%EA%B9%8C?show=104661#a104661</guid>
<pubDate>Thu, 30 Apr 2026 15:25:36 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>switch on시 액티비티를 종료하고싶습니다.</title>
<link>http://www.masterqna.com/android/104642/switch-on%EC%8B%9C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0%EB%A5%BC-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B3%A0%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
<description>&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.masterqna.com/android/?qa=blob&amp;amp;qa_blobid=16081372981645036365&quot; style=&quot;height:1333px; width:600px&quot;&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.masterqna.com/android/?qa=blob&amp;amp;qa_blobid=27047087867739906&quot; style=&quot;height:337px; width:600px&quot;&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color:#b3ae60&quot;&gt;@RequiresApi&lt;/span&gt;(Build.VERSION_CODES.&lt;em&gt;R&lt;/em&gt;)
&lt;span style=&quot;color:#cf8e6d&quot;&gt;private val &lt;/span&gt;&lt;span style=&quot;color:#c77dbb&quot;&gt;requestManageExternalStorage &lt;/span&gt;=
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) &lt;strong&gt;{
&lt;/strong&gt;&lt;strong&gt;        &lt;/strong&gt;&lt;span style=&quot;color:#cf8e6d&quot;&gt;if &lt;/span&gt;(Environment.isExternalStorageManager()) {
            &lt;span style=&quot;color:#7a7e85&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color:#7a7e85; font-family:나눔고딕코딩,monospace&quot;&gt;권한이 부여됨
&lt;/span&gt;&lt;span style=&quot;color:#7a7e85; font-family:나눔고딕코딩,monospace&quot;&gt;            &lt;/span&gt;Toast.makeText(&lt;span style=&quot;color:#cf8e6d&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color:#6aab73&quot;&gt;&quot;MANAGE_EXTERNAL_STORAGE &lt;/span&gt;&lt;span style=&quot;color:#6aab73; font-family:나눔고딕코딩,monospace&quot;&gt;권한이 부여되었습니다&lt;/span&gt;&lt;span style=&quot;color:#6aab73&quot;&gt;.&quot;&lt;/span&gt;, Toast.&lt;em&gt;LENGTH_SHORT&lt;/em&gt;).show()
        } &lt;span style=&quot;color:#cf8e6d&quot;&gt;else &lt;/span&gt;{
            &lt;span style=&quot;color:#7a7e85&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color:#7a7e85; font-family:나눔고딕코딩,monospace&quot;&gt;권한이 거부됨
&lt;/span&gt;&lt;span style=&quot;color:#7a7e85; font-family:나눔고딕코딩,monospace&quot;&gt;            &lt;/span&gt;Toast.makeText(&lt;span style=&quot;color:#cf8e6d&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color:#6aab73&quot;&gt;&quot;MANAGE_EXTERNAL_STORAGE &lt;/span&gt;&lt;span style=&quot;color:#6aab73; font-family:나눔고딕코딩,monospace&quot;&gt;권한이 거부되었습니다&lt;/span&gt;&lt;span style=&quot;color:#6aab73&quot;&gt;.&quot;&lt;/span&gt;, Toast.&lt;em&gt;LENGTH_SHORT&lt;/em&gt;).show()
        }
    &lt;strong&gt;}
&lt;/strong&gt;
&lt;/pre&gt;&lt;pre&gt;
&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!Environment.isExternalStorageManager()) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; val intent = Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; val uri = Uri.fromParts(&quot;package&quot;, packageName, null)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; intent.data = uri
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestManageExternalStorage.launch(intent)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 권한이 이미 부여됨
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Toast.makeText(LocalContext.current, &quot;MANAGE_EXTERNAL_STORAGE 권한이 이미 부여되었습니다.&quot;, Toast.LENGTH_SHORT).show()
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;/pre&gt;&lt;p&gt;권한 허용 스위치 컨트롤을 탭하여 on햇을시 위 이미지처럼 권한설정 창은 종료되게하고싶습니다. 어떻게해야하나요?&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104642/switch-on%EC%8B%9C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0%EB%A5%BC-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B3%A0%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4</guid>
<pubDate>Fri, 08 Aug 2025 12:29:23 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>구글 콘솔에서 버전 올리고 심사 통과된 개시 대기버전 질문이용</title>
<link>http://www.masterqna.com/android/104551/%EA%B5%AC%EA%B8%80-%EC%BD%98%EC%86%94%EC%97%90%EC%84%9C-%EB%B2%84%EC%A0%84-%EC%98%AC%EB%A6%AC%EA%B3%A0-%EC%8B%AC%EC%82%AC-%ED%86%B5%EA%B3%BC%EB%90%9C-%EA%B0%9C%EC%8B%9C-%EB%8C%80%EA%B8%B0%EB%B2%84%EC%A0%84-%EC%A7%88%EB%AC%B8%EC%9D%B4%EC%9A%A9?show=104641#a104641</link>
<description>같은 트랙 즉, 프러덕션에서 여러 버전을 대기해둘 수는 있지만, 바로바로 교체해서 스위치하는 형태의 배포는 불가합니다.&lt;br /&gt;
즉, A1버전이 심사 통과하고 게시 대기 상태에서&lt;br /&gt;
A2 버전을 올리고 심사통과가 되면 A2가 게시 대기 상태가 되고 A1의 게시 대기 상태를 대체하게 됩니다.&lt;br /&gt;
&lt;br /&gt;
구글 정책상 같은 트랙에서는 하나만 배포 대기 상태로 둘 수 있어요.&lt;br /&gt;
그래서 다른 트랙에서 둘다 대기 상태로 두고 프로덕션을 게시했더니 문제가 생기면&lt;br /&gt;
테스트 트렉을 프로덕션으로 승격시킨뒤 배포 하는 방법이 있습니다. 다만 실시간으로 바로 나갈 수 없을겁니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104551/%EA%B5%AC%EA%B8%80-%EC%BD%98%EC%86%94%EC%97%90%EC%84%9C-%EB%B2%84%EC%A0%84-%EC%98%AC%EB%A6%AC%EA%B3%A0-%EC%8B%AC%EC%82%AC-%ED%86%B5%EA%B3%BC%EB%90%9C-%EA%B0%9C%EC%8B%9C-%EB%8C%80%EA%B8%B0%EB%B2%84%EC%A0%84-%EC%A7%88%EB%AC%B8%EC%9D%B4%EC%9A%A9?show=104641#a104641</guid>
<pubDate>Wed, 30 Jul 2025 05:32:41 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>이미지를 바이트스트림 형태로 DB에 저장하는 게 나쁜 방법일까요?</title>
<link>http://www.masterqna.com/android/104579/%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%8A%A4%ED%8A%B8%EB%A6%BC-%ED%98%95%ED%83%9C%EB%A1%9C-db%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EA%B2%8C-%EB%82%98%EC%81%9C-%EB%B0%A9%EB%B2%95%EC%9D%BC%EA%B9%8C%EC%9A%94?show=104640#a104640</link>
<description>보통 바이트 스트림 형태로 저장하는게 나쁘지만은 안습니다.&lt;br /&gt;
&lt;br /&gt;
간혹 간단한 소용량의 썸네일이나 QR코드 이미지등은 그렇게 설계하는 편입니다.&lt;br /&gt;
&lt;br /&gt;
다만, 요즘 활성화 되어있는 고 품질의 카메라에서 촬영되는 고용량 이미지등은 나쁜 설계 방식이라고 볼수있을 것 같아요.&lt;br /&gt;
&lt;br /&gt;
왜냐면 단점이 너무 많습니다.&lt;br /&gt;
&lt;br /&gt;
확장성도 안좋고 그 이미지 바이스 스트림때문에, 부하가 걸리고 성능이 너무 떨어지게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
참고하셔서 잘 판단하세요 ^^</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104579/%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%8A%A4%ED%8A%B8%EB%A6%BC-%ED%98%95%ED%83%9C%EB%A1%9C-db%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EA%B2%8C-%EB%82%98%EC%81%9C-%EB%B0%A9%EB%B2%95%EC%9D%BC%EA%B9%8C%EC%9A%94?show=104640#a104640</guid>
<pubDate>Wed, 30 Jul 2025 05:25:09 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>아래 쪽에 있는 변수를 위로 가져오기</title>
<link>http://www.masterqna.com/android/104591/%EC%95%84%EB%9E%98-%EC%AA%BD%EC%97%90-%EC%9E%88%EB%8A%94-%EB%B3%80%EC%88%98%EB%A5%BC-%EC%9C%84%EB%A1%9C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0?show=104639#a104639</link>
<description>onCreate는 메인액티비티의 오버라이드 함수이고 마지막 변수는 포토라는 어싱크 타스크의 이너 클래스 내부에 있는 온포스트 익스큐트 오버라이드 함수입니다.&lt;br /&gt;
메인 액티비티에 전역으로 변수를 선언한다고 하더라도 이너클래스 변수를 공유할수 없습니다.&lt;br /&gt;
차라리 공통 유틸 오브젝트 클래스 하나 만드셔서 거기에 변수 선언하시고&lt;br /&gt;
그 유틸클래스 변수를 참조하셔서 사용하시면 좋을듯 합니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104591/%EC%95%84%EB%9E%98-%EC%AA%BD%EC%97%90-%EC%9E%88%EB%8A%94-%EB%B3%80%EC%88%98%EB%A5%BC-%EC%9C%84%EB%A1%9C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0?show=104639#a104639</guid>
<pubDate>Wed, 30 Jul 2025 05:15:20 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>파일 관련 질문입니다.</title>
<link>http://www.masterqna.com/android/104627/%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104630#a104630</link>
<description>data/data/{package} 형식 말구 Environment 를 이용해보세요</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104627/%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104630#a104630</guid>
<pubDate>Wed, 21 May 2025 03:56:45 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>프래그먼트에서 다른 앱 호출 방법</title>
<link>http://www.masterqna.com/android/104476/%ED%94%84%EB%9E%98%EA%B7%B8%EB%A8%BC%ED%8A%B8%EC%97%90%EC%84%9C-%EB%8B%A4%EB%A5%B8-%EC%95%B1-%ED%98%B8%EC%B6%9C-%EB%B0%A9%EB%B2%95?show=104477#a104477</link>
<description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/training/basics/intents&quot;&gt;https://developer.android.com/training/basics/intents&lt;/a&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104476/%ED%94%84%EB%9E%98%EA%B7%B8%EB%A8%BC%ED%8A%B8%EC%97%90%EC%84%9C-%EB%8B%A4%EB%A5%B8-%EC%95%B1-%ED%98%B8%EC%B6%9C-%EB%B0%A9%EB%B2%95?show=104477#a104477</guid>
<pubDate>Sun, 02 Mar 2025 17:35:48 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
<item>
<title>Play Asset Delivery로 묶여잇는 동영상은 무얼루 재생할수잇나요?</title>
<link>http://www.masterqna.com/android/104556/play-asset-delivery%EB%A1%9C-%EB%AC%B6%EC%97%AC%EC%9E%87%EB%8A%94-%EB%8F%99%EC%98%81%EC%83%81%EC%9D%80-%EB%AC%B4%EC%96%BC%EB%A3%A8-%EC%9E%AC%EC%83%9D%ED%95%A0%EC%88%98%EC%9E%87%EB%82%98%EC%9A%94?show=104557#a104557</link>
<description>&lt;p&gt;지원 안되는 형식(ex rdp:// )이라면, DataSource 클래스를 상속 받는 CustomDataSource 를 만들어도 되겠지만,&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 경우에는 createPackageContext(&quot;com.example.app&quot;, 0) 로 생성한 context를&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/donparapidos/ExoPlayer/blob/master/library/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java&quot;&gt;AssetDataSource.java&lt;/a&gt;&amp;nbsp; 로 넘겨&amp;nbsp;AssetDataSource 로 재생하게만 수정하시면 될 듯 합니다.&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104556/play-asset-delivery%EB%A1%9C-%EB%AC%B6%EC%97%AC%EC%9E%87%EB%8A%94-%EB%8F%99%EC%98%81%EC%83%81%EC%9D%80-%EB%AC%B4%EC%96%BC%EB%A3%A8-%EC%9E%AC%EC%83%9D%ED%95%A0%EC%88%98%EC%9E%87%EB%82%98%EC%9A%94?show=104557#a104557</guid>
<pubDate>Sun, 02 Mar 2025 17:35:45 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>AnimatedVisibility 질문입니다</title>
<link>http://www.masterqna.com/android/104575/animatedvisibility-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4</link>
<description>@Composable&lt;br /&gt;
fun AnimatedVisibilityWithCustomAnimation() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var isVisible by remember { mutableStateOf(false) }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Box(modifier = Modifier.fillMaxSize()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AnimatedVisibility(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visible = isVisible,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;modifier = Modifier.align(Alignment.TopCenter),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enter = slideInVertically(initialOffsetY = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-it&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit = slideOutVertically(targetOffsetY = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-it&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Box(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;modifier = Modifier&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.size(100.dp)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.clip(CircleShape)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.background(Color.Blue)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;modifier = Modifier&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.align(Alignment.BottomCenter)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillMaxWidth()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.padding(horizontal = 30.dp, vertical = 50.dp)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.height(50.dp),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onClick = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isVisible = isVisible.not()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Text(text = &amp;quot;Visibility 변경하기&amp;quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
버튼을 누르면 동그라미가 내려오고 다시 버튼을 누르면 동그라미가 올라갑니다&lt;br /&gt;
&lt;br /&gt;
버튼 한번ㄴ으로 동그라미가 내려오고 올라갈수잇게 어떻게하나요?</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104575/animatedvisibility-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4</guid>
<pubDate>Tue, 14 Jan 2025 09:27:37 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>폰으로 4k 60fps 동영상 촬영하는데 화면이 계속켜져있지않고 녹화하는방법이 있나요?ㅠㅠ배터리랑 잔상때문에요</title>
<link>http://www.masterqna.com/android/104574/%ED%8F%B0%EC%9C%BC%EB%A1%9C-4k-60fps-%EB%8F%99%EC%98%81%EC%83%81-%EC%B4%AC%EC%98%81%ED%95%98%EB%8A%94%EB%8D%B0-%ED%99%94%EB%A9%B4%EC%9D%B4-%EA%B3%84%EC%86%8D%EC%BC%9C%EC%A0%B8%EC%9E%88%EC%A7%80%EC%95%8A%EA%B3%A0-%EB%85%B9%ED%99%94%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95%EC%9D%B4-%EC%9E%88%EB%82%98%EC%9A%94-%E3%85%A0%E3%85%A0%EB%B0%B0%ED%84%B0%EB%A6%AC%EB%9E%91-%EC%9E%94%EC%83%81%EB%95%8C%EB%AC%B8%EC%97%90%EC%9A%94</link>
<description>녹화할수가 있을까요...</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104574/%ED%8F%B0%EC%9C%BC%EB%A1%9C-4k-60fps-%EB%8F%99%EC%98%81%EC%83%81-%EC%B4%AC%EC%98%81%ED%95%98%EB%8A%94%EB%8D%B0-%ED%99%94%EB%A9%B4%EC%9D%B4-%EA%B3%84%EC%86%8D%EC%BC%9C%EC%A0%B8%EC%9E%88%EC%A7%80%EC%95%8A%EA%B3%A0-%EB%85%B9%ED%99%94%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95%EC%9D%B4-%EC%9E%88%EB%82%98%EC%9A%94-%E3%85%A0%E3%85%A0%EB%B0%B0%ED%84%B0%EB%A6%AC%EB%9E%91-%EC%9E%94%EC%83%81%EB%95%8C%EB%AC%B8%EC%97%90%EC%9A%94</guid>
<pubDate>Mon, 13 Jan 2025 14:41:53 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>중국 마켓에 앱을 출시할 때 애드몹 대신 어떤 광고 플랫폼을 사용해야 하나요?</title>
<link>http://www.masterqna.com/android/79604/%EC%A4%91%EA%B5%AD-%EB%A7%88%EC%BC%93%EC%97%90-%EC%95%B1%EC%9D%84-%EC%B6%9C%EC%8B%9C%ED%95%A0-%EB%95%8C-%EC%95%A0%EB%93%9C%EB%AA%B9-%EB%8C%80%EC%8B%A0-%EC%96%B4%EB%96%A4-%EA%B4%91%EA%B3%A0-%ED%94%8C%EB%9E%AB%ED%8F%BC%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94?show=104567#a104567</link>
<description>엇... 아주 오래전에 글이네요.&lt;br /&gt;
&lt;br /&gt;
저도 이번에 필요해서 한번 찾아봤는데 답글이 없군요 ㅠㅠ...&lt;br /&gt;
&lt;br /&gt;
혹시 어떤 것 사용하셨는지 알려주실수있을까요 ㅠㅠ?&lt;br /&gt;
&lt;br /&gt;
너무 오래되서 보실지 모르겠네요..;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/79604/%EC%A4%91%EA%B5%AD-%EB%A7%88%EC%BC%93%EC%97%90-%EC%95%B1%EC%9D%84-%EC%B6%9C%EC%8B%9C%ED%95%A0-%EB%95%8C-%EC%95%A0%EB%93%9C%EB%AA%B9-%EB%8C%80%EC%8B%A0-%EC%96%B4%EB%96%A4-%EA%B4%91%EA%B3%A0-%ED%94%8C%EB%9E%AB%ED%8F%BC%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94?show=104567#a104567</guid>
<pubDate>Tue, 31 Dec 2024 08:12:32 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>Paging3 로드 시 화면 번쩍 거림에 대해 질문합니다!!!</title>
<link>http://www.masterqna.com/android/104558/paging3-%EB%A1%9C%EB%93%9C-%EC%8B%9C-%ED%99%94%EB%A9%B4-%EB%B2%88%EC%A9%8D-%EA%B1%B0%EB%A6%BC%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8%ED%95%A9%EB%8B%88%EB%8B%A4?show=104561#a104561</link>
<description>혹시 Stability 이슈는 아닌지 확인해 보세요.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://developer.android.com/develop/ui/compose/performance/stability/fix&quot; rel=&quot;nofollow&quot;&gt;https://developer.android.com/develop/ui/compose/performance/stability/fix&lt;/a&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104558/paging3-%EB%A1%9C%EB%93%9C-%EC%8B%9C-%ED%99%94%EB%A9%B4-%EB%B2%88%EC%A9%8D-%EA%B1%B0%EB%A6%BC%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8%ED%95%A9%EB%8B%88%EB%8B%A4?show=104561#a104561</guid>
<pubDate>Fri, 20 Dec 2024 03:31:00 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>앱린이라 도움받고싶어서 여기저기 찾아보다 왔습니다,,,</title>
<link>http://www.masterqna.com/android/104550/%EC%95%B1%EB%A6%B0%EC%9D%B4%EB%9D%BC-%EB%8F%84%EC%9B%80%EB%B0%9B%EA%B3%A0%EC%8B%B6%EC%96%B4%EC%84%9C-%EC%97%AC%EA%B8%B0%EC%A0%80%EA%B8%B0-%EC%B0%BE%EC%95%84%EB%B3%B4%EB%8B%A4-%EC%99%94%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104552#a104552</link>
<description>먼저 코틀린(자바)를 배우세요. 구글에서 제공하는 코스를 하나씩 해나가보시는 것도 나쁘지 않을 것 같구요. &lt;a href=&quot;https://developer.android.com/courses&quot; rel=&quot;nofollow&quot;&gt;https://developer.android.com/courses&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
안드로이드 시스템에 대한 기본적인 이해가 생겼다면, TODO 앱같은 간단한 앱을 처음부터 끝까지 완성해 보세요. 한페이지 짜리도 좋습니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104550/%EC%95%B1%EB%A6%B0%EC%9D%B4%EB%9D%BC-%EB%8F%84%EC%9B%80%EB%B0%9B%EA%B3%A0%EC%8B%B6%EC%96%B4%EC%84%9C-%EC%97%AC%EA%B8%B0%EC%A0%80%EA%B8%B0-%EC%B0%BE%EC%95%84%EB%B3%B4%EB%8B%A4-%EC%99%94%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104552#a104552</guid>
<pubDate>Wed, 27 Nov 2024 09:44:38 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>rememberSaveable 에는 배열 넣으면안되나요?</title>
<link>http://www.masterqna.com/android/104543/remembersaveable-%EC%97%90%EB%8A%94-%EB%B0%B0%EC%97%B4-%EB%84%A3%EC%9C%BC%EB%A9%B4%EC%95%88%EB%90%98%EB%82%98%EC%9A%94?show=104549#a104549</link>
<description>&lt;p&gt;그리고 아래처럼 분리를 하시면 코드가 눈에 더 쉽게 들어오실 겁니다.&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.runtime.*
import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column

@Composable
fun Greeting() {
    var textColors by rememberSaveable { mutableStateListOf(*(0..4).map { Color.Red }.toTypedArray()) }

    Column {
        textColors.forEachIndexed { index, textColor -&amp;gt;
            GreetingCard(
                id = index,
                text = &quot;Hello&quot;,
                textColor = textColor
            ) { idx -&amp;gt;
                textColors[idx] = if (textColor == Color.Red) Color.White else Color.Red
            }
        } 
    }
}

// LazyColumn version
@Composable
fun GreetingLazy() {
    var textColors by rememberSaveable { mutableStateListOf(*(0..4).map { Color.Red }.toTypedArray()) }

    LazyColumn {
        itemsIndexed(textColors) { index, textColor -&amp;gt;
            GreetingCard(
                id = index,
                text = &quot;Hello&quot;,
                textColor = textColor
            ) { idx -&amp;gt;
                textColors[idx] = if (textColor == Color.Red) Color.White else Color.Red
            }
        }
    }
}

@Composable
fun GreetingCard(id: Int, text: String, textColor: Color, onClick: (Int) -&amp;gt; Unit) {
    Card(modifier = Modifier.padding(15.dp)) {
        Box(
            modifier = Modifier
                .padding(15.dp)
                .clickable {
                    onClick(id)
                }
        ) {
            Text(
                text = &quot;Hello&quot;,
                color = textColor
            )
        }
    }
}
&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104543/remembersaveable-%EC%97%90%EB%8A%94-%EB%B0%B0%EC%97%B4-%EB%84%A3%EC%9C%BC%EB%A9%B4%EC%95%88%EB%90%98%EB%82%98%EC%9A%94?show=104549#a104549</guid>
<pubDate>Mon, 25 Nov 2024 08:32:28 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
<item>
<title>HomeActivity에서 MedicalRecordActivity로 넘어갈때 오류</title>
<link>http://www.masterqna.com/android/104541/homeactivity%EC%97%90%EC%84%9C-medicalrecordactivity%EB%A1%9C-%EB%84%98%EC%96%B4%EA%B0%88%EB%95%8C-%EC%98%A4%EB%A5%98?show=104546#a104546</link>
<description>어떤 에러가 나는지 먼저 체크하셔야 할 듯합니다. 말씀하신 걸로 봐서는 CommunityActivity에 저장했던 데이터를 불러오는 것 같은데, 이 부분에 문제가 있는 것으로 보여지기는 합니다. 에러 로그를 보시고 판단하시는게 빠를 것 같습니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104541/homeactivity%EC%97%90%EC%84%9C-medicalrecordactivity%EB%A1%9C-%EB%84%98%EC%96%B4%EA%B0%88%EB%95%8C-%EC%98%A4%EB%A5%98?show=104546#a104546</guid>
<pubDate>Sun, 17 Nov 2024 02:09:36 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>안드로이드 키 이벤트..</title>
<link>http://www.masterqna.com/android/104535/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%82%A4-%EC%9D%B4%EB%B2%A4%ED%8A%B8?show=104537#a104537</link>
<description>&lt;p&gt;제일 먼저 시도해 볼 수 있는 것은 Activity의 dispatchKeyEvent를 이용해 처리하는 겁니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;override fun dispatchKeyEvent(event: KeyEvent): Boolean {
    if (event.action == KeyEvent.ACTION_DOWN) {
        when (event.keyCode) {
            KeyEvent.KEYCODE_YOUR_REMOTE_BUTTON -&amp;gt; {
                performCommonAction()
                return true
            }
        }
    }
    return super.dispatchKeyEvent(event)
}
&lt;/pre&gt;&lt;p&gt;액티비티가 여러개라면 BaseActivity 를 만들어서 상속을 받도록 하시면 될 것 같습니다.&lt;br&gt;&lt;br&gt;다른 접근 방법으로는 BroadcastReceiver를 이용하여 리모트 콘트롤의 입력값이 들어오는 걸 처리할 수 있을 것 같습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;class RemoteControlReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        if (action == &quot;com.example.ACTION_REMOTE_BUTTON&quot;) {
            performCommonAction(context)
        }
    }

    private fun performCommonAction(context: Context) {
        Toast.makeText(context, &quot;Remote button pressed!&quot;, Toast.LENGTH_SHORT).show()
    }
}
&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104535/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%82%A4-%EC%9D%B4%EB%B2%A4%ED%8A%B8?show=104537#a104537</guid>
<pubDate>Tue, 05 Nov 2024 12:41:17 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
<item>
<title>wear os 에서 fit 구현하기 관련 ...</title>
<link>http://www.masterqna.com/android/104525/wear-os-%EC%97%90%EC%84%9C-fit-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-%EA%B4%80%EB%A0%A8</link>
<description>&lt;p&gt;private val fitnessOptions = FitnessOptions.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .addDataType(DataType.&lt;em&gt;TYPE_HEART_RATE_BPM&lt;/em&gt;, FitnessOptions.&lt;em&gt;ACCESS_READ&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .build()&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;private val googleSignInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) &lt;strong&gt;{ &lt;/strong&gt;result &lt;strong&gt;-&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;/strong&gt;Log.d(&quot;debug1&quot;, &quot;Result code: ${result.&lt;em&gt;resultCode&lt;/em&gt;}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Data: ${result.&lt;em&gt;data&lt;/em&gt;}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; when (result.&lt;em&gt;resultCode&lt;/em&gt;) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;em&gt;RESULT_OK &lt;/em&gt;-&amp;gt; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; val task = GoogleSignIn.getSignedInAccountFromIntent(result.&lt;em&gt;data&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; val account = task.getResult(ApiException::class.&lt;em&gt;java&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Google Sign-In successful. Email: ${account.&lt;em&gt;email&lt;/em&gt;}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; accessGoogleFit()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (e: ApiException) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.e(&quot;debug1&quot;, &quot;Google Sign-In failed. Status code: ${e.&lt;em&gt;statusCode&lt;/em&gt;}&quot;, e)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Show error to user&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Toast.makeText(this, &quot;Google Sign-In failed: ${e.message}&quot;, Toast.LENGTH_LONG).show()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;em&gt;RESULT_CANCELED &lt;/em&gt;-&amp;gt; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.e(&quot;debug1&quot;, &quot;Google Sign-In was canceled by user&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Toast.makeText(this, &quot;Sign-in canceled&quot;, Toast.LENGTH_SHORT).show()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else -&amp;gt; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.e(&quot;debug1&quot;, &quot;Google Sign-In failed with result code: ${result.&lt;em&gt;resultCode&lt;/em&gt;}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Toast.makeText(this, &quot;Sign-in failed&quot;, Toast.LENGTH_SHORT).show()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) &lt;strong&gt;{ &lt;/strong&gt;isGranted &lt;strong&gt;-&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;/strong&gt;if (isGranted) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; accessGoogleFit()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; } else {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.e(&quot;debug1&quot;, &quot;Body sensors permission denied&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;private fun checkPermissionsAndAccessGoogleFit() {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Checking BODY_SENSORS permission&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if (ContextCompat.checkSelfPermission(this, Manifest.permission.&lt;em&gt;BODY_SENSORS&lt;/em&gt;) == PackageManager.&lt;em&gt;PERMISSION_GRANTED&lt;/em&gt;) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Permission granted&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; accessGoogleFit()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; } else {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Permission not granted&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestPermissionLauncher.launch(Manifest.permission.&lt;em&gt;BODY_SENSORS&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;private fun accessGoogleFit() {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;accessGoogleFit&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val account = GoogleSignIn.getAccountForExtension(this, fitnessOptions)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Requesting Google Sign-In&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.&lt;em&gt;DEFAULT_SIGN_IN&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .requestEmail()&amp;nbsp; // 이메일 권한 추가&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .requestScopes(Scope(&quot;&lt;a href=&quot;https://www.googleapis.com/auth/fitness.activity.read&quot;))&quot; rel=&quot;nofollow&quot;&gt;https://www.googleapis.com/auth/fitness.activity.read&quot;))&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .requestScopes(Scope(&quot;&lt;a href=&quot;https://www.googleapis.com/auth/fitness.body.read&quot;))&quot; rel=&quot;nofollow&quot;&gt;https://www.googleapis.com/auth/fitness.body.read&quot;))&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .requestScopes(Scope(&quot;&lt;a href=&quot;https://www.googleapis.com/auth/fitness.heart_rate.read&quot;))&quot; rel=&quot;nofollow&quot;&gt;https://www.googleapis.com/auth/fitness.heart_rate.read&quot;))&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .build()&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; val googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; googleSignInLauncher.launch(googleSignInClient.&lt;em&gt;signInIntent&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (e: Exception) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.e(&quot;debug1&quot;, &quot;Error launching sign-in&quot;, e)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Toast.makeText(this, &quot;Error launching sign-in: ${e.message}&quot;, Toast.LENGTH_LONG).show()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; } else {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.d(&quot;debug1&quot;, &quot;Google Sign-In permissions already granted&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subscribeToHeartRateData()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;private fun subscribeToHeartRateData() {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Fitness.getRecordingClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .subscribe(DataType.&lt;em&gt;TYPE_HEART_RATE_BPM&lt;/em&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .addOnSuccessListener &lt;strong&gt;{&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/strong&gt;Log.i(&quot;debug1&quot;, &quot;Successfully subscribed to heart rate data&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; readHeartRateData()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/strong&gt;.addOnFailureListener &lt;strong&gt;{ &lt;/strong&gt;e &lt;strong&gt;-&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/strong&gt;Log.e(&quot;debug1&quot;, &quot;Failed to subscribe to heart rate data&quot;, e)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;….. readHeartRateData ….&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;override fun onCreate(savedInstanceState: Bundle?) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;em&gt;installSplashScreen&lt;/em&gt;()&lt;/p&gt;&lt;p&gt;….&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;/strong&gt;checkPermissionsAndAccessGoogleFit()&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Checking BODY_SENSORS permission&lt;/p&gt;&lt;p&gt;Permission granted&lt;/p&gt;&lt;p&gt;accessGoogleFit&lt;/p&gt;&lt;p&gt;Requesting Google Sign-In&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;——&amp;gt; 여기서 워치에서 메일계정 로그인&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Result code: 0&lt;/p&gt;&lt;p&gt;Data: Intent { (has extras) }&lt;/p&gt;&lt;p&gt;Google Sign-In was canceled by user&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이렇게 실패가 떨어집니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;오늘&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Google Fit API&lt;/strong&gt;가 활성화 했고요 .&lt;/p&gt;&lt;p&gt;월래 앱에서는 구글로그인을 사용하고 있었습니다.&lt;/p&gt;&lt;p&gt;app / wear os app - 의 패키징을 동일하게 처리했습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;혹시 제가 빠트린 부분이 있을까요?&lt;/p&gt;&lt;p&gt;조언 구합니다.&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104525/wear-os-%EC%97%90%EC%84%9C-fit-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-%EA%B4%80%EB%A0%A8</guid>
<pubDate>Fri, 25 Oct 2024 04:28:54 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>앱 화면(레이아웃) 축소/확대 기능버튼 없애는 방법</title>
<link>http://www.masterqna.com/android/104487/%EC%95%B1-%ED%99%94%EB%A9%B4-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EC%B6%95%EC%86%8C-%ED%99%95%EB%8C%80-%EA%B8%B0%EB%8A%A5%EB%B2%84%ED%8A%BC-%EC%97%86%EC%95%A0%EB%8A%94-%EB%B0%A9%EB%B2%95?show=104489#a104489</link>
<description>찾아 보니까 해당 버튼은 Zoom Control이구요. 애뮬레이터에 따라 지원되는 기능인 것 같습니다. 새로운 애뮬레이터를 만들어 보세요.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104487/%EC%95%B1-%ED%99%94%EB%A9%B4-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EC%B6%95%EC%86%8C-%ED%99%95%EB%8C%80-%EA%B8%B0%EB%8A%A5%EB%B2%84%ED%8A%BC-%EC%97%86%EC%95%A0%EB%8A%94-%EB%B0%A9%EB%B2%95?show=104489#a104489</guid>
<pubDate>Mon, 07 Oct 2024 11:41:14 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>recyclerview item이 View 내부에 특정 위치를 지날때 부분 투명화 적용 질문</title>
<link>http://www.masterqna.com/android/104475/recyclerview-item%EC%9D%B4-view-%EB%82%B4%EB%B6%80%EC%97%90-%ED%8A%B9%EC%A0%95-%EC%9C%84%EC%B9%98%EB%A5%BC-%EC%A7%80%EB%82%A0%EB%95%8C-%EB%B6%80%EB%B6%84-%ED%88%AC%EB%AA%85%ED%99%94-%EC%A0%81%EC%9A%A9-%EC%A7%88%EB%AC%B8?show=104479#a104479</link>
<description>RecyclerView 아이템은 &lt;a href=&quot;https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator&quot; rel=&quot;nofollow&quot;&gt;https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator&lt;/a&gt; 를 이용해서 애니메이션을 적용하시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
Android RecyclerView Item animation 키워드로 찾아보시면 많은 예제가 있을 겁니다. 찾으신 애니메이션을 Item animation을 이용해서 적용하시면 됩니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104475/recyclerview-item%EC%9D%B4-view-%EB%82%B4%EB%B6%80%EC%97%90-%ED%8A%B9%EC%A0%95-%EC%9C%84%EC%B9%98%EB%A5%BC-%EC%A7%80%EB%82%A0%EB%95%8C-%EB%B6%80%EB%B6%84-%ED%88%AC%EB%AA%85%ED%99%94-%EC%A0%81%EC%9A%A9-%EC%A7%88%EB%AC%B8?show=104479#a104479</guid>
<pubDate>Wed, 02 Oct 2024 09:59:13 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>google Admob 의 Native 광고에서 미디어뷰 비율 이슈</title>
<link>http://www.masterqna.com/android/104478/google-admob-%EC%9D%98-native-%EA%B4%91%EA%B3%A0%EC%97%90%EC%84%9C-%EB%AF%B8%EB%94%94%EC%96%B4%EB%B7%B0-%EB%B9%84%EC%9C%A8-%EC%9D%B4%EC%8A%88</link>
<description>&lt;pre class=&quot;brush:java;&quot;&gt;&amp;lt;com.google.android.gms.ads.nativead.MediaView
            android:id=&quot;@+id/mv_custom&quot;
            android:layout_marginBottom=&quot;@dimen/customPidContentsPadding&quot;
            android:visibility=&quot;gone&quot;
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;wrap_content&quot;/&amp;gt;&lt;/pre&gt;&lt;p&gt;이렇게 xml 에 선언하고 사용중인데&lt;br&gt;&lt;br&gt;미디어뷰의 height 가 완전 크게 될 때도 한 175dp? 정도 될때도 있고 제멋대로 더라구요&lt;br&gt;&lt;br&gt;전 항상 200dp 로 고정 한 뒤 그에 맞춰서 미디어 뷰도 짤리거나 모자람 없이 꽉 들어찬 비율로 세팅하고싶은데&lt;br&gt;&lt;br&gt;어떻게 해야할까요?&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104478/google-admob-%EC%9D%98-native-%EA%B4%91%EA%B3%A0%EC%97%90%EC%84%9C-%EB%AF%B8%EB%94%94%EC%96%B4%EB%B7%B0-%EB%B9%84%EC%9C%A8-%EC%9D%B4%EC%8A%88</guid>
<pubDate>Wed, 02 Oct 2024 06:27:21 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>최상단 화면 클래스명 이름 알기</title>
<link>http://www.masterqna.com/android/104439/%EC%B5%9C%EC%83%81%EB%8B%A8-%ED%99%94%EB%A9%B4-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%AA%85-%EC%9D%B4%EB%A6%84-%EC%95%8C%EA%B8%B0?show=104445#a104445</link>
<description>getClass().simpleName?</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104439/%EC%B5%9C%EC%83%81%EB%8B%A8-%ED%99%94%EB%A9%B4-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%AA%85-%EC%9D%B4%EB%A6%84-%EC%95%8C%EA%B8%B0?show=104445#a104445</guid>
<pubDate>Mon, 23 Sep 2024 11:37:31 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>구글 스토어 리젝사유 질문입니다.</title>
<link>http://www.masterqna.com/android/104466/%EA%B5%AC%EA%B8%80-%EC%8A%A4%ED%86%A0%EC%96%B4-%EB%A6%AC%EC%A0%9D%EC%82%AC%EC%9C%A0-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104468#a104468</link>
<description>리젝당할 경우는 리젝 사유가 반드시 있을 겁니다. 해당 버튼에 기능이 없는게 이유가 맞는지는 모르겠지만, 맞다면 수정하셔야 겠죠. 구글 정책은 계속 변경/강화 되기 때문에 업데이트 되는 내용을 잘 확인하셔야 합니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104466/%EA%B5%AC%EA%B8%80-%EC%8A%A4%ED%86%A0%EC%96%B4-%EB%A6%AC%EC%A0%9D%EC%82%AC%EC%9C%A0-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104468#a104468</guid>
<pubDate>Thu, 19 Sep 2024 09:00:36 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>MVVM 패턴에 대해 질문이 있습니다.</title>
<link>http://www.masterqna.com/android/104460/mvvm-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8%EC%9D%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104463#a104463</link>
<description>액티비티, 프래그먼트는 뷰라고 하기에는 적합하지 않은 많은 일을 하는 클래스입니다. 뷰라기 보다는 view controller에 가까울 것 같습니다. &amp;nbsp;intent의 경우는 안드로이드 시스템 디자인이 그렇게 된 것이라서 사용하는 것이기 때문에 MVVM의 View의 역할도 하지만 다른 것도 하기 때문에 다른 것으로 이해하시면 됩니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104460/mvvm-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8%EC%9D%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104463#a104463</guid>
<pubDate>Wed, 11 Sep 2024 09:26:44 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>.so파일 사용하기 질문입니다.</title>
<link>http://www.masterqna.com/android/104457/so%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104459#a104459</link>
<description>&lt;p&gt;&lt;strong&gt;jni wapper&amp;nbsp;를 만들어야 합니다.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;이하 chatgpt로 생성한 ffmpeg jni wapper 예제 입니다.&amp;nbsp;&lt;br&gt;chatgpt 특성상 동작 안 할 수는 있으나, 사용법은 비슷하니, 참조 하시라고 동봉 해 드립니다.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;안드로이드에서 libffmpeg.so의 avformat_open_input을 호출하기 위해서는, JNI (Java Native Interface) 래퍼를 만들어 C/C++ 코드를 자바 코드와 연결해야 합니다. 아래 단계에 따라 JNI 래퍼를 생성할 수 있습니다.&lt;/p&gt;&lt;p&gt;FFmpeg 컴파일 및 .so 파일 준비: 먼저 FFmpeg를 Android용으로 컴파일하여 libffmpeg.so 파일을 생성합니다. 이를 위해 FFmpeg 소스를 Android NDK 환경에서 빌드해야 합니다.&lt;/p&gt;&lt;p&gt;JNI 래퍼 생성: JNI는 자바 코드에서 C/C++ 네이티브 코드를 호출할 수 있게 해줍니다. 먼저 C/C++로 JNI 메서드를 구현한 후 자바에서 이를 호출하도록 연결합니다.&lt;/p&gt;&lt;p&gt;C/C++ 코드에서 FFmpeg 함수 호출: FFmpeg의 avformat_open_input과 같은 함수를 호출하는 코드를 작성합니다.&lt;/p&gt;&lt;p&gt;Step 1: Android.mk 및 CMakeLists.txt 설정&lt;br&gt;우선, Android NDK를 사용해 FFmpeg 라이브러리를 Android에 맞게 빌드한 후, Android 프로젝트의 jniLibs에 .so 파일을 포함해야 합니다. 그 다음, CMakeLists.txt나 Android.mk 파일에서 FFmpeg 라이브러리를 참조합니다.&lt;/p&gt;&lt;p&gt;cmake&lt;br&gt;코드 복사&lt;br&gt;# CMakeLists.txt 예시&lt;br&gt;cmake_minimum_required(VERSION 3.4.1)&lt;/p&gt;&lt;p&gt;add_library(ffmpeg-lib SHARED IMPORTED)&lt;br&gt;set_target_properties(ffmpeg-lib PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/armeabi-v7a/libffmpeg.so)&lt;/p&gt;&lt;p&gt;# native-lib.cpp 파일을 빌드&lt;br&gt;add_library(native-lib SHARED src/main/cpp/native-lib.cpp)&lt;/p&gt;&lt;p&gt;find_library(log-lib log)&lt;/p&gt;&lt;p&gt;target_link_libraries(native-lib ffmpeg-lib ${log-lib})&lt;br&gt;Step 2: JNI 네이티브 코드 작성&lt;br&gt;C/C++ 코드 (native-lib.cpp)&lt;br&gt;avformat_open_input를 호출하는 JNI 함수를 작성합니다. 먼저, FFmpeg 헤더 파일을 포함하고 JNI 함수를 정의합니다.&lt;/p&gt;&lt;p&gt;cpp&lt;br&gt;코드 복사&lt;br&gt;#include &amp;lt;jni.h&amp;gt;&lt;br&gt;#include &amp;lt;string&amp;gt;&lt;br&gt;#include &amp;lt;android/log.h&amp;gt;&lt;/p&gt;&lt;p&gt;extern &quot;C&quot; {&lt;br&gt;&amp;nbsp; &amp;nbsp; #include &quot;libavformat/avformat.h&quot;&lt;br&gt;}&lt;/p&gt;&lt;p&gt;#define LOG_TAG &quot;FFmpegJNI&quot;&lt;br&gt;#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)&lt;/p&gt;&lt;p&gt;extern &quot;C&quot; JNIEXPORT jint JNICALL&lt;br&gt;Java_com_example_myapp_FFmpegWrapper_avformatOpenInput(JNIEnv *env, jobject thiz, jstring input_path) {&lt;br&gt;&amp;nbsp; &amp;nbsp; const char *input_path_cstr = env-&amp;gt;GetStringUTFChars(input_path, nullptr);&lt;br&gt;&amp;nbsp; &amp;nbsp; AVFormatContext *format_context = nullptr;&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; // FFmpeg 함수 호출&lt;br&gt;&amp;nbsp; &amp;nbsp; int result = avformat_open_input(&amp;amp;format_context, input_path_cstr, nullptr, nullptr);&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; // 결과 확인&lt;br&gt;&amp;nbsp; &amp;nbsp; if (result &amp;lt; 0) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOGE(&quot;Could not open input: %s&quot;, input_path_cstr);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; env-&amp;gt;ReleaseStringUTFChars(input_path, input_path_cstr);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return result; // 에러 코드 리턴&lt;br&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; LOGE(&quot;Input opened successfully: %s&quot;, input_path_cstr);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // 리소스 정리&lt;br&gt;&amp;nbsp; &amp;nbsp; avformat_close_input(&amp;amp;format_context);&lt;br&gt;&amp;nbsp; &amp;nbsp; env-&amp;gt;ReleaseStringUTFChars(input_path, input_path_cstr);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return 0; // 성공적으로 열었을 경우&lt;br&gt;}&lt;br&gt;Step 3: 자바 래퍼 작성&lt;br&gt;자바 측에서 네이티브 함수를 호출할 수 있도록 JNI 래퍼를 자바 클래스에서 선언합니다.&lt;/p&gt;&lt;p&gt;java&lt;br&gt;코드 복사&lt;br&gt;package com.example.myapp;&lt;/p&gt;&lt;p&gt;public class FFmpegWrapper {&lt;br&gt;&amp;nbsp; &amp;nbsp; static {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.loadLibrary(&quot;native-lib&quot;); // 네이티브 라이브러리 로드&lt;br&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // 네이티브 메서드 선언&lt;br&gt;&amp;nbsp; &amp;nbsp; public native int avformatOpenInput(String inputPath);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // 래퍼 메서드&lt;br&gt;&amp;nbsp; &amp;nbsp; public int openInput(String path) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return avformatOpenInput(path);&lt;br&gt;&amp;nbsp; &amp;nbsp; }&lt;br&gt;}&lt;br&gt;Step 4: AndroidManifest 및 권한 설정&lt;br&gt;네이티브 라이브러리와 관련된 권한이나 설정을 추가합니다. 예를 들어, 파일 읽기를 위해 외부 저장소 권한이 필요할 수 있습니다.&lt;/p&gt;&lt;p&gt;xml&lt;br&gt;코드 복사&lt;br&gt;&amp;lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot; /&amp;gt;&lt;br&gt;Step 5: 네이티브 메서드 호출&lt;br&gt;FFmpegWrapper 클래스를 사용하여 자바에서 FFmpeg의 avformat_open_input를 호출할 수 있습니다.&lt;/p&gt;&lt;p&gt;java&lt;br&gt;코드 복사&lt;br&gt;FFmpegWrapper ffmpegWrapper = new FFmpegWrapper();&lt;br&gt;int result = ffmpegWrapper.openInput(&quot;/sdcard/sample.mp4&quot;);&lt;/p&gt;&lt;p&gt;if (result &amp;lt; 0) {&lt;br&gt;&amp;nbsp; &amp;nbsp; Log.e(&quot;FFmpeg&quot;, &quot;Failed to open input file.&quot;);&lt;br&gt;} else {&lt;br&gt;&amp;nbsp; &amp;nbsp; Log.i(&quot;FFmpeg&quot;, &quot;Input file opened successfully.&quot;);&lt;br&gt;}&lt;br&gt;이제 안드로이드에서 FFmpeg의 avformat_open_input을 호출할 수 있습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104457/so%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104459#a104459</guid>
<pubDate>Sat, 07 Sep 2024 05:51:23 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>릴스 영상 리사이클러뷰로 할 때</title>
<link>http://www.masterqna.com/android/104456/%EB%A6%B4%EC%8A%A4-%EC%98%81%EC%83%81-%EB%A6%AC%EC%82%AC%EC%9D%B4%ED%81%B4%EB%9F%AC%EB%B7%B0%EB%A1%9C-%ED%95%A0-%EB%95%8C</link>
<description>영상을 넘길 떄 스크롤 살짝 내리면 검정화면 이였다가 영상이 로드되고 스크롤 반쯤 갔을 때 부터 재생이 되는데&lt;br /&gt;
&lt;br /&gt;
스크롤 살짝 내렸을 때 검정화면이 아니라 영상 시작 화면이 정지해있다가 스크롤 반쯤 내려갔을 때 재생 되었으면 하는데&lt;br /&gt;
&lt;br /&gt;
검정화면 잠깐 뜨는걸 없애고 싶은데 이건 어떻게 해야 할까요 ?!&lt;br /&gt;
&lt;br /&gt;
썸네일을 보여주는걸까요 ? 다른 릴스들 보면 다음 재생화면이 바로 떠있다가 재생이 되는데&lt;br /&gt;
&lt;br /&gt;
어떻게 하는걸까요 ?!</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104456/%EB%A6%B4%EC%8A%A4-%EC%98%81%EC%83%81-%EB%A6%AC%EC%82%AC%EC%9D%B4%ED%81%B4%EB%9F%AC%EB%B7%B0%EB%A1%9C-%ED%95%A0-%EB%95%8C</guid>
<pubDate>Wed, 04 Sep 2024 06:29:16 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>인앱 결제 구현 에러 도와주세요</title>
<link>http://www.masterqna.com/android/104454/%EC%9D%B8%EC%95%B1-%EA%B2%B0%EC%A0%9C-%EA%B5%AC%ED%98%84-%EC%97%90%EB%9F%AC-%EB%8F%84%EC%99%80%EC%A3%BC%EC%84%B8%EC%9A%94?show=104455#a104455</link>
<description>테스터로 등록을 안하면 그렇게 떠요 &lt;br /&gt;
새로운 계정도 테스터 등록 하면 됩니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104454/%EC%9D%B8%EC%95%B1-%EA%B2%B0%EC%A0%9C-%EA%B5%AC%ED%98%84-%EC%97%90%EB%9F%AC-%EB%8F%84%EC%99%80%EC%A3%BC%EC%84%B8%EC%9A%94?show=104455#a104455</guid>
<pubDate>Wed, 04 Sep 2024 06:21:03 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>설치 앱 조회 및 앱 실행 방법</title>
<link>http://www.masterqna.com/android/104429/%EC%84%A4%EC%B9%98-%EC%95%B1-%EC%A1%B0%ED%9A%8C-%EB%B0%8F-%EC%95%B1-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95?show=104430#a104430</link>
<description>질문 내용은 ChatGPT나 구글 검색을 통해 확인 가능하실 겁니다.....&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
1. &lt;a href=&quot;https://jeomn.tistory.com/47&quot; rel=&quot;nofollow&quot;&gt;https://jeomn.tistory.com/47&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2. &lt;a href=&quot;https://imleaf.tistory.com/70&quot; rel=&quot;nofollow&quot;&gt;https://imleaf.tistory.com/70&lt;/a&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104429/%EC%84%A4%EC%B9%98-%EC%95%B1-%EC%A1%B0%ED%9A%8C-%EB%B0%8F-%EC%95%B1-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95?show=104430#a104430</guid>
<pubDate>Wed, 07 Aug 2024 01:35:56 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>TextInputLayout을 두개 사용하고 있는데 그중 하나가 setError가 작동하지 않습니다.</title>
<link>http://www.masterqna.com/android/67279/textinputlayout%EC%9D%84-%EB%91%90%EA%B0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EB%8D%B0-%EA%B7%B8%EC%A4%91-%ED%95%98%EB%82%98%EA%B0%80-seterror%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104425#a104425</link>
<description>안녕하세요 저도 지금 이 문제 때문에 진행이 더디고 있습니다. 혹시 해결하셨나요?</description>
<guid isPermaLink="true">http://www.masterqna.com/android/67279/textinputlayout%EC%9D%84-%EB%91%90%EA%B0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EB%8D%B0-%EA%B7%B8%EC%A4%91-%ED%95%98%EB%82%98%EA%B0%80-seterror%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104425#a104425</guid>
<pubDate>Mon, 05 Aug 2024 07:40:54 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>안드로이드 앱 출시 관련 질문입니다.</title>
<link>http://www.masterqna.com/android/104423/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EC%B6%9C%EC%8B%9C-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104424#a104424</link>
<description>고객정보가 서버로 가기 때문에 수집한다가 맞을 것 같은데, 동의를 하시기 어렵다면 아니오를 선택하시고, 구글에서 확인 메일이 오면 이유를 정확하게 설명하시면 됩니다.&lt;br /&gt;
암호화한다는 무조건 그렇다에 체크하세요.웹사이트가 https를 사용하고 계실 겁니다. http를 사용하는게 아니라면 암호화가 됩니다. 그리고 플레이스토어는 &amp;nbsp;AI에 의해 대부분 처리됙기 때문에 특별한 경우가 아니라면 일일이 응대를 받아주지는 않습니다. 연락처는 구굴링을 하시면 나올겁니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104423/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EC%B6%9C%EC%8B%9C-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104424#a104424</guid>
<pubDate>Sat, 03 Aug 2024 22:59:37 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>갤럭시 폴드 양쪽 화면에서 위젯 실행시 한쪽 먹통이 되요</title>
<link>http://www.masterqna.com/android/104422/%EA%B0%A4%EB%9F%AD%EC%8B%9C-%ED%8F%B4%EB%93%9C-%EC%96%91%EC%AA%BD-%ED%99%94%EB%A9%B4%EC%97%90%EC%84%9C-%EC%9C%84%EC%A0%AF-%EC%8B%A4%ED%96%89%EC%8B%9C-%ED%95%9C%EC%AA%BD-%EB%A8%B9%ED%86%B5%EC%9D%B4-%EB%90%98%EC%9A%94</link>
<description>갤럭시 폴드 메인화면(넓은화면)에서 위젯을꺼내서 실행하면 처음에는 실행이 되는데&lt;br /&gt;
&lt;br /&gt;
밖 화면(좁은화면)에서 위젯을 새로 꺼내서 실행하면 실행하면 밖은(좁은화면) 실행은 되는데 메인화면(넓은화면)에서는 앱을 클릭해도 동작을 하시 않습니다.&lt;br /&gt;
&lt;br /&gt;
반대로 밖 화면에서 위젯을 꺼내서 실행하면 처음에는 실행이 되는데 폴드 메인화면(넓은화면)에서 위젯을 꺼내서 실행한 후 밖 화면(좁은화면)에서 꺼내논 위젯을 클릭해도 동작을 하지 않습니다.&lt;br /&gt;
&lt;br /&gt;
즉 폴드 안쪽(넓은화면)과 바깥(좁은화면)화면 위젯 중 한쪽만 클릭 실행이 되고 한쪽은 클릭이 되지 않습니다.&lt;br /&gt;
&lt;br /&gt;
어떻게 해결해야 할까요?</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104422/%EA%B0%A4%EB%9F%AD%EC%8B%9C-%ED%8F%B4%EB%93%9C-%EC%96%91%EC%AA%BD-%ED%99%94%EB%A9%B4%EC%97%90%EC%84%9C-%EC%9C%84%EC%A0%AF-%EC%8B%A4%ED%96%89%EC%8B%9C-%ED%95%9C%EC%AA%BD-%EB%A8%B9%ED%86%B5%EC%9D%B4-%EB%90%98%EC%9A%94</guid>
<pubDate>Tue, 30 Jul 2024 08:03:58 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>AppcompatTextView vs Textview</title>
<link>http://www.masterqna.com/android/104418/appcompattextview-vs-textview?show=104419#a104419</link>
<description>안드로이드 단말 버젼에 따라 다르지만 &amp;nbsp;큰 차이 없습니다&lt;br /&gt;
android sdk 버젼이 올라가면서 디자인이나, 기능 추가로 인해 코드가 조금씩 바뀌다보니,&lt;br /&gt;
안드로이드 버젼별로 동일한 동작을 한다는 보장이 없고,&lt;br /&gt;
특정 sdk 버젼 이후로는 제공된 기능의 경우, 이전 sdk 버젼을 쓸 경우 지원이 안되는 이슈가 있었습니다.&lt;br /&gt;
&lt;br /&gt;
이러한 버젼별 이슈를 우회 하기 위해 &amp;nbsp;&amp;nbsp;v7, v13같이 특정 안드로이드 버젼 이상은 동일하게 지원하도록 Appcompat 같은 외부 라이브러리가 별도로 있다 보시면 됩니다. 한 5년 전까진 유용했는데, 버젼을 따지던 초창기 안드로이드 단말은 거의 사라졌고, &amp;nbsp;모든 버젼별 필요없는 ui 기능이 다 포함되어야 하다보니 apk 용량이 엄청 증가해서, 요즘은 &amp;nbsp;androidX 라이브러리로 넘어가는 추세입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://duzi077.tistory.com/317&quot; rel=&quot;nofollow&quot;&gt;https://duzi077.tistory.com/317&lt;/a&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104418/appcompattextview-vs-textview?show=104419#a104419</guid>
<pubDate>Wed, 24 Jul 2024 10:27:29 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>웹뷰 파일 다운로드 질문입니다.</title>
<link>http://www.masterqna.com/android/72011/%EC%9B%B9%EB%B7%B0-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104415#a104415</link>
<description>혹시 해결하셨나요?ㅠㅠ</description>
<guid isPermaLink="true">http://www.masterqna.com/android/72011/%EC%9B%B9%EB%B7%B0-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4?show=104415#a104415</guid>
<pubDate>Wed, 24 Jul 2024 07:52:24 +0000</pubDate>
<slash:comments>3</slash:comments>
</item>
<item>
<title>기본 bottom navagation bar 여부 확인</title>
<link>http://www.masterqna.com/android/104413/%EA%B8%B0%EB%B3%B8-bottom-navagation-bar-%EC%97%AC%EB%B6%80-%ED%99%95%EC%9D%B8?show=104414#a104414</link>
<description>Bottom navigation bar의 visibility를 값을 필요한 곳에서 접근할 수 있도록 하시면 될 것 같은데요. 앱 전체의 아키텍쳐를 어떻게 가져가느냐에 따라 구현방법은 적절하게 선택을 하셔야 겠죠.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104413/%EA%B8%B0%EB%B3%B8-bottom-navagation-bar-%EC%97%AC%EB%B6%80-%ED%99%95%EC%9D%B8?show=104414#a104414</guid>
<pubDate>Tue, 23 Jul 2024 09:24:40 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>github private 라이브러리 배포관련 질문입니다.</title>
<link>http://www.masterqna.com/android/104412/github-private-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%B0%B0%ED%8F%AC%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4</link>
<description>안녕하세요 지금 라이브러리를 구현후에 github에 private로 만들어서 운영하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
해당라이브러리를 gradle에 넣어 배포 하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;일단은 jitpack.io의 지원을 받아 배포에는 성공했으나 jitpack.io는 유료라서 jitpack.io를 사용하지 않고 구현하려합니다.&lt;br /&gt;
&lt;br /&gt;
혹시 어려운일일까요 ? &lt;br /&gt;
&lt;br /&gt;
아무리 찾아봐도 private는 &amp;nbsp;jipack.io가 없이는 불가능한거같아서요... 이쪽도 에러 나는거 보면 내부적으로 돌려서 배포하는것같은데. 아무리 찾아도 모르겠어서 질문드립니다ㅜㅜ</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104412/github-private-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%B0%B0%ED%8F%AC%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4</guid>
<pubDate>Mon, 22 Jul 2024 09:08:25 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>안드로이드 어플 아이콘과 배경화면 저작권에 관하여 질문 있습니다.</title>
<link>http://www.masterqna.com/android/104408/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%96%B4%ED%94%8C-%EC%95%84%EC%9D%B4%EC%BD%98%EA%B3%BC-%EB%B0%B0%EA%B2%BD%ED%99%94%EB%A9%B4-%EC%A0%80%EC%9E%91%EA%B6%8C%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC-%EC%A7%88%EB%AC%B8-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104410#a104410</link>
<description>그런 건 당연히 저작권이 존재하겠지요? 확실하게 하시려면 해당 구단에 문의하세요.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104408/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%96%B4%ED%94%8C-%EC%95%84%EC%9D%B4%EC%BD%98%EA%B3%BC-%EB%B0%B0%EA%B2%BD%ED%99%94%EB%A9%B4-%EC%A0%80%EC%9E%91%EA%B6%8C%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC-%EC%A7%88%EB%AC%B8-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104410#a104410</guid>
<pubDate>Thu, 18 Jul 2024 10:27:00 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>MVVM 개발중 Model의 역할 중 하나가 데이터를 저장하는 것인데 이해하기 어렵습니다.</title>
<link>http://www.masterqna.com/android/104407/mvvm-%EA%B0%9C%EB%B0%9C%EC%A4%91-model%EC%9D%98-%EC%97%AD%ED%95%A0-%EC%A4%91-%ED%95%98%EB%82%98%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EB%8D%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%96%B4%EB%A0%B5%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104409#a104409</link>
<description>MVx(MVC, MVP, MVVM) 패턴에서 M(Model)은 앱에서 필요한 데이터를 가져와(DB, Remote API등) 비지니스의 요구사항에 따른 로직을 처리하는 역할을 한다고 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
님의 예를 들면,&lt;br /&gt;
ViewModel에서는 화면에서 입력받은 데이터를 보관한고 있다가 사용자 정보를 저장할 때 Model에게 해당 데이터를 저장하도록 하면 됩니다. 이 때 사용자 정보의 유효성을 체크할 수도 있겠고 DB나 서버 등 비지니스 요구사항에 맞게 데이터를 저장하면 됩니다.&lt;br /&gt;
ViewModel는 뷰레이어에 해당하기 때문에 싱글톤을 사용하지 않습니다. 만약 입력받을 데이터가 여러 화면에서 들어오는 경우라면 ViewModel을 쉐어하던가 메모리 같은 임시저장소나 액티비티의 번들같은 곳에 저장할 수도 있고 &amp;nbsp;구현방법과 아이디어에 따라 다양한 방법이 존재할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
이 패턴들은 단지 추상적인 개념만 제공할 뿐 실제 구현은 개발자의 몫이기 때문에, 이걸 이해하는 관점에 따라 다르게 구현이 될 수 있고 하나의 정답이 존재하지 않습니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104407/mvvm-%EA%B0%9C%EB%B0%9C%EC%A4%91-model%EC%9D%98-%EC%97%AD%ED%95%A0-%EC%A4%91-%ED%95%98%EB%82%98%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EB%8D%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%96%B4%EB%A0%B5%EC%8A%B5%EB%8B%88%EB%8B%A4?show=104409#a104409</guid>
<pubDate>Thu, 18 Jul 2024 10:25:37 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>Warm start 하도록 강제하는 환경을 만들 수 있을까요?</title>
<link>http://www.masterqna.com/android/104403/warm-start-%ED%95%98%EB%8F%84%EB%A1%9D-%EA%B0%95%EC%A0%9C%ED%95%98%EB%8A%94-%ED%99%98%EA%B2%BD%EC%9D%84-%EB%A7%8C%EB%93%A4-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C%EC%9A%94?show=104405#a104405</link>
<description>&lt;p&gt;By ChatGPT:&lt;/p&gt;&lt;p&gt;here are some steps to help create a warm start scenario on an Android Virtual Device (AVD) to diagnose and troubleshoot the issue:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Up AVD:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ensure you have an AVD set up in Android Studio that matches your target device specifications.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install and Launch the App:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Install your app on the AVD.&lt;/li&gt;&lt;li&gt;Launch the app and interact with it to ensure it is running as expected.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simulate Warm Start:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Press the Home button to send the app to the background. This will put the app in a paused state.&lt;/li&gt;&lt;li&gt;After a short period (a few seconds to a couple of minutes), relaunch the app by selecting it from the recent apps list. This should trigger a warm start.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor Logs:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use adb logcat to monitor the app’s logs during the warm start. You can filter logs specific to your app using tags.&lt;/li&gt;&lt;li&gt;Look for any errors, warnings, or unusual behavior in the logs during the warm start process.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automation with ADB:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use ADB commands to automate the process of sending the app to the background and bringing it back to the foreground. Here are some useful commands:&lt;ul&gt;&lt;li&gt;To send the app to the background:&lt;pre&gt;adb shell am start -n com.example.yourapp/.YourMainActivity
&lt;/pre&gt;&lt;p&gt;To simulate a warm start:&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;adb shell input keyevent KEYCODE_HOME
adb shell am start -n com.example.yourapp/.YourMainActivity&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;ChatGPT 한테 다시 번역을 시키셔도 되고, 님의 질문을 그대로 같아 붙이면 위와 같은 내용이 나올 겁니다.&lt;/div&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104403/warm-start-%ED%95%98%EB%8F%84%EB%A1%9D-%EA%B0%95%EC%A0%9C%ED%95%98%EB%8A%94-%ED%99%98%EA%B2%BD%EC%9D%84-%EB%A7%8C%EB%93%A4-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C%EC%9A%94?show=104405#a104405</guid>
<pubDate>Tue, 16 Jul 2024 09:23:13 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>로그캣 분량이 매우 커서 챗지피티 요약문으로 드립니다 죄송합니다.</title>
<link>http://www.masterqna.com/android/104395/%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%B6%84%EB%9F%89%EC%9D%B4-%EB%A7%A4%EC%9A%B0-%EC%BB%A4%EC%84%9C-%EC%B1%97%EC%A7%80%ED%94%BC%ED%8B%B0-%EC%9A%94%EC%95%BD%EB%AC%B8%EC%9C%BC%EB%A1%9C-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4?show=104398#a104398</link>
<description>챗지피티가 알려준 점검 포인트를 디버깅에 적용하시면 어디가 문제인지 찾기가 쉬워질 것 같습니다. 이런 문제는 디버깅하는방법을 배우셔서 디버깅을 하셔야 해요.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104395/%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%B6%84%EB%9F%89%EC%9D%B4-%EB%A7%A4%EC%9A%B0-%EC%BB%A4%EC%84%9C-%EC%B1%97%EC%A7%80%ED%94%BC%ED%8B%B0-%EC%9A%94%EC%95%BD%EB%AC%B8%EC%9C%BC%EB%A1%9C-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4?show=104398#a104398</guid>
<pubDate>Thu, 11 Jul 2024 23:12:18 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>분량 초과로 코드/로그캣 따로 보냅니다. 정말 죄송합니다.</title>
<link>http://www.masterqna.com/android/104394/%EB%B6%84%EB%9F%89-%EC%B4%88%EA%B3%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%94%B0%EB%A1%9C-%EB%B3%B4%EB%83%85%EB%8B%88%EB%8B%A4-%EC%A0%95%EB%A7%90-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4?show=104397#a104397</link>
<description>퍼미션 처리가 제대로 되고 있는지 확인이 필요해 보이구요. 퍼미션이 처리되진 않으면 다음 코드가 진행이 안될 것 같구요. (chat gpt 요약으로 보면 문제는 없어 보이긴 합니다)&lt;br /&gt;
혹시 전송 받은 문자열이 빈 문자열은 아닌지도 확인을 해보셔야 할 것 같구요.&lt;br /&gt;
데이터가 안받아는지는 경우는 manageConnectedSocket 함수 쪽이 제대로 동작을 하지 않을 가능성이 커보이구요.&lt;br /&gt;
&lt;br /&gt;
디버깅하는 방법을 찾아보셔서, 브레이크 포인트를 설정하셔서 설제로 어느 부분에서 막히는지 확인해 보시는게 제일 좋은 문제 찾는 방법 중의 하나입니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104394/%EB%B6%84%EB%9F%89-%EC%B4%88%EA%B3%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%94%B0%EB%A1%9C-%EB%B3%B4%EB%83%85%EB%8B%88%EB%8B%A4-%EC%A0%95%EB%A7%90-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4?show=104397#a104397</guid>
<pubDate>Thu, 11 Jul 2024 23:10:22 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>분량 초과로 코드/로그캣 따로 보내드립니다. 죄송합니다.</title>
<link>http://www.masterqna.com/android/104393/%EB%B6%84%EB%9F%89-%EC%B4%88%EA%B3%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%94%B0%EB%A1%9C-%EB%B3%B4%EB%82%B4%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4</link>
<description>&lt;pre class=&quot;brush:java;&quot;&gt;&amp;lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&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;Button
        android:id=&quot;@+id/selectDeviceButton&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;bluetooth&quot;
        android:layout_centerHorizontal=&quot;true&quot;
        android:layout_marginTop=&quot;20dp&quot;/&amp;gt;

    &amp;lt;TextView
        android:id=&quot;@+id/postureTextView&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;스트레칭을 따라하세요!&quot;
        android:textSize=&quot;24sp&quot;
        android:layout_below=&quot;@id/selectDeviceButton&quot;
        android:layout_centerHorizontal=&quot;true&quot;
        android:layout_marginTop=&quot;30dp&quot;/&amp;gt;

    &amp;lt;ImageView
        android:id=&quot;@+id/stretchImageView&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_below=&quot;@id/postureTextView&quot;
        android:layout_marginTop=&quot;20dp&quot;
        android:scaleType=&quot;centerInside&quot;
        android:src=&quot;@drawable/w25&quot;/&amp;gt;

    &amp;lt;ListView
        android:id=&quot;@+id/paired_devices&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_below=&quot;@id/stretchImageView&quot;
        android:layout_marginTop=&quot;20dp&quot;/&amp;gt;
&amp;lt;/RelativeLayout&amp;gt;

&lt;/pre&gt;&lt;pre class=&quot;brush:java;&quot;&gt;package com.example.opensource;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

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

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_ENABLE_BT = 1;
    private static final int REQUEST_PERMISSIONS = 2;
    private static final String TAG = &quot;MainActivity&quot;;

    private BluetoothAdapter bluetoothAdapter;
    private BluetoothSocket bluetoothSocket;
    private InputStream inputStream;
    private Handler handler;
    private TextView postureTextView;
    private ImageView stretchImageView;
    private Button selectDeviceButton;
    private ListView listView;
    private ArrayAdapter&amp;lt;String&amp;gt; pairedDevicesArrayAdapter;

    private final UUID MY_UUID = UUID.fromString(&quot;00001101-0000-1000-8000-00805F9B34FB&quot;);

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

        postureTextView = findViewById(R.id.postureTextView);
        stretchImageView = findViewById(R.id.stretchImageView);
        selectDeviceButton = findViewById(R.id.selectDeviceButton);
        listView = findViewById(R.id.paired_devices);

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            Toast.makeText(this, &quot;Bluetooth is not available&quot;, Toast.LENGTH_LONG).show();
            finish();
            return;
        }

        if (!bluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }

        if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.S) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
            }
        }

        selectDeviceButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPairedDevices();
            }
        });

        handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                String posture = msg.getData().getString(&quot;posture&quot;);
                Log.d(TAG, &quot;Received posture data: &quot; + posture);
                postureTextView.setText(posture);
                showStretchingImages(posture);
                return true;
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSIONS) {
            if (grantResults.length &amp;gt; 0 &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                showPairedDevices();
            } else {
                Toast.makeText(this, &quot;Bluetooth permissions are required to use this application&quot;, Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }

    private void showPairedDevices() {
        if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.S) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
                return;
            }
        }
&lt;/pre&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104393/%EB%B6%84%EB%9F%89-%EC%B4%88%EA%B3%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%94%B0%EB%A1%9C-%EB%B3%B4%EB%82%B4%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4</guid>
<pubDate>Thu, 11 Jul 2024 13:49:21 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>분량 초과로 코드/로그캣 따로 보내드립니다. 죄송합니다.</title>
<link>http://www.masterqna.com/android/104392/%EB%B6%84%EB%9F%89-%EC%B4%88%EA%B3%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%94%B0%EB%A1%9C-%EB%B3%B4%EB%82%B4%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4</link>
<description>&lt;pre class=&quot;brush:csharp;&quot;&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;SoftwareSerial.h&amp;gt;
#include &amp;lt;Adafruit_Sensor.h&amp;gt;
#include &amp;lt;Adafruit_ADXL345_U.h&amp;gt;

// ADXL345 모듈 설정
Adafruit_ADXL345_Unified adxl = Adafruit_ADXL345_Unified(12345);

// HC-06 모듈 설정 (TX, RX)
SoftwareSerial bluetooth(10, 11);

unsigned long previousMillis = 0; // 이전 시간 저장
const long interval = 1000; // 데이터 전송 간격 (밀리초 단위)

void setup() {
  // 시리얼 모니터와 블루투스 초기화
  Serial.begin(9600);
  bluetooth.begin(9600);
  
  // ADXL345 초기화 확인
  if (!adxl.begin()) {
    Serial.println(&quot;No ADXL345 detected ... Check your wiring!&quot;);
    while (1);
  }
  
  adxl.setRange(ADXL345_RANGE_2_G);
}

void loop() {
  unsigned long currentMillis = millis();
  
  if (currentMillis - previousMillis &amp;gt;= interval) {
    previousMillis = currentMillis;
    
    sensors_event_t event;
    adxl.getEvent(&amp;amp;event);

    // 각도 계산
    float x_angle = atan(event.acceleration.x / sqrt(pow(event.acceleration.y, 2) + pow(event.acceleration.z, 2))) * 180 / PI;
    float y_angle = atan(event.acceleration.y / sqrt(pow(event.acceleration.x, 2) + pow(event.acceleration.z, 2))) * 180 / PI;

    // 자세 결정
    String posture = determinePosture(x_angle, y_angle);

    // 자세 정보 시리얼 모니터와 블루투스에 출력
    Serial.print(&quot;Posture: &quot;);
    Serial.println(posture);
    bluetooth.println(posture); // 여기서 데이터가 전송됨을 확인
  }
}

String determinePosture(float x_angle, float y_angle) {
  if (abs(x_angle) &amp;lt;= 10 &amp;amp;&amp;amp; abs(y_angle) &amp;lt;= 10) {
    return &quot;GOOD&quot;;
  } else if (abs(x_angle) &amp;lt;= 20 &amp;amp;&amp;amp; abs(y_angle) &amp;lt;= 20) {
    return &quot;SLIGHT&quot;;
  } else {
    return &quot;BAD&quot;;
  }
}&lt;/pre&gt;&lt;pre class=&quot;brush:java;&quot;&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;com.example.opensource&quot;&amp;gt;

    &amp;lt;uses-permission android:name=&quot;android.permission.BLUETOOTH&quot; /&amp;gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.BLUETOOTH_ADMIN&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;uses-permission android:name=&quot;android.permission.BLUETOOTH_CONNECT&quot; /&amp;gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.BLUETOOTH_SCAN&quot; /&amp;gt;

    &amp;lt;application
        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/AppTheme&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;/application&amp;gt;

&amp;lt;/manifest&amp;gt;

&lt;/pre&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104392/%EB%B6%84%EB%9F%89-%EC%B4%88%EA%B3%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%EB%A1%9C%EA%B7%B8%EC%BA%A3-%EB%94%B0%EB%A1%9C-%EB%B3%B4%EB%82%B4%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4</guid>
<pubDate>Thu, 11 Jul 2024 13:47:15 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>아두이노,안드로이드 사용 앱 개발 중 오류 (아두이노 시리얼 모니터를 통해 올바른 데이터 송신, 안드로이드 데이터 수신 비정상,Logcat에 데이터 수신 기록x)</title>
<link>http://www.masterqna.com/android/104391/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%8B%9C%EB%A6%AC%EC%96%BC-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A5%BC-%EC%98%AC%EB%B0%94%EB%A5%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B9%84%EC%A0%95%EC%83%81-logcat%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B8%B0%EB%A1%9Dx</link>
<description>&lt;p&gt;(인사말) 안녕하십니까 방금 가입한 신입 신수호입니다.&lt;/p&gt;&lt;p&gt;(변명) 제가 글을 쓰게된 배경은 고등학교 전자공학과 관련 동아리에서 단독 프로젝트를 제작/발표해야하는데 주제를 어깨 기울기에 따른 스트레칭 추천 애플리케이션으로 잡고 챗지피티의 도움을 받아서 아두이노와 안드로이드 스튜디오의 코딩을 완료했습니다. 완료해서 시행을 해보려 했는데 계속 오류가 나옵니다. 오류를 수정하려고 지피티를 사용하여도 계속 똑같은 것만 수정해주고 실질적인 대처를 하지 못하는 것 같습니다.(계속 로그캣을 통해 확인해 보아야 한다는데 수정한 뒤 로그캣을 보여줘도 똑같은 말만 반복합니다.) 제가 능력이 부족하여 관련 오류를 4일동안 6시간 씩 시간 박으면서 해결해보려고 하는데 잘 되지 않습니다.. 해결해주실 전문가분들의 도움이 필요하다고 생각이 들어서 이렇게 질문하는 글을 써봅니다.(아직 나이가 어려 글을 쓰는데 미숙합니다. 최대한 존중과 예의를 갖추어 작성하도록 하겠습니다. 또한 글을 적는데 남은 시간이 별로 없어서 두서없는 글을 쓸 가능성이 높을 것 같습니다. 죄송합니다.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(참고)&lt;/p&gt;&lt;p&gt;코드와 로그캣은 분량이 너무 커서 따로 보내드리도록 하겠습니다.&lt;/p&gt;&lt;p&gt;아두이노 버전 1.8.19&lt;/p&gt;&lt;p&gt;안드로이드 버전&amp;nbsp;&lt;/p&gt;&lt;p&gt;Build #AI-221.6008.13.2211.9619390, built on February 17, 2023&lt;/p&gt;&lt;p&gt;&lt;br&gt;Runtime version: 11.0.15+0-b2043.56-9505619 amd64&lt;br&gt;VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.&lt;/p&gt;&lt;p&gt;하드웨어 사용 전자 부품&lt;/p&gt;&lt;p&gt;아두이노 프로미니/ADXL345 GY29/HC-06/점퍼 와이어&lt;/p&gt;&lt;p&gt;태블릿(삼섬 s8+/samsung-SM-X800 ANDROID14, API34)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(과정과 문제점)먼저 제가 챗지피티를 이용해 제작하는 과정과 코드 그리고 로그캣을 보여드리도록 하겠습니다. 제가 개발하고 싶은 애플리케이션은 어깨 기울기에 따른 스트레칭 추천 애플리케이션입니다. 애플리케이션의 작동 과정을 요약하면 다음과 같습니다. 먼저 가속도 센서를 이용해 X/Y축의 변동을 측정하고 측정한 값을 조금 변형하여 각도로 표현합니다. 이때 3가지의 각도 범위를 설정하여 각각의 케이스를 (GOOD/SLITGH/BAD)로 설정하고 그것을 HC-06으로 태블릿에 있는 애플리케이션에 블루투스를 메개로 정보를 송신합니다.(이때 posture가 무엇인지를 1초마다 시리얼 모니터로 보여지게 구상했습니다)페어링된 기기 리스트에서 HC-06을 택하여 연결된&amp;nbsp;블루투스를 통해 정보를 받은 애플리케이션이 케이스에 따라 각각 8가지의 스트레칭 이미지를 각 이미지마다 30초씩 디스플레이 해줍니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;다음은 챗지피티를 통해 요약한 진행 과정입니다&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;목표&lt;/strong&gt;: 아두이노에서 자세 데이터를 수집하고&amp;nbsp;이를 블루투스를 통해 안드로이드 애플리케이션으로 전송하여, 사용자가 적절한 스트레칭을 할 수 있도록 이미지를 표시하는 시스템.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;진행상황&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;아두이노에서 ADXL345 센서를 사용하여 자세 데이터를 수집하고, HC-06 블루투스 모듈을 통해 데이터를 전송하는 코드 작성 완료.&lt;/li&gt;&lt;li&gt;안드로이드 애플리케이션에서 블루투스 연결을 설정하고 데이터를 수신하여 UI에 표시하는 코드 작성 완료.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;문제점&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;안드로이드 애플리케이션이 블루투스를 통해 아두이노로부터 데이터를 정상적으로 수신하지 못하고 있음.&lt;/li&gt;&lt;li&gt;로그캣에서 데이터 수신에 대한 로그가 나타나지 않음.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;도움 요청 사항&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;블루투스 통신 문제를 해결하기 위한 디버깅 방법 및 조언&lt;/li&gt;&lt;li&gt;데이터 수신 및 처리 과정에서 발생할 수 있는 문제점 확인 및 해결 방안&lt;/li&gt;&lt;li&gt;아두이노와 안드로이드 애플리케이션 간의 블루투스 통신을 안정적으로 설정하는 방법&lt;/li&gt;&lt;li&gt;상황 전체 보고&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;다음은 애플리케이션 레이아웃 입니다(이미지/동영상)&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;애플리케이션 레이아웃입니다. 스트래칭을 따라하세요 텍스트 뷰 밑에서 스트레칭 이미지를 디스플레이합니다&quot; src=&quot;http://www.masterqna.com/android/?qa=blob&amp;amp;qa_blobid=4715949795351668290&quot; style=&quot;height:375px; width:600px&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;시리얼 모니터 입니다 (posture 정보를 모니터에 1초마다 표시합니다)&quot; src=&quot;http://www.masterqna.com/android/?qa=blob&amp;amp;qa_blobid=16202820595782687515&quot; style=&quot;height:134px; width:600px&quot;&gt;&lt;/p&gt;&lt;p&gt;하드웨어 사진 올릴려고했는데 파일 사이즈가 너무 커서 업로드가 안됩니다 참고용으로 많이 올려야하는데 죄송합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;실행중 오류&lt;/p&gt;&lt;p&gt;코드에 나온대로 아두이노 하드웨어를 컴퓨터에 연결하여 로그캣/시리얼 모니터를 보면서 애플리케이션을 실행했습니다. 그리고 블루투스 버튼을 눌러서 리스트에서 HC-06를 골랐는데 이미지가 디스플레이 되지않습니다. HC-06의 불빛이 고정되어서 연결된 것은 확실한 것 같은데 왜 이러한 상태가 되는지 모르겠습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;마무리&lt;/p&gt;&lt;p&gt;글이 이렇게 길게 늘여진 것은 학력과 능력이 부족한 저의 잘못입니다. 대단히 죄송합니다. 긴 글 읽어주셔서 정말 감사합니다. 제가 가진 시간이 별로 없어서 답변을 내일 아침에 확인할 수 있을 것 같습니다. 질문해주시면 모두 답변하겠습니다. 뉴비의 꿈을 키워주세요 감사합니다. 열심히 하겠습니다&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104391/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%8B%9C%EB%A6%AC%EC%96%BC-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A5%BC-%EC%98%AC%EB%B0%94%EB%A5%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B9%84%EC%A0%95%EC%83%81-logcat%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B8%B0%EB%A1%9Dx</guid>
<pubDate>Thu, 11 Jul 2024 13:44:13 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>안드로이드 키보드가 올라왔다가 바로 다시 내려갑니다.</title>
<link>http://www.masterqna.com/android/104388/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%82%A4%EB%B3%B4%EB%93%9C%EA%B0%80-%EC%98%AC%EB%9D%BC%EC%99%94%EB%8B%A4%EA%B0%80-%EB%B0%94%EB%A1%9C-%EB%8B%A4%EC%8B%9C-%EB%82%B4%EB%A0%A4%EA%B0%91%EB%8B%88%EB%8B%A4?show=104389#a104389</link>
<description>&lt;p&gt;AndroidManifest.xml에서 windowSoftInputMode를 먼저 체크해 보세요.&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;&amp;lt;activity
    android:name=&quot;.YourActivity&quot;
    android:windowSoftInputMode=&quot;adjustResize&quot;&amp;gt;
    &amp;lt;!-- Activity configuration --&amp;gt;
&amp;lt;/activity&amp;gt;&lt;/pre&gt;&lt;p&gt;adjustResize나 adjistPan으로 해서 테스트해보세요.&lt;br&gt;&lt;br&gt;그리고 해당 UI는 모발앱에서는 잘 안사용하는 행태의 레이아웃이네요.&lt;br&gt;검색창이 대개 상단에 위치합니다. 그리고 페이지 번호를 표시하지 않고 inifite loading/load more라는 기법을 사용해서 페이징 처리를 합니다. 위와 같은 페이징 화면은 웹용입니다.&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104388/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%82%A4%EB%B3%B4%EB%93%9C%EA%B0%80-%EC%98%AC%EB%9D%BC%EC%99%94%EB%8B%A4%EA%B0%80-%EB%B0%94%EB%A1%9C-%EB%8B%A4%EC%8B%9C-%EB%82%B4%EB%A0%A4%EA%B0%91%EB%8B%88%EB%8B%A4?show=104389#a104389</guid>
<pubDate>Thu, 11 Jul 2024 09:22:09 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>안드로이드14 대응 커스텀갤러리</title>
<link>http://www.masterqna.com/android/104381/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C14-%EB%8C%80%EC%9D%91-%EC%BB%A4%EC%8A%A4%ED%85%80%EA%B0%A4%EB%9F%AC%EB%A6%AC?show=104384#a104384</link>
<description>&lt;p&gt;먼저 SDK가 Android 14 또는 이상이면 &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/reference/android/Manifest.permission#READ_MEDIA_VISUAL_USER_SELECTED&quot;&gt;READ_MEDIA_VISUAL_USER_SELECTED&lt;/a&gt; 를 AndroidManifiest.xml에 추가해야 합니다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.android.com/about/versions/14/changes/partial-photo-video-access&quot; rel=&quot;nofollow&quot;&gt;https://developer.android.com/about/versions/14/changes/partial-photo-video-access&lt;/a&gt;&lt;/p&gt;&lt;p&gt;런타임 퍼미션도 OS에 맞게 요청해 주시고요.&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;// Register ActivityResult handler
val requestPermissions = registerForActivityResult(RequestMultiplePermissions()) { results -&amp;gt;
    // Handle permission requests results
    // See the permission example in the Android platform samples: https://github.com/android/platform-samples
}

// Permission request logic
if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
    requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))
} else if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.TIRAMISU) {
    requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO))
} else {
    requestPermissions.launch(arrayOf(READ_EXTERNAL_STORAGE))
}
&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;안드로이드 14의 경우는 &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/reference/android/Manifest.permission#READ_MEDIA_VISUAL_USER_SELECTED&quot;&gt;READ_MEDIA_VISUAL_USER_SELECTED &lt;/a&gt;를 핸들링해주셔야 한다고 되어 있습니다.&lt;/p&gt;&lt;p&gt;퍼미션 체크는 아래의 로직을 통해 하라고 되어 있습니다.&lt;/p&gt;&lt;pre class=&quot;brush:java;&quot;&gt;if (
    Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.TIRAMISU &amp;amp;&amp;amp;
    (
        ContextCompat.checkSelfPermission(context, READ_MEDIA_IMAGES) == PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(context, READ_MEDIA_VIDEO) == PERMISSION_GRANTED
    )
) {
    // Full access on Android 13 (API level 33) or higher
} else if (
    Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &amp;amp;&amp;amp;
    ContextCompat.checkSelfPermission(context, READ_MEDIA_VISUAL_USER_SELECTED) == PERMISSION_GRANTED
) {
    // Partial access on Android 14 (API level 34) or higher
}  else if (ContextCompat.checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED) {
    // Full access up to Android 12 (API level 32)
} else {
    // Access denied
}
&lt;/pre&gt;&lt;p&gt;콜백에서도 적절하게 처리를 해주셔야 합니다.&lt;br&gt;&lt;br&gt;기존&amp;nbsp; 로직에서 퍼미션이 거절일 때&amp;nbsp; shouldShowRequestPermissionRationale를 처리하지 마시고 아래 순서로 하세요.&lt;br&gt;퍼미션 승인 상태 -&amp;gt; 통과&lt;br&gt;shouldShowRequestPermissionRationale -&amp;gt; 사용자에게 퍼미션이 왜 필요한지 설명&lt;br&gt;그외 -&amp;gt; 퍼미션 요청 (이 경우는 콜백에서만 처리가 가능하나 모든 경우는 처리되지 않음)&lt;br&gt;&lt;br&gt;퍼미션 거절은 최초의 상태에서도 나오기 때문에 거절 상태인지 아닌지를 체크하시면 안됩니다. 콜백에서 승인이나 shouldShowRequestPermissionRationale 가 아닌 경우가 나오면 시스템 설정으로 갈 수 있도록 UI를 처리하는 것이 사용자에게 필요할 수 있습니다.&lt;br&gt;&lt;br&gt;안드로이드 퍼미션 디자인은 기본적으로 문제점이 많은 기능입니다. 테스트를 다양하게 해보고 처리하시는게 제일 좋습니다.&lt;/p&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104381/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C14-%EB%8C%80%EC%9D%91-%EC%BB%A4%EC%8A%A4%ED%85%80%EA%B0%A4%EB%9F%AC%EB%A6%AC?show=104384#a104384</guid>
<pubDate>Wed, 10 Jul 2024 07:54:48 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
<item>
<title>충전 케이블로 시리얼 데이터 읽기 여쭤봅니다.</title>
<link>http://www.masterqna.com/android/104375/%EC%B6%A9%EC%A0%84-%EC%BC%80%EC%9D%B4%EB%B8%94%EB%A1%9C-%EC%8B%9C%EB%A6%AC%EC%96%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BD%EA%B8%B0-%EC%97%AC%EC%AD%A4%EB%B4%85%EB%8B%88%EB%8B%A4?show=104376#a104376</link>
<description>&lt;a href=&quot;https://github.com/topics/serial-communication?l=java&quot; rel=&quot;nofollow&quot;&gt;https://github.com/topics/serial-communication?l=java&lt;/a&gt;</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104375/%EC%B6%A9%EC%A0%84-%EC%BC%80%EC%9D%B4%EB%B8%94%EB%A1%9C-%EC%8B%9C%EB%A6%AC%EC%96%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BD%EA%B8%B0-%EC%97%AC%EC%AD%A4%EB%B4%85%EB%8B%88%EB%8B%A4?show=104376#a104376</guid>
<pubDate>Thu, 20 Jun 2024 13:41:14 +0000</pubDate>
<slash:comments>1</slash:comments>
</item>
<item>
<title>안드로이드 @Keep 어노테이션으로 난독화  제외 시</title>
<link>http://www.masterqna.com/android/104372/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%40keep-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9C%BC%EB%A1%9C-%EB%82%9C%EB%8F%85%ED%99%94-%EC%A0%9C%EC%99%B8-%EC%8B%9C</link>
<description>@Keep&lt;br /&gt;
public static byte[] command(int x, int y, int size, String str) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
이런 함수를 @Keep 을 사용해 난독화에서 제외 할때..&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
public static byte[] command(int var0, int var1, int var2, String var3) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
처럼 파라미터 이름이 변해 버립니다.&lt;br /&gt;
&lt;br /&gt;
난독화 제외 시 파라미터 이름도 유지할 수 있는 방법이 있을까요?</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104372/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%40keep-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9C%BC%EB%A1%9C-%EB%82%9C%EB%8F%85%ED%99%94-%EC%A0%9C%EC%99%B8-%EC%8B%9C</guid>
<pubDate>Tue, 18 Jun 2024 07:54:57 +0000</pubDate>
<slash:comments>0</slash:comments>
</item>
<item>
<title>안드로이드 취업시장 관련 질문좀 드립니다.</title>
<link>http://www.masterqna.com/android/104359/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B7%A8%EC%97%85%EC%8B%9C%EC%9E%A5-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%A2%80-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4?show=104371#a104371</link>
<description>사업적인 입장에선 폰 어플을 만든다 할 경우,&lt;br /&gt;
&amp;nbsp;녹음 같이 os 제한으로 인해 지원 못 하는 일부 기능을 제외하곤&lt;br /&gt;
&amp;nbsp;안드로이드 + ios 기동하는 어플이 필요합니다.&lt;br /&gt;
web으로 개발하면, native의 일부 기능을 못 쓸 뿐, 껍데기만 만들면 되서,&lt;br /&gt;
os상 제한을 적게 탑니다.&lt;br /&gt;
안드로이드 네이티브 개발자는 &amp;nbsp;많으나, 상대적으로 &amp;nbsp;ios 개발자는 적습니다.&lt;br /&gt;
따라서 안드로이드를 어느정도 공부하셨다니, &amp;nbsp;ios 개발을 공부하여, 둘 다 할 수 있다는 포지셔닝을 하시던지,&lt;br /&gt;
&amp;nbsp;web쪽을 보시는게 현재 상황에서는 좋을 듯 합니다.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;하지만 잘나가던 플래시 개발자가 다른 언어로 개발자로 전환을 한지 얼마 안된 상황입니다.&lt;br /&gt;
&amp;nbsp;평생 쓸 언어는 없고, 계속 새로운 걸 &amp;nbsp;공부하신다고 생각하시는게 좋을 듯은 합니다.</description>
<guid isPermaLink="true">http://www.masterqna.com/android/104359/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B7%A8%EC%97%85%EC%8B%9C%EC%9E%A5-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%A2%80-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4?show=104371#a104371</guid>
<pubDate>Tue, 18 Jun 2024 02:20:30 +0000</pubDate>
<slash:comments>2</slash:comments>
</item>
</channel>
</rss>