{"id":1213,"date":"2021-10-22T17:50:24","date_gmt":"2021-10-22T08:50:24","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=1213"},"modified":"2025-09-12T17:25:08","modified_gmt":"2025-09-12T08:25:08","slug":"android-request-permissions","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2021\/10\/22\/1213\/","title":{"rendered":"Android : Request Runtime Permissions"},"content":{"rendered":"\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc\uc758 permission\uc740 \ucd08\uae30\uc5d0\ub294 Manifest\uc5d0 \ucd94\uac00\ub9cc \ud574\uc8fc\uba74 \ud574\uacb0 \ub410\uc9c0\ub9cc, \ubcf4\uc548\uc774 \uac15\ud654\ub418\uba74\uc11c API 23\ubd80\ud130 \uc0ac\uc9c4\uc744 \ucc0d\uac70\ub098 \uc704\uce58\uc815\ubcf4\ub97c \uc774\uc6a9\ud558\ub294\ub4f1\uc758 \uacbd\uc6b0\uc5d0 \ub7f0\ud0c0\uc784\uc73c\ub85c \uc694\uccad\uc744 \ud574\uc11c \uc0ac\uc6a9\uc790 \ud655\uc778\uc744 \ubc1b\uc544\uc57c \ud55c\ub2e4. Runtime Permissions\ub294 dangerous permissions\ub77c\uace0\ub3c4 \ud558\uba70, \uc2dc\uc2a4\ud15c\uc774\ub098 \ub2e4\ub978\uc571\uc5d0\uac8c \uc601\ud5a5\uc744 \uc904 \uc218 \uc788\ub294 \uc601\uc5ed\uc5d0 \uc811\uadfc\ud560 \ub54c \ud544\uc694\ud558\ub2e4.  runtime \uc73c\ub85c permission\uc744 \uc694\uccad\ud558\uba74 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ub2e4\uc74c\uacfc \uac19\uc740 \ub300\ud654\uc0c1\uc790\uac00 \ud45c\uc2dc\ub41c\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"301\" height=\"242\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/10\/permission_dialog.png\" alt=\"\" class=\"wp-image-1222\"\/><\/figure>\n<\/div>\n\n\n<p>\uc0ac\uc6a9\uc790\ub294 \ud5c8\uc6a9\/\uac70\ubd80\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\uace0 \uadf8\uc5d0 \ub530\ub77c permission\uc774 \uc8fc\uc5b4\uc9c4\ub2e4.  <\/p>\n\n\n\n<p>\uc774\ub7ec\ud55c \uc774\uc720\ub85c, permission\uc744 \uc0ac\uc6a9\ud560 \ub54c protection level\uc744 \uc54c\uc544\uc57c \ud55c\ub2e4. \ub9cc\uc57d, dangerous\ub77c\uba74 \ub7f0\ud0c0\uc784\uc5d0 request permission\uc774 \ud544\uc694\ud558\uace0, \uc774\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4. protection level\uc740 <a href=\"https:\/\/developer.android.com\/reference\/android\/Manifest.permission\">\ub808\ud37c\ub7f0\uc2a4 \ubb38\uc11c\uc5d0 permission \ub9ac\uc2a4\ud2b8<\/a>\ub97c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ud655\uc778 \ud560 \uc218 \uc788\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"882\" height=\"314\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/10\/protection_level.png\" alt=\"\" class=\"wp-image-1223\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/10\/protection_level.png 882w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/10\/protection_level-300x107.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/10\/protection_level-768x273.png 768w\" sizes=\"auto, (max-width: 882px) 100vw, 882px\" \/><figcaption class=\"wp-element-caption\">protection level \ud655\uc778<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc0ac\uc6a9\uc790\uac00 \ud5c8\uc6a9\ud55c \uacbd\uc6b0\uc5d0\ub3c4 \uc624\ub79c \uc2dc\uac04\uc774 \uc9c0\ub098\uba74, permission\uc774 \uc0ac\ub77c\uc9c8 \uc218 \uc788\ub2e4. \uc5ec\uae30\uc11c\ub294 runtime permission \uc694\uccad\ud558\ub294 \uad6c\ud604\ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcfc \uac83\uc774\ub2e4.  \uc804\ubc18\uc801\uc778 \ub0b4\uc6a9\uc740 \uacf5\uc2dd \ubb38\uc11c( <a href=\"https:\/\/developer.android.com\/training\/permissions\/requesting#manage-request-code-yourself\">https:\/\/developer.android.com\/training\/permissions\/requesting#manage-request-code-yourself<\/a> ) \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.  \uc790\uc138\ud55c \uc124\uba85\uc740 \uc5c6\uc9c0\ub9cc,<a href=\"https:\/\/developer.android.com\/codelabs\/android-app-permissions?hl=en&amp;continue=https%3A%2F%2Fcodelabs.developers.google.com%2F%3Fcat%3Dandroid#0\"> codelab\uc5d0 \ub530\ub77c\ud560 \uc218 \uc788\ub294 request permisssion\uad6c\ud604 \ubc29\ubc95<\/a> \uc744 \ucc38\uace0\ud558\uba74 \ub3c4\uc6c0\uc774 \ub420 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>Permission \uc694\uccad\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc9c4\ud589\ub41c\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"759\" height=\"602\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/10\/permission_diagram-1.png\" alt=\"\" class=\"wp-image-1219\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/10\/permission_diagram-1.png 759w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/10\/permission_diagram-1-300x238.png 300w\" sizes=\"auto, (max-width: 759px) 100vw, 759px\" \/><\/figure>\n<\/div>\n\n\n<p>\ud750\ub984\uc744 \ub530\ub77c\uac00\ubcf4\uba74, \ucd5c\ucd08\uc5d0 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc694\uccad\ud55c\uc801\uc774 \uc5c6\uc73c\ubbc0\ub85c permission\uc774 \uc5c6\uc744\uac83\uc774\ub2e4. shouldShowRequestPermissionRationale()\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uad8c\ud55c\uc758 \ud544\uc694\uc131\uc744 \uc124\uba85\ud558\ub294 UI\ub97c \ub744\uc6cc\uc57c \ud558\ub294\uc9c0 \uc54c\ub824\uc8fc\ub294\ub370, \uac70\ubd80\ub41c\uc801\uc774 \uc788\uc744 \ub54c true\uac00 \ub418\uc9c0\ub9cc, \ucc98\uc74c\uc774\ubbc0\ub85c false\ub97c \ub3cc\ub824\uc904 \uac83\uc774\ub2e4. Permission \uc694\uccad\uc740 RequestPermission()\uc5d0 \uc758\ud574 \uc9c4\ud589\ub41c\ub2e4. \uc694\uccad\uc2dc, \uc55e\uc11c \uc0b4\ud3b4\ubcf8 &#8220;Allow\/deny&#8221;\ub97c \uc120\ud0dd\ud558\ub294 \ub2e4\uc774\uc5bc\ub85c\uadf8\ub97c \ub744\uc6b4\ub2e4.  \uc694\uccad \uacfc\uc815\uc740 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc678\ubd80 Activity\ub97c \ub744\uc6b0\ub294 \uacfc\uc815\uc73c\ub85c registerForActivityResult()\ub97c \uc774\uc6a9\ud574 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. permission\uc694\uccad\uc5d0 \ub300\ud55c default contract\uac00 \uc81c\uacf5\ub418\uae30 \ub54c\ubb38\uc5d0 \uc774\ub97c \uc774\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<p>Permission \uc694\uccad\uc744 \ud558\uba74, \uc0ac\uc6a9\uc790\uc5d0\uac8c &#8216;\ud5c8\uc6a9&#8217;, &#8216;\uac70\ubd80&#8217;\uac00 \ub72c\ub2e4. \uc5ec\uae30\uc11c \uc0ac\uc6a9\uc790\uac00 &#8216;\ud5c8\uc6a9&#8217;\uc744 \uc120\ud0dd\ud558\uba74 \ubb38\uc81c\uc5c6\uc774 \ub2e4\uc74c\ub2e8\uacc4\ub85c \uc9c4\ud589\ub418\uc5b4 \uc2e4\ud589\ud558\uba74 \ub41c\ub2e4. \uc0ac\uc6a9\uc790\uac00 &#8216;\uac70\ubd80&#8217;\ub97c \ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 permission\uc774 \ud544\uc694\ud55c \uae30\ub2a5\ub9cc \uc81c\uc678\ud558\uace0 \uc571\uc758 \uc815\uc0c1 \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud574\uc57c \ud55c\ub2e4. &#8216;\uac70\ubd80&#8217; \uc774\ud6c4\uc5d0 \ub2e4\uc2dc \uc9c4\uc785\uc2dc, shouldShowRequestPermissionRationale()\uc774 true\ub97c \ub9ac\ud134\ud558\uba70, \uc0ac\uc6a9\uc790\uc5d0\uac8c permission\uc774 \ud544\uc694\ud55c \uc774\uc720\ub97c \uc124\uba85\ud558\ub294 \ub2e4\uc774\uc5bc\ub85c\uadf8\ub97c \ub744\uc6cc\uc57c \ud55c\ub2e4. \uc5ec\uae30\uc11c \ud655\uc778\uc744 \ub204\ub97c\uc2dc, request permission\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4. <\/p>\n\n\n\n<p> Permission \uc694\uccad\uc2dc \uc774\uc804\uc5d0 \uac70\ubd80\ud55c\uc801\uc774 \uc788\ub2e4\uba74, &#8216;\uac70\ubd80, \ub2e4\uc2dc \ubcf4\uc774\uc9c0 \uc54a\uc74c&#8217; \uc120\ud0dd\uc9c0\uac00 \ucd94\uac00\ub85c \ud45c\uc2dc\ub418\uace0, \uc774\uac78 \uc0ac\uc6a9\uc790\uac00 \uc120\ud0dd\ud558\uba74 requestPermission()\uc744 \ud638\ucd9c\ud574\ub3c4 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc544\ubb34\uac83\ub3c4 \ubcf4\uc5ec\uc8fc\uc9c0 \uc54a\ub294\ub2e4. \uc571\uc5d0\uc11c\ub294 permission\uc744 \ud68d\ub4dd\ud560 \ubc29\ubc95\uc774 \uc804\ubb34\ud574\uc9c0\uac8c \ub418\ub294\ub370, \uc774\uac78 \ub418\ub3cc\ub9b4\ub824\uba74 \uc0ac\uc6a9\uc790\uac00 \uc571 \uc124\uc815\uc5d0 \ub4e4\uc5b4\uac00 \uc9c1\uc811 \uad8c\ud55c\uc744 \uc218\uc815\ud574\uc57c \ud55c\ub2e4. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud558\ub098\uc758 permission\uc744 \uc694\uccad\ud558\ub294 \ubc29\ubc95<\/h3>\n\n\n\n<p>\uc774\uc81c \uad6c\ud604\ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc790. \uc608\uc81c\ub294 <a href=\"https:\/\/developer.android.com\/codelabs\/android-app-permissions?hl=en&amp;continue=https%3A%2F%2Fcodelabs.developers.google.com%2F%3Fcat%3Dandroid#0\">\ucf54\ub4dc\ub7a9\uc5d0 \uc62c\ub77c\uc640 \uc788\ub294 \uc608\uc81c<\/a>\ub97c \uc0ac\uc6a9\ud558\uaca0\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong> 1. \uc694\uccad\ud560 permission\uc744 manifest \ud30c\uc77c\uc5d0 \ucd94\uac00<\/strong><\/h4>\n\n\n\n<p> \ub7f0\ud0c0\uc784\uc73c\ub85c \uc694\uccad\ud560 permission\uc774\ub77c\ub3c4 \uc77c\ub2e8, manifest\ud30c\uc77c\uc5d0 \ucd94\uac00 \ub418\uc5b4\uc57c \ud55c\ub2e4. \uc608\uc81c\uc5d0 \uc788\ub4ef \uce74\uba54\ub77c\uae30\ub2a5\uc744 \ucd94\uac00\ud574\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;uses-permission android:name=\"android.permission.CAMERA\" \/><\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #8DDB8C\">uses-permission<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">android:name<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;android.permission.CAMERA&quot;<\/span><span style=\"color: #ADBAC7\"> \/&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2. request permission\uc758 \ud750\ub984 \uad6c\ud604<\/strong><\/h4>\n\n\n\n<p>\uc704\uc5d0\uc11c \uc0b4\ud3b4\ubcf8 \ud50c\ub85c\uc6b0\ucc28\ud2b8\uac00 \uc880 \ubcf5\uc7a1\ud558\uac8c \ubcf4\uc77c\uc9c0\ub3c4 \ubaa8\ub974\uaca0\ub2e4. \uacf5\uc2dd\ubb38\uc11c\uc758 \ud50c\ub85c\uc6b0\ucc28\ud2b8\ub098 \uac19\uc740\ub0b4\uc6a9\uc778\ub370, \uc880 \ub354 \uc2e4\uc81c \uad6c\ud604\uc5d0 \uac00\uae5d\uac8c \uadf8\ub824\ub193\uc740 \uac83\uc774\ub2e4. \uc2e4\uc81c \uad6c\ud604\uc740 when\ubb38\uc744 \uc774\uc6a9\ud558\uba74 \uc880 \ub354 \uac04\ub2e8\ud558\uac8c \uc815\ub9ac\ub41c\ub2e4. \uc608\uc81c\ub97c \ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun onClickRequestPermission(view: View) {\n   when {\n       ContextCompat.checkSelfPermission(\n           this,\n           Manifest.permission.CAMERA\n       ) == PackageManager.PERMISSION_GRANTED -> {\n           layout.showSnackbar(\n               view,\n               getString(R.string.permission_granted),\n               Snackbar.LENGTH_INDEFINITE,\n               null\n           ) {}\n       }\n\n       ActivityCompat.shouldShowRequestPermissionRationale(\n           this,\n           Manifest.permission.CAMERA\n       ) -> {\n           layout.showSnackbar(\n               view,\n               getString(R.string.permission_required),\n               Snackbar.LENGTH_INDEFINITE,\n               getString(R.string.ok)\n           ) {\n               requestPermissionLauncher.launch(\n                   Manifest.permission.CAMERA\n               )\n           }\n       }\n\n       else -> {\n           requestPermissionLauncher.launch(\n               Manifest.permission.CAMERA\n           )\n       }\n   }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onClickRequestPermission<\/span><span style=\"color: #ADBAC7\">(view: <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #F47067\">when<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       ContextCompat.<\/span><span style=\"color: #DCBDFB\">checkSelfPermission<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           <\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           Manifest.permission.CAMERA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       ) <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> PackageManager.PERMISSION_GRANTED <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           layout.<\/span><span style=\"color: #DCBDFB\">showSnackbar<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               view,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               <\/span><span style=\"color: #DCBDFB\">getString<\/span><span style=\"color: #ADBAC7\">(R.string.permission_granted),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               Snackbar.LENGTH_INDEFINITE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               <\/span><span style=\"color: #6CB6FF\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           ) {}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       ActivityCompat.<\/span><span style=\"color: #DCBDFB\">shouldShowRequestPermissionRationale<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           <\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           Manifest.permission.CAMERA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       ) <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           layout.<\/span><span style=\"color: #DCBDFB\">showSnackbar<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               view,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               <\/span><span style=\"color: #DCBDFB\">getString<\/span><span style=\"color: #ADBAC7\">(R.string.permission_required),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               Snackbar.LENGTH_INDEFINITE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               <\/span><span style=\"color: #DCBDFB\">getString<\/span><span style=\"color: #ADBAC7\">(R.string.ok)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               requestPermissionLauncher.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                   Manifest.permission.CAMERA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           requestPermissionLauncher.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">               Manifest.permission.CAMERA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ubc84\ud2bc \ud074\ub9ad\uc2dc, permission\uc744 \uc694\uccad\ud558\ub3c4\ub85d \uad6c\ud604\ub41c \ub0b4\uc6a9\uc774\ub2e4. when\ubb38\uc758 \ud750\ub984\uc740 \uc704\uc5d0\uc11c \uc544\ub798\ub85c \uc21c\uc11c\ub300\ub85c \uc9c4\ud589\ub418\uba70, \uc870\uac74\uc5d0 \ubd80\ud569\ub418\uba74 \ub9ac\ud134\ub41c\ub2e4. <\/p>\n\n\n\n<p> \ud50c\ub85c\uc6b0 \ucc28\ud2b8\uc640 \ub3d9\uc77c\ud558\uac8c, \uc2dc\uc791\uc740 \uad8c\ud55c\uc758 \uc720\ubb34\ub97c \uccb4\ud06c\ud558\ub294 \uac83\uc774\ub2e4. \ucf54\ub4dc\ub97c \ubcf4\uba74, ContextCompat.checkPermission()\uc744 \uc774\uc6a9\ud558\uc5ec Camera permission\uc744 \ud655\uc778\ud558\uace0 \uc788\uc73c\uba70, PERMISSION_GRANTED\uac00 \ub9ac\ud134\ub418\uba74 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc73c\ub85c \uc815\uc0c1 \uc2e4\ud589\ub41c\ub2e4. <\/p>\n\n\n\n<p>\uad8c\ud55c \uccb4\ud06c\ub97c \ud588\ub294\ub370, \uad8c\ud55c\uc774 \uc5c6\ub294 \uacbd\uc6b0, shouldShowRequestPermissionRationale()\uc744 \ud574\ub2f9 permission\uc5d0 \ub300\ud574 \ud655\uc778\ud55c\ub2e4. \uc5ec\uae30\uc11c\ub294 CAMERA permission\uc744 \ud655\uc778\ud558\uace0 \uc788\ub2e4. true\uac00 \ub9ac\ud134\ub418\uba74, \uc5ec\uae30\uc11c\ub294 \uac04\ub2e8\ud558\uac8c snackbar\ub97c \uc774\uc6a9\ud558\uc5ec \uad8c\ud55c\uc758 \ud544\uc694\uc131\uc744 \ud45c\uc2dc\ud558\uace0, OK\ub97c \ud558\ub294 \uacbd\uc6b0 request permission\uc744 \uc218\ud589\ud55c\ub2e4. snackbar\ub098 request permission \ubd80\ubd84\uc758 \uad6c\ud604\uc740 \ub4a4\uc5d0 \uc124\uba85\ud558\uaca0\ub2e4.<\/p>\n\n\n\n<p> \uc55e\uc11c \uccb4\ud06c\ud55c \uc870\uac74\ub4e4\uc744 \ub9cc\uc871\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74, \uad8c\ud55c\uc774 \uc5c6\uace0, Rationale\ud45c\uc2dc\uac00 \ud544\uc694\uc5c6\ub2e4\ub294 \uc598\uae30\uc774\ubbc0\ub85c, \ubc14\ub85c request permission\uc744 \uc218\ud589\ud55c\ub2e4. <\/p>\n\n\n\n<p>\uc0dd\uac01\ubcf4\ub2e4 \ud750\ub984\uc774 \ub2e8\uc21c\ud558\uac8c \uad6c\ud604\ub418\ub294\uac78 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \uadf8\ub7ec\uba74, permission\uc694\uccad\uc2dc \uc0ac\uc6a9\ub418\ub294 requestPermissionLauncher\ub97c \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. requestPermissionLauncher \uc758 \uad6c\ud604<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private val requestPermissionLauncher =\n   registerForActivityResult(\n       ActivityResultContracts.RequestPermission()\n   ) { isGranted: Boolean ->\n       if (isGranted) {\n           Log.i(\"Permission: \", \"Granted\")\n       } else {\n           Log.i(\"Permission: \", \"Denied\")\n       }\n   }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> requestPermissionLauncher <\/span><span style=\"color: #F47067\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #DCBDFB\">registerForActivityResult<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       ActivityResultContracts.<\/span><span style=\"color: #DCBDFB\">RequestPermission<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   ) { isGranted: <\/span><span style=\"color: #F69D50\">Boolean<\/span><span style=\"color: #ADBAC7\"> -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (isGranted) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;Granted&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       } <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;Denied&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>registerForActivityResult()\ub294 <a href=\"http:\/\/batmask.dothome.co.kr\/index.php\/2021\/10\/21\/977\/\">\ubc14\ub85c \uc774\uc804 \ud3ec\uc2a4\ud2b8<\/a>\uc5d0\uc11c \uc124\uba85\ud55c\ub300\ub85c startActivityForResult()\uc640 onActivityResult()\uac00 deprecated\ub418\uace0 \uc0ac\uc6a9\ub418\ub294 \ubc29\ubc95\uc774\ub2e4. \uc774\uac8c \ubb54\uc9c0 \ubaa8\ub974\uaca0\ub2e4\uba74 \ud574\ub2f9 \ud3ec\uc2a4\ud2b8\ub97c \ucc38\uc870\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n\n\n\n<p>registerForActivityResult()\uc5d0 RequestPermssion() \uc774\ub77c\ub294 contract\ub97c \ub118\uaca8\uc8fc\uace0 \uc788\ub2e4. \uc774\ub294 \ubbf8\ub9ac \uc815\uc758\ub41c default contract\ub85c permission\uc694\uccad\uc2dc \uc0ac\uc6a9\ub41c\ub2e4. \ub9ac\ud134\uac12\uc774 Boolean\uc73c\ub85c \uc0ac\uc6a9\uc790\uac00 &#8216;\ud5c8\uc6a9&#8217;\ud588\ub294\uc9c0, &#8216;\uac70\ubd80&#8217;\ud588\ub294\uc9c0\ub97c \ub3cc\ub824\uc900\ub2e4. callback\ud568\uc218\ub85c\ub294 lambda function\uc744 \uc368\uc11c \uad04\ud638 \ubc16\uc5d0 \uae30\uc220\ud558\uace0 \uc788\ub2e4. \uc0d8\ud50c\ucf54\ub4dc\ub85c \ub85c\uadf8\ub97c \ucc0d\ub294 \uac83 \uc678\uc5d0 \ud558\ub294\uc77c\uc774 \uc5c6\uc9c0\ub9cc, \ub9ac\ud134\uac12\uc73c\ub85c \ubc1b\ub294 isGranted\uac00 true\uc774\uba74 \ud5c8\uc6a9\ub41c \uac83\uc73c\ub85c \uc815\uc0c1\uc801\uc778 \uc2e4\ud589\uc744 \uc9c4\ud589\ud558\uba74 \ub418\uace0, false\uc774\uba74 \uac70\ubd80\ud55c \uac83\uc774\ubbc0\ub85c \ud574\ub2f9\uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub294 \uc0c1\ud0dc\ub85c \uc9c4\ud589\ud558\uba74 \ub41c\ub2e4. <\/p>\n\n\n\n<p>\uc774\ub807\uac8c registerForActivityResult()\ub85c \ub9ac\ud134\ub41c launcher\ub97c \uac00\uc9c0\uace0 \uc788\ub2e4\uac00 \uc800 \uc704\uc758 \uad6c\ud604\uc5d0\uc11c \ubcf4\ub4ef, \ud544\uc694\uc2dc\uc5d0 launcher.launch(  Manifest.permission.CAMERA )\ub97c \uc774\uc6a9\ud558\uc5ec permission\uc744 \uc694\uccad\ud558\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. \uc608\uc81c\uc5d0\uc11c \uc0ac\uc6a9\ub41c snackbar\uc758 \uad6c\ud604<\/h4>\n\n\n\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc608\uc81c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 Snackbar\uc758 \uad6c\ud604\uc740 extension function\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 \uc788\uc73c\uba70 \ub2e4\uc74c\uacfc \uac19\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun View.showSnackbar(\n   view: View,\n   msg: String,\n   length: Int,\n   actionMessage: CharSequence?,\n   action: (View) -> Unit\n) {\n   val snackbar = Snackbar.make(view, msg, length)\n   if (actionMessage != null) {\n       snackbar.setAction(actionMessage) {\n           action(this)\n       }.show()\n   } else {\n       snackbar.show()\n   }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">showSnackbar<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   view: <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   msg: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   length: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   actionMessage: <\/span><span style=\"color: #F69D50\">CharSequence<\/span><span style=\"color: #ADBAC7\">?,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   action: (<\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">) -&gt; <\/span><span style=\"color: #F69D50\">Unit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> snackbar <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Snackbar.<\/span><span style=\"color: #DCBDFB\">make<\/span><span style=\"color: #ADBAC7\">(view, msg, length)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (actionMessage <\/span><span style=\"color: #F47067\">!=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       snackbar.<\/span><span style=\"color: #DCBDFB\">setAction<\/span><span style=\"color: #ADBAC7\">(actionMessage) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">           <\/span><span style=\"color: #DCBDFB\">action<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       }.<\/span><span style=\"color: #DCBDFB\">show<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   } <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       snackbar.<\/span><span style=\"color: #DCBDFB\">show<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5ec\ub7ec\uac1c\uc758 permission\uc744 \uc694\uccad\ud558\ub294 \uacbd\uc6b0.<\/h3>\n\n\n\n<p> \ub05d\ub0b4\uae30\uc804\uc5d0 \uc774\ub7f0 \uc758\ubb38\uc774 \ub4e4\uc9c0\ub3c4 \ubaa8\ub974\uaca0\ub2e4. \uc5ec\ub7ec\uac1c\uc758 permission\uc744 \uc694\uccad\ud558\ub294 \uacbd\uc6b0\ub77c\uba74? registerForActivityResult()\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 RequestMultiplePermissions contract\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private val requestPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grantedMap ->\n            for(item in grantedMap) {\n                when(item.key) {\n                    android.Manifest.permission.CAMERA -> {\n                        Log.i(\"Permission: \", \"CAMERA is granted : ${item.value}\")\n                    }\n\n                    android.Manifest.permission.ACCESS_FINE_LOCATION -> {\n                        Log.i(\"Permission: \", \"FINE_LOCATION is granted : ${item.value}\")\n                    }\n\n                    android.Manifest.permission.ACCESS_COARSE_LOCATION -> {\n                        Log.i(\"Permission: \", \"COARSE_LOCATION is granted : ${item.value}\")\n                    }\n                }\n            }\n        }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> requestPermissionLauncher <\/span><span style=\"color: #F47067\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">registerForActivityResult<\/span><span style=\"color: #ADBAC7\">(ActivityResultContracts.<\/span><span style=\"color: #DCBDFB\">RequestMultiplePermissions<\/span><span style=\"color: #ADBAC7\">()) { grantedMap <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\">(item <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> grantedMap) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">when<\/span><span style=\"color: #ADBAC7\">(item.key) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    android.Manifest.permission.CAMERA <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                        Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;CAMERA is granted : ${item.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #96D0FF\">}&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    android.Manifest.permission.ACCESS_FINE_LOCATION <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                        Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;FINE_LOCATION is granted : ${item.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #96D0FF\">}&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    android.Manifest.permission.ACCESS_COARSE_LOCATION <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                        Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;COARSE_LOCATION is granted : ${item.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #96D0FF\">}&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucc28\uc774\uc810\uc774\ub77c\uba74, \uc5ec\ub7ec\uac1c\uc758 permission\uc744 \ucc98\ub9ac\ud574\uc57c \ud558\ubbc0\ub85c \ubc18\ud658\ub418\ub294 \uac12\uc774 map&lt;String, Boolean&gt;\uc758 \ud615\ud0dc\ub85c \ub418\uc5b4\uc788\ub2e4. permission \uc774\ub984 String\uacfc granted \uc5ec\ubd80\uac00 Boolean\uc73c\ub85c \ud45c\uc2dc\ub41c\ub2e4. \uc704 \uc608\uc81c\uc5d0 \ubcf4\ub4ef, \uac01 permission\uc5d0 \ub300\ud574 \ud5c8\uc6a9 \uc5ec\ubd80\ub97c \ud655\uc778 \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>\uc544, \ud55c\uac00\uc9c0 \ub354, launcher\ub97c \uc2e4\ud589 \ud560 \ub54c, \ub2f9\uc5f0\ud558\uac8c\ub3c4 \uc5ec\ub7ec\uac1c\uc758 permission\uc744 \ub123\uc5b4\uc918\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>requestPermissionLauncher.launch(\n                    arrayOf(android.Manifest.permission.CAMERA,\n                        android.Manifest.permission.ACCESS_FINE_LOCATION,\n                        android.Manifest.permission.ACCESS_COARSE_LOCATION)\n                )<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">requestPermissionLauncher.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #DCBDFB\">arrayOf<\/span><span style=\"color: #ADBAC7\">(android.Manifest.permission.CAMERA,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                        android.Manifest.permission.ACCESS_FINE_LOCATION,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                        android.Manifest.permission.ACCESS_COARSE_LOCATION)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                )<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc55e\uc5d0\uc11c CAMERA\ud558\ub098\ub9cc \ub118\uaca8\uc8fc\ub358 \ubd80\ubd84\uc5d0 permission string\ub4e4\uc5d0 \ub300\ud55c array\ub85c \ub118\uaca8\uc8fc\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0dd\uac01\ud574\ubcfc \ubb38\uc81c?<\/h3>\n\n\n\n<p>\uc774\uac83\uc73c\ub85c \uc815\ub9ac\ub294 \ud588\ub294\ub370, \ub05d\ub0b4\uae30 \uc804\uc5d0 \uc0dd\uac01\ud574\ubd10\uc57c\ud560 \ubb38\uc81c\uac00 \ud558\ub098 \uc788\uae34 \ud558\ub2e4. \uc0ac\uc6a9\uc790\uac00 permission\uc744 \uac70\ubd80\ud558\uace0, \ub610 \uac70\ubd80\ud558\uba74\uc11c \ub2e4\uc2dc\ud45c\uc2dc \uc548\ud568\uc744 \uc120\ud0dd\ud588\ub2e4\uba74, \uc571\uc5d0\uc11c\ub294 permission\uc744 \ub2e4\uc2dc \uc694\uccad\ud560 \ubc29\ub3c4\uac00 \uc5c6\ub2e4. \ud544\uc694\ud558\ub2e4\uba74, \uc0ac\uc6a9\uc790\uac00 \uc9c1\uc811 \uad8c\ud55c\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \uc571 \uc124\uc815\uc73c\ub85c \uc548\ub0b4\ub97c \ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc744 \uc218 \uc788\uae34\ud55c\ub370, \uc774 \uc0c1\ud0dc\ub97c \uccb4\ud06c\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \uc788\ub294\uc9c0\ub3c4 \uc758\ubb38\uc774\ub2e4. \uadfc\ubcf8\uc801\uc73c\ub85c \uc774\uac78 \uace0\ubbfc\ud574\uc57c \ud558\ub294\uc9c0 \uc790\uccb4\uac00 \uace0\ubbfc\uc774\ub2e4. \uc120\ud0dd\uc740 \ub2f9\uc2e0\uc758 \ubaab \ud83d\ude42<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Update 1 (2021.10.26)<\/h4>\n\n\n\n<p> \uc0ac\uc6a9\uc790\uac00 permission\uc744 \uac70\ubd80\ud558\uace0, \ub2e4\uc2dc\ud45c\uc2dc \uc548\ud568\uc744 \uc120\ud0dd\ud55c \uacbd\uc6b0\uc5d0 shouldShowRequestPermissionRationale()\uc774 false\ub97c \ub9ac\ud134\ud55c\ub2e4. \uadf8\ub7ec\ub2c8\uae4c, \ub2e4\uc2dc\ud45c\uc2dc \uc548\ud568 \uc0c1\ud0dc\uc5d0\uc11c request permission\uc744 \ud558\uba74 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc544\ubb34\uac83\ub3c4 \ubcf4\uc5ec\uc8fc\uc9c0 \uc54a\uace0 \uc751\ub2f5\uc774 deny\uac00 \ub420 \uac83\uc774\ub2e4. \uc774 \ub54c, shouldShowRequestPermissionRationale()\uc744 \uccb4\ud06c\ud558\uba74, \ud574\ub2f9 \uc0c1\ud0dc\ub97c \uc54c \uc218 \uc788\uace0, \ud544\uc694\ud55c \uacbd\uc6b0 App\uc758 Settings \ud654\uba74\uc73c\ub85c \uc0ac\uc6a9\uc790\ub97c \uc720\ub3c4\ud560 \uc218\ub3c4 \uc788\ub2e4. \uc55e\uc5d0\uc11c \ub2e4\ub8ec \uc0d8\ud50c \ucf54\ub4dc\ub85c \ubcf4\uba74 \ub2e4\uc74c \uc704\uce58\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4\ub294 \uc598\uae30.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private val requestPermissionLauncher =\n   registerForActivityResult(\n       ActivityResultContracts.RequestPermission()\n    ) { isGranted: Boolean ->\n        if (isGranted) {\n            Log.i(\"Permission: \", \"Granted\")\n        } else {\n            Log.i(\"Permission: \", \"Denied\")\n            if(!shouldShowRequestPermissionRationale()) {\n                \/\/ PERMISSION DENIED AND NEVER SHOW AGAIN. \n                \/\/ '\uac70\ubd80 \ubc0f \ub2e4\uc2dc \ubb3b\uc9c0 \uc54a\uc74c' \uc694\uae30\uc11c \uccb4\ud06c \uac00\ub2a5.\n            } \n        }\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> requestPermissionLauncher <\/span><span style=\"color: #F47067\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #DCBDFB\">registerForActivityResult<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">       ActivityResultContracts.<\/span><span style=\"color: #DCBDFB\">RequestPermission<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    ) { isGranted: <\/span><span style=\"color: #F69D50\">Boolean<\/span><span style=\"color: #ADBAC7\"> -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (isGranted) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;Granted&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        } <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Permission: &quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;Denied&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">!<\/span><span style=\"color: #DCBDFB\">shouldShowRequestPermissionRationale<\/span><span style=\"color: #ADBAC7\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #768390\">\/\/ PERMISSION DENIED AND NEVER SHOW AGAIN. <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #768390\">\/\/ &#39;\uac70\ubd80 \ubc0f \ub2e4\uc2dc \ubb3b\uc9c0 \uc54a\uc74c&#39; \uc694\uae30\uc11c \uccb4\ud06c \uac00\ub2a5.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            } <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\uc548\ub4dc\ub85c\uc774\ub4dc\uc758 permission\uc740 \ucd08\uae30\uc5d0\ub294 Manifest\uc5d0 \ucd94\uac00\ub9cc \ud574\uc8fc\uba74 \ud574\uacb0 \ub410\uc9c0\ub9cc, \ubcf4\uc548\uc774 \uac15\ud654\ub418\uba74\uc11c API 23\ubd80\ud130 \uc0ac\uc9c4\uc744 \ucc0d\uac70\ub098 \uc704\uce58\uc815\ubcf4\ub97c \uc774\uc6a9\ud558\ub294\ub4f1\uc758 \uacbd\uc6b0\uc5d0 \ub7f0\ud0c0\uc784\uc73c\ub85c \uc694\uccad\uc744 \ud574\uc11c \uc0ac\uc6a9\uc790 \ud655\uc778\uc744 \ubc1b\uc544\uc57c \ud55c\ub2e4. Runtime Permissions\ub294 dangerous permissions\ub77c\uace0\ub3c4 \ud558\uba70, \uc2dc\uc2a4\ud15c\uc774\ub098 \ub2e4\ub978\uc571\uc5d0\uac8c \uc601\ud5a5\uc744 \uc904 \uc218 \uc788\ub294 \uc601\uc5ed\uc5d0 \uc811\uadfc\ud560 \ub54c \ud544\uc694\ud558\ub2e4. runtime \uc73c\ub85c permission\uc744 \uc694\uccad\ud558\uba74 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ub2e4\uc74c\uacfc \uac19\uc740 \ub300\ud654\uc0c1\uc790\uac00 \ud45c\uc2dc\ub41c\ub2e4. \uc0ac\uc6a9\uc790\ub294 \ud5c8\uc6a9\/\uac70\ubd80\ub97c <a href=\"http:\/\/batmask.net\/index.php\/2021\/10\/22\/1213\/\" class=\"btn btn-link continue-link\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[186,253,250,251,252],"class_list":["post-1213","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-dangerous-permission","tag-permission","tag-request","tag-runtime-permission"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=1213"}],"version-history":[{"count":13,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1213\/revisions"}],"predecessor-version":[{"id":3479,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1213\/revisions\/3479"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=1213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=1213"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=1213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}