<blockquote>
<p>이글은 2017년 7월에 작성 됨</p>
</blockquote>
<h1 id="마시멜로우-api-23-이상에서-권한-체크와-권한-요청하기">마시멜로우 API 23 이상에서 권한 체크와 권한 요청하기</h1>
<p>Android 6.0(API 레벨 23)부터 사용자는 앱이 설치될 때가 아니라 <strong>앱이 실행되는 중에 앱에 권한을 부여</strong>합니다. 이 접근방식에서는 사용자가 앱을 설치하거나 업데이트할 때 권한을 부여할 필요가 없으므로 앱 설치 과정이 간소화됩니다. 또한 사용자가 앱의 기능을 더 세부적으로 제어할 수 있습니다. 예를 들어, 기기 위치가 아니라 카메라에 대한 액세스 권한을 카메라 앱에 부여하도록 선택할 수 있습니다. 사용자는 앱 설정 화면으로 이동하여 언제든지 권한을 취소할 수 있습니다.</p>
<ul>
<li><p><a href="https://developer.android.com/training/permissions/requesting.html#perm-checkl">안드로이드 개발자 페이지 런타임에 권한체크</a></p></li>
<li><p><a href="https://developer.android.com/training/permissions/requesting.html#perm-request">안드로이드 개발자 페이지 런타임에 권한 요청</a></p></li>
</ul>
<h2 id="androidmanifestxml">AndroidManifest.xml</h2>
<p><code>androidmanifest.xml</code>에 필요로 하는 권한을 입력합니다.</p>
<pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.READ_CALENDAR"</span>/></span></code></pre>
<h2 id="mainactivityjava">MainActivity.java</h2>
<h3 id="권한-체크가-필요한-버전인지-확인">권한 체크가 필요한 버전인지 확인</h3>
<pre class="prettyprint"><code class="language-java hljs "><span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
<span class="hljs-keyword">return</span>;
}</code></pre>
<p><code>protected void onCreate(Bundle saveInstanceState)</code> 아래에 다음과 같은 코드를 사용해서 권한 설정이 제대로 되어 있는지 확인합니다.0</p>
<pre class="prettyprint"><code class="language-java hljs "><span class="hljs-keyword">int</span> permissionCheck = ContextCompat.checkSelfPermission(<span class="hljs-keyword">this</span>,
Manifest.permission.READ_CALENDAR);
<span class="hljs-keyword">if</span> (permissionCheck == PackageManager.PERMISSION_GRANTED){
Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한이 있음"</span>, Toast.LENGTH_SHORT).show();
}<span class="hljs-keyword">else</span>{
Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한이 없음"</span>, Toast.LENGTH_SHORT).show();
<span class="hljs-keyword">if</span> (ActivityCompat.shouldShowRequestPermissionRationale(<span class="hljs-keyword">this</span>,Manifest.permission.READ_CALENDAR)){
Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한설명이 필요함"</span>, Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(
<span class="hljs-keyword">this</span>,
<span class="hljs-keyword">new</span> String[] {Manifest.permission.READ_CALENDAR},
<span class="hljs-number">1</span>);
}<span class="hljs-keyword">else</span>{
ActivityCompat.requestPermissions(
<span class="hljs-keyword">this</span>,
<span class="hljs-keyword">new</span> String[] {Manifest.permission.READ_CALENDAR},
<span class="hljs-number">1</span>);
}
}</code></pre>
<p>이제 앱을 실행하면 권한이 제대로 되었는지 체크 할 수 있습니다.</p>
<p>다음은 권한 체크의 결과 화면에 따른 이벤트를 줄 수 있습니다. 권한이 <code>승인</code>되었으면 어떻게 동작하고, <code>거부</code>하였을 동작하는 기능을 합니다.</p>
<p><code>CTRL</code>+<code>O</code> 키를 눌러서 아래와 같은 화면에서 onRequestPermissionResult 를 찾습니다.</p>
<p><img src="http://i.imgur.com/9MBT72U.png" alt="Imgur" title=""></p>
<pre class="prettyprint"><code class="language-java hljs ">
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onRequestPermissionsResult</span>(<span class="hljs-keyword">int</span> requestCode, @NonNull String[] permissions, @NonNull <span class="hljs-keyword">int</span>[] grantResults) {
<span class="hljs-keyword">switch</span> (requestCode){
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: {
<span class="hljs-keyword">if</span> (grantResults.length > <span class="hljs-number">0</span> && grantResults[<span class="hljs-number">0</span>] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한을 사용자가 승인함"</span>, Toast.LENGTH_SHORT).show();
}<span class="hljs-keyword">else</span>{
Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한 거부됨"</span>, Toast.LENGTH_SHORT).show();
}
<span class="hljs-keyword">return</span>;
}
}
}</code></pre>
<p>메소드들을 검색하다 보면 신기한 이벤트들을 찾아 볼 수 있습니다. 정말 할 수 있는게 무궁무진 하다는 것을 알 수 있습니다.</p>