diff options
author | David Friedman <dmail@google.com> | 2015-06-29 16:03:08 -0700 |
---|---|---|
committer | David Friedman <dmail@google.com> | 2015-06-29 16:03:08 -0700 |
commit | 4fd1a573eb0724251b5c0986c7f0ae7b36d52369 (patch) | |
tree | 3b02b8800d002fd5e19fe7b170988ec61cbb5fad /docs/html-intl/intl/ko | |
parent | 3686e0430f8366e2f4de867eeabfd1b7fe4aefc0 (diff) | |
download | frameworks_base-4fd1a573eb0724251b5c0986c7f0ae7b36d52369.zip frameworks_base-4fd1a573eb0724251b5c0986c7f0ae7b36d52369.tar.gz frameworks_base-4fd1a573eb0724251b5c0986c7f0ae7b36d52369.tar.bz2 |
Docs: Localized M-Preview pages
Bug: 21789313
Change-Id: Ifb4a45a65acd7b786e05bdf7b7dd86698093fbdf
Diffstat (limited to 'docs/html-intl/intl/ko')
-rw-r--r-- | docs/html-intl/intl/ko/preview/api-overview.jd | 521 | ||||
-rw-r--r-- | docs/html-intl/intl/ko/preview/behavior-changes.jd | 402 | ||||
-rw-r--r-- | docs/html-intl/intl/ko/preview/features/runtime-permissions.jd | 794 | ||||
-rw-r--r-- | docs/html-intl/intl/ko/preview/overview.jd | 362 |
4 files changed, 2079 insertions, 0 deletions
diff --git a/docs/html-intl/intl/ko/preview/api-overview.jd b/docs/html-intl/intl/ko/preview/api-overview.jd new file mode 100644 index 0000000..aac9a44 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/api-overview.jd @@ -0,0 +1,521 @@ +page.title=API 개요 +page.keywords=미리 보기, SDK, 호환성 +page.tags=previewresources, androidm +sdk.platform.apiLevel=22-mnc +page.image=images/cards/card-api-overview_16-9_2x.png +@jd:body + + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>이 문서의 내용 + <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle"> + <span class="more">더 보기</span> + <span class="less" style="display:none">숨기기</span></a></h2> + +<ol id="toc44" class="hide-nested"> + <li><a href="#app-linking">앱 연결</a></li> + <li><a href="#backup">앱용 자동 백업</a></li> + <li><a href="#authentication">인증</a> + <ol> + <li><a href="#fingerprint-authentication">지문 인증</a></li> + <li><a href="#confirm-credential">확인 자격 증명</a></li> + </ol> + </li> + <li><a href="#direct-share">직접 공유</a></li> + <li><a href="#voice-interactions">음성 상호작용</a></li> + <li><a href="#assist">지원 API</a></li> + <li><a href="#notifications">알림</a></li> + <li><a href="#bluetooth-stylus">블루투스 스타일러스 지원</a></li> + <li><a href="#ble-scanning">블루투스 저전력 스캔 개선</a></li> + <li><a href="#hotspot">핫스팟 2.0 릴리스 1 지원</a></li> + <li><a href="#4K-display">4K 디스플레이 모드</a></li> + <li><a href="#behavior-themeable-colorstatelists">테마 지정 가능 ColorStateLists</a></li> + <li><a href="#audio">오디오 기능</a></li> + <li><a href="#video">비디오 기능</a></li> + <li><a href="#camera">카메라 기능</a> + <ol> + <li><a href="#flashlight">Flashlight API</a></li> + <li><a href="#reprocessing">카메라 재처리</a></li> + </ol> + </li> + <li><a href="#afw">Android for Work 기능</a></li> +</ol> + +<h2>API 차이점</h2> +<ol> +<li><a href="{@docRoot}preview/download.html">M 미리 보기에 대한 API 레벨 22 »</a> </li> +</ol> + +</div> +</div> + +<p>M 개발자 미리 보기에서는 다가오는 Android 플랫폼 릴리스를 미리 볼 수 있도록 하였습니다. 이 릴리스는 사용자와 앱 개발자를 위한 여러 가지 새 기능을 제공합니다. + + 이 문서에서는 가장 중요한 API를 몇 가지 소개합니다.</p> + +<p>M 개발자 미리 보기는 <strong>개발자 얼리 어답터</strong>와 <strong>테스터</strong>를 위해 마련된 것입니다. + Android 프레임워크가 나아갈 방향에 영향을 미치는 데 관심이 있으시다면, <a href="{@docRoot}preview/setup-sdk.html">M 개발자 미리 보기를 시도해 보시고</a> 피드백을 보내주세요! + + +</p> + +<p class="caution"><strong>주의:</strong> M 개발자 미리 보기를 사용하는 앱을 Google Play 스토어에 게시하지 마세요. +</p> + +<p class="note"><strong>참고:</strong> 이 문서에서 종종 언급하는 클래스와 메서드 중에는 아직 <a href="{@docRoot}">developer.android.com</a>에서 참조 자료로 이용할 수 없는 것도 있습니다. + 이와 같은 API 요소는 이 문서에서 {@code code style}로 형식 지정되어 있습니다(하이퍼링크 없이). + 이러한 요소에 대한 임시 API 관련 문서가 필요한 경우, <a href="{@docRoot}preview/download.html#docs">미리 보기 참조</a>를 다운로드하세요. +</p> + +<h3>중요한 동작 변경</h3> + +<p>이전에 Android용 앱을 게시한 적이 있는 경우, 플랫폼 변경으로 인해 앱이 영향받을 수 있다는 점을 유의하세요. +</p> + +<p>완전한 정보는 <a href="behavior-changes.html">동작 변경</a>을 참조하세요.</p> + +<h2 id="app-linking">앱 연결</h2> +<p>이 미리 보기는 더욱 강력한 앱 연결을 제공하여 Android의 인텐트 시스템을 한층 강화합니다. 이 기능을 사용하면 앱을 본인이 소유한 웹 도메인과 연관시킬 수 있습니다. + 플랫폼은 이 연관 관계를 근거로 특정한 웹 링크를 처리하는 데 사용할 기본 앱을 결정할 수 있고 사용자에게 앱을 선택하라는 메시지를 건너뛸 수 있습니다. 이 기능을 구현하는 방법을 알아보려면 <a href="{@docRoot}preview/features/app-linking.html">앱 연결</a>을 참조하세요. + + + + +<h2 id="backup">앱용 자동 백업</h2> +<p>시스템에서 이제 앱에 대한 완전한 데이터 백업과 복원을 자동으로 수행합니다. 이 동작은 앱 대상 지정 M 미리 보기에 대한 기본으로 활성화되며, 추가 코드를 전혀 추가하지 않아도 됩니다. + 사용자가 Google 계정을 삭제하면 계정의 백업 데이터도 함께 삭제됩니다. + 이 기능의 작동 원리와 파일 시스템에서 백업 내용 구성하는 방법에 대해 알아보려면 <a href="{@docRoot}preview/backup/index.html">앱용 자동 백업</a>을 참조하세요. + +</p> + +<h2 id="authentication">인증</h2> +<p>이 미리 보기에서는 사용자를 인증할 때 지원되는 기기에서 지문 스캔을 사용하도록 해주는 새로운 API를 제공합니다. 또한 기기 잠금 해제 메커니즘(예: 화면 잠금 비밀번호)을 사용해 사용자의 마지막 인증 시간을 확인할 수도 있습니다. + + 이러한 API는 <a href="{@docRoot}training/articles/keystore.html">Android Keystore 시스템</a>과 함께 사용하세요. +</p> + +<h3 id="fingerprint-authentication">지문 인증</h3> + +<p>지문 스캔을 통해 사용자를 인증하려면 새로운 {@code android.hardware.fingerprint.FingerprintManager} 클래스의 인스턴스를 가져와 {@code FingerprintManager.authenticate()} 메서드를 호출하세요. + + 앱이 지문 센서가 있는 호환되는 기기에서 실행되고 있어야 합니다. + 지문 인증 흐름에 대한 사용자 인터페이스를 앱에 구현해야 하며, UI에 표준 Android 지문 아이콘을 사용해야 합니다. 이 Android 지문 아이콘({@code c_fp_40px.png})은 <a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">샘플 앱</a>에 포함되어 있습니다. 지문 인증을 사용하는 앱을 여러 개 개발하는 경우, 각 앱이 사용자의 지문을 따로따로 인증해야 한다는 사실을 명심하세요. + + + + +</p> + +<p>앱에서 이 기능을 사용하려면 우선 매니페스트에 {@code USE_FINGERPRINT} 권한을 추가해야 합니다. +</p> + +<pre> +<uses-permission + android:name="android.permission.USE_FINGERPRINT" /> +</pre> + +<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" /> + +<p>지문 인증의 앱 구현을 확인하려면, <a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">지문 대화 샘플</a>을 참조하세요. + +</p> + +<p>이 기능을 테스트하는 경우, 다음 단계를 따르면 됩니다.</p> +<ol> +<li>아직 Android SDK 도구 수정 버전 24.3을 설치합니다(설치하지 않은 경우).</li> +<li>에뮬레이터에 새 지문을 등록하려면 <strong>설정 > 보안 > 지문</strong>으로 이동한 다음, 등록 지침을 따르면 됩니다. +</li> +<li>에뮬레이터를 사용하여 지문 터치 이벤트를 에뮬레이트하되 다음 명령을 사용하세요. + 잠금 화면이나 앱에서 지문 터치 이벤트를 에뮬레이트할 때에도 같은 명령을 사용합니다. + +<pre class="no-prettyprint"> +adb -e emu finger touch <finger_id> +</pre> +<p>Windows에서는 {@code telnet 127.0.0.1 <emulator-id>}에 뒤이어 {@code finger touch <finger_id>}를 실행해야 할 수도 있습니다. + +</p> +</li> +</ol> + +<h3 id="confirm-credential">확인 자격 증명</h3> +<p>앱에서 사용자를 인증할 때 해당 사용자가 기기를 마지막으로 잠금 해제한 시간을 근거로 할 수 있습니다. 이 기능을 사용하면 사용자가 앱에 따라 각기 다른 비밀번호를 기억할 필요가 없어지고, 개발자는 자신만의 인증 사용자 인터페이스를 구현하지 않아도 됩니다. + + 앱에서 이 기능을 사용하려면 사용자 인증에 대한 공개 또는 비밀 키 구현과 함께 사용해야 합니다. +</p> + +<p>사용자를 성공적으로 인증한 다음 같은 키를 재사용하기 위한 시간 초과 기간을 설정하려면, 새로운 {@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()} 메서드를 호출하세요. {@link javax.crypto.KeyGenerator} 또는 {@link java.security.KeyPairGenerator}를 설정할 때 사용하면 됩니다. + + + + 현재 이 기능은 대칭형 암호화 작동에 맞게 작동합니다. +</p> + +<p>재인증 대화창을 과도하게 표시하는 것을 삼가세요. 우선 앱에서 암호화 객체 사용을 시도해보고, 제한 시간이 만료되면 {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} 메서드를 사용해 앱 내에서 해당 사용자를 재인증하면 됩니다. + + + +</p> + +<p>이 기능의 앱 구현을 확인하려면, <a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">확인 자격 증명 샘플</a>를 참조하세요. + +</p> + +<h2 id="direct-share">직접 공유</h2> + +<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" /> + +<p>이 미리 보기에서는 사용자가 공유 기능을 간편하고 신속하게 이용할 수 있도록 해주는 API를 제공합니다. 이제 앱에서 특정 액티비티를 시작하는 <em>직접 공유 대상</em>을 정의할 수 있습니다. 이와 같은 직접 공유 대상은 <em>공유</em> 메뉴를 통해 사용자에게 노출됩니다. + + 이 기능을 사용하면 사용자가 다른 앱 내의 대상(예: 연락처)에 대해 콘텐츠를 공유할 수 있습니다. + 예를 들어, 직접 공유 대상이 다른 소셜 네트워크 앱에서 액티비티를 시작하면 사용자가 해당 앱에 있는 특정 친구나 커뮤니티와 콘텐츠를 공유할 수 있습니다. + +</p> + +<p>직접 공유 대상을 활성화하려면 반드시 {@code android.service.} + <br> +{@code chooser.ChooserTargetService} 클래스를 확장하는 클래스를 정의해야 합니다. 매니페스트에서 {@code ChooserTargetService}를 선언하고 + 해당 선언 내에서 {@code BIND_CHOOSER_TARGET_SERVICE} 권한을 지정하고 {@code SERVICE_INTERFACE} 작업으로 인텐트 필터를 지정합니다. + +</p> +<p>다음 예는 매니페스트에서 {@code ChooserTargetService}를 선언할 수 있는 방법입니다. +</p> +<pre> +<service android:name=".ChooserTargetService" + android:label="@string/service_name" + android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"> + <intent-filter> + <action android:name="android.service.chooser.ChooserTargetService" /> + </intent-filter> +</service> +</pre> + +<p>{@code ChooserTargetService}에 노출하고자 하는 액티비티마다 {@code <meta-data>} 요소를 하나씩 추가하고, 앱 매니페스트에 {@code "android.service.chooser.chooser_target_service"} 이름을 추가합니다. + + +</p> + +<pre> +<activity android:name=".MyShareActivity” + android:label="@string/share_activity_label"> + <intent-filter> + <action android:name="android.intent.action.SEND" /> + </intent-filter> +<meta-data + android:name="android.service.chooser.chooser_target_service" + android:value=".ChooserTargetService" /> +</activity> +</pre> + +<h2 id="voice-interactions">음성 상호작용</h2> +<p> +이 미리 보기에서 제공하는 새로운 음성 상호작용 API는 <a href="https://developers.google.com/voice-actions/" class="external-link">음성 액션</a>과 같이 앱에 대화형 음성 환경을 구축할 수 있도록 합니다. + + {@code android.app.Activity.isVoiceInteraction()} 메서드를 호출하여 액티비티가 음성 액션에 대응하여 시작된 것인지 알아보세요. + + 이 경우에 해당되면, 앱이 {@code android.app.VoiceInteractor} 클래스를 사용하여 사용자로부터 음성 확인을 요청하거나, 선택 항목 목록에서 선택하게 하는 등 여러 가지 일을 할 수 있습니다. + + 음성 액션 구현에 대한 자세한 정보는 <a href="https://developers.google.com/voice-actions/interaction/" class="external-link">음성 액션 개발자 사이트</a>를 참조하세요. + +</p> + +<h2 id="assist">지원 API</h2> +<p> +이 미리 보기에서는 사용자가 도우미를 통해 앱에 참여하게 하는 새로운 방식을 제시합니다. 이 기능을 사용하려면, 사용자가 현재 컨텍스트를 사용하기 위해 도우미를 활성화해야 합니다. + 일단 활성화하고 나면 <strong>홈</strong> 버튼을 길게 눌러 해당 도우미를 어느 앱에서나 불러낼 수 있습니다. +</p> +<p>앱이 현재 컨텍스트를 도우미와 공유하지 않기로 선택하는 경우, {@link android.view.WindowManager.LayoutParams#FLAG_SECURE} 플래그를 설정하면 됩니다. + 플랫폼이 도우미에게 전달하는 일반적인 일련의 정보 외에도 앱이 추가적인 정보를 공유할 수 있도록 하려면 새로 나온 {@code android.app.Activity.AssistContent} 클래스를 사용할 수 있습니다. + +</p> + +<p>도우미에게 앱에서 가져온 추가 컨텍스트를 제공하려면, 다음 단계를 따르면 됩니다.</p> + +<ol> +<li>{@link android.app.Application.OnProvideAssistDataListener} 인터페이스를 구현합니다.</li> +<li>{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}를 사용하여 이 수신기를 등록합니다. +</li> +<li>액티비티에 따라 각기 다른 상황별 정보를 제공하려면 {@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()} 콜백을 재정의하고, 선택 사항으로 새로운 {@code Activity.onProvideAssistContent()} 콜백도 재정의합니다. + + +</ol> + +<h2 id="notifications">알림</h2> +<p>이 미리 보기에서는 알림 기능에 다음과 같은 API 변경을 추가합니다.</p> +<ul> + <li>새 {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} 필터 수준이 추가되었습니다. 이것은 새로운 <em>알람 전용</em> 방해 금지 모드에 상응하는 것입니다. +</li> + <li>새 {@code Notification.CATEGORY_REMINDER} 카테고리 값이 추가되었습니다. 이것은 다른 이벤트로부터 사용자가 일정을 지정한 미리 알림({@link android.app.Notification#CATEGORY_EVENT}) 및 알람({@link android.app.Notification#CATEGORY_ALARM})를 구분하는 데 사용됩니다. + + +</li> + <li>새 {@code android.graphics.drawable.Icon} 클래스가 추가되었습니다. 이것은 {@code Notification.Builder.setSmallIcon(Icon)} 및 {@code Notification.Builder.setLargeIcon(Icon)} 메서드를 통해 알림에 첨부할 수 있습니다. + +</li> + <li>새 {@code NotificationManager.getActiveNotifications()} 메서드가 추가되었습니다. 이것을 사용하면 앱이 자신의 알림 중 현재 활성 상태인 것이 무엇인지 알아낼 수 있습니다. + 이 기능을 사용하는 앱 구현을 확인하려면 <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">활성 알림 샘플</a>을 참조하세요. +</li> +</ul> + +<h2 id="bluetooth-stylus">블루투스 스타일러스 지원</h2> +<p>이 미리 보기에서는 블루투스 스타일러스를 사용하는 사용자 입력에 대한 지원을 개선하여 제공합니다. 사용자는 전화기나 태블릿을 호환되는 블루투스 스타일러스와 페어링하고 이에 연결할 수 있습니다. + 연결된 동안 터치 스크린에서 가져온 위치 정보가 스타일러스에서 가져온 압력 및 버튼 정보와 합쳐져 하나의 터치 스크린을 사용할 때보다 훨씬 폭넓은 표현을 제공합니다. + + 앱이 스타일러스 버튼 누르기를 수신 대기하고 보조 작업을 수행하도록 하려면, 액티비티에 새로운 {@code View.onStylusButtonPressListener} 및 {@code GestureDetector.OnStylusButtonPressListener} 콜백을 등록하면 됩니다. + + +</p> + +<p>스타일러스 버튼 상호작용을 감지하려면 {@link android.view.MotionEvent} 메서드와 상수를 사용하세요. +</p> +<ul> +<li>사용자가 앱의 화면에 있는 버튼으로 스타일러스를 터치하면 {@link android.view.MotionEvent#getToolType(int) getTooltype()} 메서드가 {@link android.view.MotionEvent#TOOL_TYPE_STYLUS}를 반환합니다. + +</li> +<li>M 미리 보기를 대상으로 삼는 앱의 경우, {@link android.view.MotionEvent#getButtonState() getButtonState()} 메서드는 사용자가 기본 스타일러스 버튼을 누르면 {@code MotionEvent.STYLUS_BUTTON_PRIMARY}를 반환합니다. + + + 스타일러스에 두 번째 버튼이 있는 경우, 사용자가 그것을 누르면 같은 메서드가 {@code MotionEvent.STYLUS_BUTTON_SECONDARY}를 반환합니다. + 사용자가 두 버튼을 동시에 누르는 경우, 이 메서드는 두 값을 'OR'로 함께 묶어 모두 반환합니다({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}). + +</li> +<li> +더 낮은 플랫폼 버전을 대상으로 하는 앱의 경우, {@link android.view.MotionEvent#getButtonState() getButtonState()} 메서드가 {@link android.view.MotionEvent#BUTTON_SECONDARY}(기본 스타일러스 버튼 누름)를 반환하고, {@link android.view.MotionEvent#BUTTON_TERTIARY}(보조 스타일러스 버튼 누름)를 반환하거나 둘 모두를 반환합니다. + + + +</li> +</ul> + +<h2 id="ble-scanning">블루투스 저전력 스캔 개선</h2> +<p> +앱이 블루투스 저전력 스캔을 수행하는 경우, 새로운 {@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} 메서드를 사용해 콜백에 알림을 원하는 시점을 지정할 수 있습니다.즉, 정해진 {@link android.bluetooth.le.ScanFilter}에 일치하는 광고 패킷을 처음 찾았을 때와 이것을 일정한 시간 동안 확인하지 못했을 때에만 콜백에 알리도록 하면 됩니다. + + + + 스캔 기능에 대해 이런 식으로 접근하면 이전 버전의 플랫폼에서 제공되었던 것에 비해 훨씬 전력 효율적입니다. + +</p> + +<h2 id="hotspot">핫스팟 2.0 릴리스 1 지원</h2> +<p> +이 미리 보기에서는 Nexus 6 및 Nexus 9 기기에서의 핫스팟 2.0 릴리스 1 사양에 대한 지원을 추가합니다. 앱에 핫스팟 2.0 자격 증명을 프로비저닝하려면 {@link android.net.wifi.WifiEnterpriseConfig} 클래스의 새 메서드를 사용할 수 있습니다(예: {@code setPlmn()} 및 {@code setRealm()}). + + + {@link android.net.wifi.WifiConfiguration} 객체에서는 {@link android.net.wifi.WifiConfiguration#FQDN} 및 {@code providerFriendlyName} 필드를 설정하면 됩니다. 새로 나온 {@code ScanResult.PasspointNetwork} 속성이 감지된 네트워크가 핫스팟 2.0 액세스 지점을 나타내는지 여부를 알려줍니다. + + + +</p> + +<h2 id="4K-display">4K 디스플레이 모드</h2> +<p>이제 플랫폼에서 앱이 호환되는 하드웨어에서 디스플레이 해상도를 4K 렌더링으로 업그레이드하도록 요청할 수 있습니다. + 현재의 물리적 해상도를 쿼리하려면 새로운 {@code android.view.Display.Mode} API를 사용할 수 있습니다. + UI가 더 낮은 논리적 해상도에서 그려졌고 더 큰 물리적 해상도에 맞춰 확장된 경우, {@code Display.Mode.getPhysicalWidth()} 메서드가 반환하는 물리적 해상도가 {@link android.view.Display#getSize(android.graphics.Point) getSize()}가 보고하는 논리적 해상도와 다를 수 있다는 점을 유의하세요. + + +</p> + +<p>앱이 실행되는 중에 시스템에 물리적 해상도를 변경하도록 요청할 수도 있습니다. 앱의 창에서 {@code WindowManager.LayoutParams.preferredDisplayModeId} 속성을 설정하면 됩니다. + 이 기능은 4K 디스플레이 해상도로 전환하고자 하는 경우 무척 유용합니다. + 4K 디스플레이 모드에서 UI는 계속 원래 해상도(예: 1080p)에서 렌더링되며 4K로 확장되지만, {@link android.view.SurfaceView} 객체는 원래 해상도에서 콘텐츠를 표시할 수 있습니다. + +</p> + +<h2 id="behavior-themeable-colorstatelists">테마 지정 가능 ColorStateLists</h2> +<p>이제 M 미리 보기를 실행하는 기기에 대해 테마 속성이 {@link android.content.res.ColorStateList}에서 지원됩니다. + {@link android.content.res.Resources#getColorStateList(int) getColorStateList()} 및 {@link android.content.res.Resources#getColor(int) getColor()} 메서드는 사용이 중단되었습니다. + + 이러한 API를 호출하려면, 대신 새로운 {@code Context.getColorStateList()} 또는 {@code Context.getColor()} 메서드를 호출하세요. + + 이 두 메서드는 v4 AppCompat 라이브러리에서도 {@link android.support.v4.content.ContextCompat}를 통해 이용할 수 있습니다. +</p> + +<h2 id="audio">오디오 기능</h2> + +<p>이 미리 보기에서는 Android에서의 오디오 처리에 개선점을 더했습니다. </p> +<ul> + <li><a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a> 프로토콜을 지원하는 새로운 {@code android.media.midi} API를 추가했습니다. + 이와 같은 API를 사용하면 MIDI 이벤트를 전송 및 수신할 수 있습니다. +</li> + <li>새 {@code android.media.AudioRecord.Builder} 및 {@code android.media.AudioTrack.Builder} 클래스를 추가하여 각각 디지털 오디오 캡처와 재생 객체를 생성하고, 오디오 소스와 싱크 속성을 구성하여 시스템 기본 설정을 재정의하도록 하였습니다. + +</li> + <li>오디오 및 입력 기기를 연관시키기 위한 API Hook이 추가되었습니다. 이것은 특히 앱이 사용자에게 게임 컨트롤러 또는 Android TV에 연결된 리모컨에서 음성을 검색하는 데 유용합니다. 사용자가 검색을 시작하면 시스템이 새로운 {@code android.app.Activity.onSearchRequested()} 콜백을 호출합니다. + + + 사용자의 입력 기기에 마이크가 내장되어 있는지 판별하려면, 해당 콜백에서 {@link android.view.InputDevice} 객체를 검색한 다음 새 {@code InputDevice.hasMic()} 메서드를 호출하면 됩니다. + +</li> + <li>새 {@code android.media.AudioDevicesManager} 클래스를 추가하여 첨부된 소스와 싱크 오디오 기기 전체 목록을 검색할 수 있습니다. + 이외에도, {@code android.media.OnAudioDeviceConnectionListener} 객체를 지정하여 오디오 기기가 연결되거나 연결 해제되었을 때 앱에 알릴 수도 있습니다. + +</li> +</ul> + +<h2 id="video">비디오 기능</h2> +<p>이 미리 보기에서는 비디오 처리 API에 새로운 기능을 추가합니다.</p> +<ul> +<li>새 {@code android.media.MediaSync} 클래스를 추가하여 여러 애플리케이션이 오디오와 비디오 스트림을 동기적으로 렌더링하는 데 지원하도록 하였습니다. + 오디오 버퍼는 비블로킹 방식으로 제출된 다음 콜백을 통해 반환됩니다. + 이것은 동적 재생 속도도 지원합니다. +</li> +<li>새 {@code MediaDrm.EVENT_SESSION_RECLAIMED} 이벤트를 추가하여 앱이 연 세션을 리소스 관리자가 회수했다는 내용을 나타낼 수 있습니다. + 앱이 DRM 세션을 사용하는 경우, 이 이벤트를 처리해야 하고 회수된 세션을 사용하지 않도록 해야 합니다. + +</li> +<li>새 {@code MediaCodec.CodecException.ERROR_RECLAIMED} 오류 코드를 추가했습니다. 이것은 코덱이 사용하는 미디어 리소스를 리소스 관리자가 회수했다는 내용을 나타냅니다. + 이런 경우를 예외로 하고, 코덱은 종료 상태로 이동하면서 해제되어야 합니다. + +</li> +<li>새 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} 인터페이스를 추가하여 지원되는 동시 코덱 인스턴스의 최대 수에 대한 힌트를 얻을 수 있습니다. + +</li> +<li>새 {@code MediaPlayer.setPlaybackParams()} 메서드로는 빠른 재생 또는 느린 동작 재생에 대한 미디어 재생 속도를 설정할 수 있습니다. + 이는 또한 비디오와 함께 오디오 재생을 자동으로 늘리거나 속도를 높이기도 합니다. +</li> +</ul> + +<h2 id="camera">카메라 기능</h2> +<p>이 미리 보기에는 다음과 같은 새 API를 제공하여 카메라의 플래시에 액세스하고 이미지를 재처리하는 카메라에 액세스할 수 있도록 했습니다. +</p> + +<h3 id="flashlight">Flashlight API</h3> +<p>카메라 기기에 플래시 장치가 있는 경우, {@code CameraManager.setTorchMode()} 메서드를 호출하여 카메라 기기를 열지 않고도 플래시 장치의 Torch 모드를 켜거나 끌 수 있습니다. + 앱에는 플래시 장치 또는 카메라 기기에 대한 독점적인 소유권이 없습니다. + Torch 모드는 꺼져 있다가 카메라 기기를 이용할 수 없게 될 때마다 이용 불가능한 상태가 되고, Torch 모드를 켜진 상태로 유지하던 다른 카메라 리소스를 이용할 수 없게 되면 이용 불가능하게 됩니다. + + 다른 앱도 {@code setTorchMode()}를 호출하여 Torch 모드를 끌 수 있습니다. + Torch 모드를 켠 마지막 앱이 종료되면 Troch 모드도 꺼집니다. +</p> + +<p>Torch 모드 상태에 대해 알림을 받기 위한 콜백을 등록하려면 {@code CameraManager.registerTorchCallback()} 메서드를 호출하면 됩니다. + 콜백을 처음 등록하면 그 즉시, 현재 알려진 모든 카메라 기기(플래시 장치가 있는)의 Torch 모드 상태와 함께 호출됩니다. + + Torch 모드가 성공적으로 켜지거나 꺼지면 {@code CameraManager.TorchCallback.onTorchModeChanged()} 메서드가 불려나옵니다. +</p> + +<h3 id="reprocessing">재처리 API</h3> +<p>{@link android.hardware.camera2 Camera2} API를 확장하여 YUV를 지원하고 비공개 불투명 형식 이미지 재처리를 지원하게 되었습니다. + 앱은 재처리 기능을 이용할 수 있는지 알아보기 위해 {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}를 통합니다. + 기기가 재처리를 지원하는 경우, 재처리 가능한 카메라 캡처 세션을 생성하려면 {@code CameraDevice.createReprocessableCaptureSession()}을 호출하고 입력 버퍼 재처리를 위한 요청을 생성하면 됩니다. + + +</p> + +<p>{@code ImageWriter} 클래스를 사용하여 카메라 재처리 입력에 입력 버퍼 흐름을 연결시키세요. + 빈 버퍼를 가져오려면 다음과 같은 프로그래밍 모델을 따르면 됩니다.</p> + +<ol> +<li>{@code ImageWriter.dequeueInputImage()} 메서드를 호출합니다.</li> +<li>입력 버퍼에 이 데이터를 채웁니다.</li> +<li>{@code ImageWriter.queueInputImage()} 메서드를 호출하여 해당 버퍼를 카메라에 전송합니다.</li> +</ol> + +<p>{@code ImageWriter} 객체와 {@code android.graphics.ImageFormat.PRIVATE} 이미지를 함께 사용하는 경우, 앱이 이미지 데이터에 직접 액세스할 수 없습니다. + + 대신, 버퍼 사본 없이 {@code ImageWriter.queueInputImage()} 메서드를 호출하여 {@code ImageFormat.PRIVATE} 이미지를 {@code ImageWriter}에 직접 전달하면 됩니다. + +</p> + +<p>이제 {@code ImageReader} 클래스가 {@code android.graphics.ImageFormat.PRIVATE} 형식 이미지 스트림을 지원합니다. + 이로써 앱이 {@code ImageReader} 출력 이미지의 원형 이미지 대기열을 유지하고 하나 이상의 이미지를 선택하여 이들을 {@code ImageWriter}에 보내 카메라 재처리를 할 수 있습니다. + +</p> + +<h2 id="afw">Android for Work 기능</h2> +<p>이 미리 보기에는 다음과 같은 Android for Work에 대한 새 API가 포함되어 있습니다.</p> +<ul> + <li><strong>회사 소유, 일회용 기기 제어 능력 향상:</strong> 이제 기기 소유자가 다음과 같은 설정을 제어하여 회사 소유, 일회용(COSU) 기기 관리를 한층 개선할 수 있습니다. + + + <ul> + <li>키가드를 비활성화하거나 다시 활성화하려면 {@code DevicePolicyManager.setKeyguardEnabledState()} 메서드를 사용하세요. +</li> + <li>상태 표시줄(빠른 설정, 알림과 Google Now를 시작하는 탐색 스와이프 업 동작 포함)을 비활성화하거나 다시 활성화하려면 {@code DevicePolicyManager.setStatusBarEnabledState()} 메서드를 사용하세요. + +</li> + <li>안전 부팅을 비활성화하거나 다시 활성화하려면 {@link android.os.UserManager} 상수 {@code DISALLOW_SAFE_BOOT}를 사용하세요. +</li> + <li>플러그인 상태에서 화면이 꺼지지 않도록 방지하려면 {@link android.provider.Settings.Global} 상수 {@code STAY_ON_WHILE_PLUGGED_IN}을 사용하세요. +</li> + </ul> + </li> + <li><strong>기기 소유자의 앱 자동 설치 및 설치 제거:</strong> 이제 기기 소유자가 애플리케이션을 자동으로 설치하고 제거할 수 있습니다. 업무용 Google Play와는 따로 {@link android.content.pm.PackageInstaller} API를 사용하면 됩니다. + + 이제 사용자 상호작용 없이도 앱을 가져오고 설치하는 기기 소유자를 통해 기기를 프로비저닝할 수 있습니다. + 이 기능은 Google 계정을 활성화하지 않고도 키오스크 또는 그와 같은 다른 기기를 원터치 방식으로 프로비저닝하는 데 유용합니다. +</li> +<li><strong>자동 엔터프라이즈 인증서 액세스: </strong> 사용자에게 인증서를 선택하라는 메시지가 표시되기 전에 앱이{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()}를 호출하는 경우, 이제 프로필 또는 기기 소유자가 {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()}를 호출하여 요청하는 애플리케이션에 자동으로 별칭을 제공할 수 있습니다. + + + + 이 기능을 사용하면 관리된 앱에 사용자 상호작용 없이도 인증서에 대한 액세스 권한을 부여할 수 있습니다. +</li> +<li><strong>시스템 업데이트 자동 수락:</strong> 시스템 업데이트 정책을 {@code DevicePolicyManager.setSystemUpdatePolicy()}로 설정하면, 이제 기기 소유자가 자동으로 시스템 업데이트를 수락할 수 있습니다(예: 키오스크 기기의 경우). 또는 업데이트를 연기하거나 사용자가 업데이트를 수행하지 못하도록 최대 30일까지 막을 수 있습니다. + + + 이에 더해, 관리자가 매일 시간 창을 설정하여 여기에서 업데이트를 수행하도록 할 수 있습니다. 예를 들어, 키오스크 기기를 사용하지 않는 시간 중에 업데이트하도록 합니다. + 시스템 업데이트를 사용할 수 있게 되면 시스템이 작업 정책 컨트롤러 앱에 시스템 업데이트 정책이 설정되어 있는지 확인하고, 그에 따라 동작합니다. + + +</li> +<li> +<strong>인증서 설치 위임:</strong> 이제 프로필 또는 기기 소유자가 타사 앱에 권한을 부여하여 다음과 같은 {@link android.app.admin.DevicePolicyManager} 인증서 관리 API를 호출할 수 있습니다. + + +<ul> + <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName) +getInstalledCaCerts()}</li> + <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[]) +hasCaCertInstalled()}</li> + <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[]) +installCaCert()}</li> + <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[]) +uninstallCaCert()}</li> + <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName) +uninstallAllUserCaCerts()}</li> + <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String) +installKeyPair()}</li> +</ul> +</li> +<li><strong>엔터프라이즈 공장 재설정 보호:</strong> 기기 소유자를 프로비저닝하는 경우, 이제 {@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} 번들을 설정하여 공장 재설정 보호(FRP)를 잠금 해제하는 데 사용되는 매개변수를 구성할 수 있습니다. + + 이와 같은 매개변수는 기기를 재설정하여 FRP를 잠금 해제하도록 하고 기기를 프로비저닝하기로 한 다음에 NFC 프로그래머 앱이 제공할 수 있으며, 이전에 구성한 Google 계정도 필요하지 않습니다. + + 이와 같은 매개변수를 수정하지 않으면 FRP가 제자리에 유지되어 이전에 활성화한 Google 자격 증명 없이는 기기가 활성화되지 않도록 방지합니다. + + +<p>이외에도 Google Play 서비스에 앱 제한을 설정하면 기기 소유자가 기기에서 활성화된 것을 대신할 대체 Google 계정을 지정하여 FRP를 잠금 해제하는 데 사용할 수 있습니다. +</p> +</li> +<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" /> +<li><strong>데이터 사용량 추적:</strong> 새로운 {@code android.app.usage.NetworkStatsManager} 메서드를 사용하여 이제 프로필 또는 기기 소유자가 <strong>설정 > 데이터</strong>에 표시되는 데이터 사용량 통계를 쿼리할 수 있습니다. + + 프로필 소유자에게는 자신이 관리하는 프로필에서 데이터를 쿼리할 권한이 자동으로 부여되는 반면, 기기 소유자의 경우에는 관리된 기본 사용자의 사용량 데이터에 대한 액세스 권한이 주어집니다. + +</li> +<li><strong>런타임 권한 관리:</strong> +<p>프로필 또는 기기 소유자는 모든 애플리케이션의 모든 런타임 요청에 대해 권한 정책을 설정할 수 있습니다. {@code DevicePolicyManager.setPermissionPolicy()}를 사용해 사용자에게 정상적으로 권한을 부여하라는 메시지를 표시하거나, 자동으로 권한을 허용하거나 해당 권한을 자동으로 거부하도록 할 수도 있습니다. + + + 후자의 정책이 설정된 경우, 사용자는 앱의 <strong>설정</strong> 내에 있는 권한 화면 안에서 프로필 또는 기기 소유자가 선택한 내용을 수정할 수 없습니다. + +</p></li> +<li><strong>설정 VPN:</strong> 이제 VPN 앱이 <strong>설정 > 더 보기 > VPN</strong>에 표시됩니다. 이외에도, VPN 사용량에 수반되는 알림은 이제 VPN 구성 방식만 구체적으로 다루게 되었습니다. + + + 프로필 소유자의 경우, 이러한 알림은 VPN이 관리된 프로필에 대해 구성되었는지, 아니면 개인 프로필에 구성되었거나 둘 모두에 구성되었는지 여부에 한정됩니다. + 기기 소유자의 경우, 이 알림은 VPN이 기기 전체에 대해 구성되었는지 여부만 나타냅니다. +</li> +<li><strong>작업 상태 알림:</strong> 이제 관리된 프로필에서 온 앱에 전경에 있는 액티비티가 있을 때마다 상태 표시줄 서류가방 아이콘이 나타납니다. + 또한, 기기가 관리된 프로필 내 앱의 액티비티에 대해 직접 잠금 해제된 경우, 알림 메시지가 표시되어 사용자에게 지금 작업 프로필 내에 있다는 사실을 알려주기도 합니다. + + +</li> +</ul> + +<p class="note"> + M 개발자 미리 보기의 모든 API 변경 내용에 대한 상세한 정보는 <a href="{@docRoot}preview/download.html">API 차이점 보고서</a>를 참조하세요. +</p> diff --git a/docs/html-intl/intl/ko/preview/behavior-changes.jd b/docs/html-intl/intl/ko/preview/behavior-changes.jd new file mode 100644 index 0000000..fa95070 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/behavior-changes.jd @@ -0,0 +1,402 @@ +page.title=동작 변경 +page.keywords=미리 보기, SDK, 호환성 +sdk.platform.apiLevel=MNC +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>이 문서의 내용</h2> + +<ol id="toc44" class="hide-nested"> + <li><a href="#behavior-runtime-permissions">런타임 권한</a></li> + <li><a href="#behavior-power">절전 최적화</a> + <ol> + <li><a href="#behavior-doze">Doze</a></li> + <li><a href="#behavior-app-standby">앱 대기 모드</a></li> + </ol> + </li> + <li><a href="#behavior-adoptable-storage">채택 가능한 저장소 기기</a></li> + <li><a href="#behavior-apache-http-client">Apache HTTP 클라이언트 제거</a></li> + <li><a href="#behavior-audiomanager-Changes">AudioManager 변경</a></li> + <li><a href="#behavior-test-selection">텍스트 선택</a></li> + <li><a href="#behavior-keystore">Android 키노트 변경</a></li> + <li><a href="#behavior-network">Wi-Fi 및 네트워킹 변경</a></li> + <li><a href="#behavior-camera">카메라 서비스 변경</a></li> + <li><a href="#behavior-art-runtime">ART 런타임</a></li> + <li><a href="#behavior-apk-validation">APK 유효성 검사</a></li> + <li><a href="#behavior-afw">Android for Work 변경</a></li> +</ol> + +<h2>API 차이점</h2> +<ol> +<li><a href="{@docRoot}preview/download.html">M 미리 보기에 대한 API 레벨 22 »</a> </li> +</ol> + + +<h2>참고 항목</h2> +<ol> +<li><a href="{@docRoot}preview/api-overview.html">M 개발자 미리 보기 API 개요</a> </li> +</ol> + +</div> +</div> + +<p>M 개발자 미리 보기에는 새로운 기능 및 특징과 더불어 다양한 시스템 변경과 API 동작 변경 내용이 포함되어 있습니다. + 이 문서에서는 개발자 여러분이 숙지해야 하고 앱을 개발할 때 감안해야 하는 몇 가지 주요 변경 내용을 소개하겠습니다. +</p> + +<p>이전에 Android용 앱을 게시한 적이 있는 경우, 이와 같은 플랫폼 변경으로 인해 앱이 영향을 받을 수 있다는 점을 유의하세요. +</p> + +<h2 id="behavior-runtime-permissions">런타임 권한</h1> +<p>이 미리 보기에서는 새 권한 모델을 소개합니다. 여기에서는 이제 사용자가 런타임에 직접 앱 권한을 관리할 수 있게 됩니다. + 이 모델을 사용하면 사용자에게 개선된 가시성과 권한에 대한 제어권을 부여하는 한편 앱 개발자에게는 설치와 자동 업데이트 과정을 간소화해줍니다. 사용자는 설치된 여러 앱에 대해 따로따로 권한을 허용하거나 취소할 수 있습니다. + + </p> + +<p>M 미리 보기를 대상으로 하는 앱을 개발하는 경우, 권한 확인과 요청은 런타임에 해야 합니다. + 앱에 어떤 권한이 허용되었는지 판단하려면, 새로운 {@code Context.checkSelfPermission()} 메서드를 호출하면 됩니다. + 권한을 요청하려면 새 {@code Activity.requestPermission()} 메서드를 호출하세요. + 앱이 M을 대상으로 하지 않더라도, 앱을 새 권한 모델에서 테스트해보는 것이 좋습니다. +</p> + +<p>앱에서 새 권한 모델을 지원하는 방법에 대한 자세한 내용은 <a href="{@docRoot}preview/features/runtime-permissions.html">권한</a> 개발자 미리 보기 페이지를 참조하세요. + + 앱에 미친 영향을 평가하는 방법에 대한 팁은 <a href="{@docRoot}preview/testing/guide.html#runtime-permissions">테스트 가이드</a>를 참조하세요. +</p> + +<h2 id="behavior-power">절전 최적화</h2> +<p>이 미리 보기에서는 유휴 상태의 기기 및 앱에 대한 새로운 절전 최적화 기능을 소개합니다.</p> + +<h3 id="behavior-doze">Doze</h3> +<p>기기의 플러그가 뽑히고 화면이 꺼진 채로 일정 시간 동안 변화 없는 상태로 유지되면, <em>Doze</em> 상태로 들어갑니다. 이 상태에서는 기기가 시스템을 절전 모드 상태로 유지하려 시도합니다. + 이 모드에서 기기는 정기적으로 잠시 동안 정상 작동을 재개하여 앱 동기화가 일어날 수 있도록 하고 보류된 작업이 있으면 시스템이 이를 수행할 수 있도록 합니다. + +</p> + +<p>앱이 Doze 상태에 있는 동안 다음과 같은 제한 사항이 적용됩니다.</p> +<ul> +<li>네트워크 액세스가 비활성화됩니다. 다만 앱이 우선 순위가 높은 Google Cloud 메시지 Tickle을 받을 때는 예외입니다. +</li> +<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">절전 모드 해제 잠금</a>이 무시됩니다.</li> +<li>{@link android.app.AlarmManager} 클래스로 일정이 예약된 알람이 비활성화됩니다. 다만 {@link android.app.AlarmManager#setAlarmClock setAlarmClock()} 메서드 및 {@code AlarmManager.setAndAllowWhileIdle()}로 설정한 알람은 예외입니다. + +</li> +<li>WiFi 스캔을 수행하지 않습니다.</li> +<li>동기화 어댑터와 {@link android.app.job.JobScheduler}의 동기화와 작업 실행이 금지됩니다. +</li> +</ul> +</p> +<p>기기가 Doze 모드를 종료하면 보류되어 있던 작업과 동기화를 모두 실행합니다.</p> +<p>이 기능을 테스트하려면 개발 머신에 M 미리 보기를 실행하는 기기를 연결하여 다음과 같은 명령을 호출하면 됩니다. + +</p> +<pre class="no-prettyprint"> +$ adb shell dumpsys battery unplug +$ adb shell dumpsys deviceidle step +$ adb shell dumpsys deviceidle -h +</pre> +<p class="note"><strong>참고:</strong> 다가오는 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud 메시지</a> 릴리스에서는 개발자에게 우선 순위가 높은 메시지를 지정하게 해줍니다. + + + 앱이 우선 순위가 높은 GCM 메시지를 수신하면 이 앱에는 기기가 Doze 모드에 있더라도 잠시 네트워크 액세스가 허용됩니다. + +</p> + +<p>앱에서 Doze를 테스트하는 방법에 대한 팁은 <a href="{@docRoot}preview/testing/guide.html#doze-standby">테스트 가이드</a>를 참조하세요. + + </p> + +<h3 id="behavior-app-standby">앱 대기 모드</h3> +<p>이 미리 보기에서는 시스템이 보기에 앱이 활성 사용 중이 아닌 경우 해당 앱은 유휴 상태라고 판별할 수 있습니다. + 일정 시간이 지나면 앱이 유휴 상태인 것으로 간주되는데, 시스템이 다음과 같은 신호 중 하나를 감지하는 경우는 예외입니다. +</p> + +<ul> +<li>사용자가 명시적으로 앱을 시작했습니다.</li> +<li>앱에 현재 전경에 있는 프로세스가 있습니다(액티비티 또는 전경 서비스 중 하나의 형태로, 또는 다른 액티비티나 전경 서비스가 사용 중인 상태로). +</li> +<li>앱이 알림을 생성하여 사용자가 그것을 잠금 화면에서 보거나 알림 트레이에서 확인합니다. +</li> +<li><strong>설정</strong>을 통해 사용자가 명시적으로 앱이 최적화에서 면제되도록 요청합니다. +</li> +</ul> + +<p>기기의 플러그가 뽑혀 있는 경우, 유휴 상태인 것으로 간주된 앱은 자신의 네트워크 액세스를 비활성화하고 동기화와 작업을 일시 중단시킵니다. + 기기가 전원 공급 장치에 연결되면 이와 같은 앱에 네트워크 액세스가 허용되며 보류 중이었던 작업과 동기화를 모두 실행할 수 있습니다. + 기기가 오랜 시간 동안 유휴 상태인 경우, 유휴 앱에는 하루에 한 번 정도 네트워크 액세스가 허용됩니다. +</p> + +<p>이 기능을 테스트하려면 개발 머신에 M 미리 보기를 실행하는 기기를 연결하여 다음과 같은 명령을 호출하면 됩니다. + +</p> +<pre class="no-prettyprint"> +$ adb shell dumpsys battery unplug +$ adb shell am set-idle <packageName> true +$ adb shell am set-idle <packageName> false +$ adb shell am get-idle <packageName> +</pre> + +<p class="note"><strong>참고:</strong> 다가오는 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud 메시지</a>(GCM) 릴리스에서는 개발자에게 우선 순위가 높은 메시지를 지정할 수 있습니다. + + + 앱이 우선 순위가 높은 GCM 메시지를 수신하면 이 앱에는 앱이 유휴 상태에 있더라도 잠시 네트워크 액세스가 허용됩니다. + +</p> + +<p>앱에서 앱 대기 모드를 테스트하는 방법에 대한 팁은 <a href="{@docRoot}preview/testing/guide.html#doze-standby">테스트 가이드</a>를 참조하세요. + + </p> + +<h2 id="behavior-adoptable-storage">채택 가능한 저장소 기기</h2> +<p> +이 미리 보기에서는 사용자가 SD 카드와 같은 외부 저장소 기기를 <em>채택</em>할 수 있습니다. 외부 저장소 기기를 채택하면 기기를 암호화하고 포맷하여 내부 저장소처럼 작동하도록 합니다. + 이 기능을 사용하면 사용자가 앱과 해당 앱의 비공개 데이터를 여러 저장소 기기 사이에서 이동시킬 수 있습니다. + 앱을 이동시키는 경우, 시스템은 매니페스트의 <a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a> 기본 설정을 사용합니다. + + +</p> + +<p>앱이 다음과 같은 API 또는 필드에 액세스하는 경우, 앱이 내부 및 외부 저장소 기기 사이를 이동하면서 반환하는 파일 경로가 급격하게 달라진다는 점을 유의하세요. 파일 경로를 구축할 때에는 이와 같은 API를 항상 동적으로 호출하는 것을 강력히 권장합니다. 하드코드된 파일 경로를 사용하거나 이전에 구축된 정규화된 파일 경로를 유지하지 마세요. + + +</p> + +<ul> +<li>{@link android.content.Context} 메서드: + <ul> + <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li> + <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li> + <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li> + <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li> + <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li> + <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li> + <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li> + <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li> + <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li> + </ul> +</li> +<li>{@link android.content.pm.ApplicationInfo} 필드: + <ul> + <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li> + <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li> + <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li> + <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li> + <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li> + <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li> + </ul> +</li> +</ul> + +<p>개발자 미리 보기에서 이 기능을 디버그하려면, 다음 명령을 실행하여 USB On-The-Go(OTG) 케이블을 통해 Android 기기에 연결된 USB 드라이브 채택을 활성화하면 됩니다. +</p> + +<pre class="no-prettyprint"> +$ adb shell sm set-force-adoptable true +</pre> + +<h2 id="behavior-apache-http-client">Apache HTTP 클라이언트 제거</h2> +<p>이 미리 보기에서는 Apache HTTP 클라이언트에 대한 지원을 제거합니다. 앱이 이 클라이언트를 사용하고 Android 2.3(API 레벨 9) 이상을 대상으로 하는 경우, {@link java.net.HttpURLConnection} 클래스를 대신 사용하세요. + + 이는 투명한 압축과 응답 캐싱을 통해 네트워크 사용량을 줄이고 전력 소모를 최소화하기 때문에 API가 더 효율적입니다. + Apache HTTP API를 계속 사용하려면 우선 다음과 같은 컴파일-시간 종속성을 {@code build.gradle} 파일에서 선언해야 합니다. + +</p> +<pre> +android { + useLibrary 'org.apache.http.legacy' +} +</pre> +<p>Android는 OpenSSL에서 <a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a> 라이브러리로 옮겨갑니다. + + 앱에서 Android NDK를 사용하는 경우, NDK API의 일부분이 아닌 암호화 라이브러리에 대해 링크를 연결하지 마세요(예:{@code libcrypto.so} 및 {@code libssl.so}). + 이러한 라이브러리는 공개 API가 아니며, 여러 릴리스와 기기에 걸쳐 통보 없이 변경되거나 중단될 수 있으며 스스로를 보안 취약점에 노출시킬 수도 있습니다. + + 대신에 원래 코드를 수정하여 JNI를 통해 Java 암호화 API를 호출하도록 하거나, 직접 선택한 암호화 라이브러리에 대해 정적으로 연결하도록 하세요. + +</p> + +<h2 id="behavior-audiomanager-Changes">AudioManager 변경</h2> +<p>볼륨을 직접 설정하거나 특정 스트림을 {@link android.media.AudioManager} 클래스를 통해 음소거하는 것은 이제 더 이상 지원되지 않습니다. + {@link android.media.AudioManager#setStreamSolo(int,boolean) +setStreamSolo()} 메서드는 사용이 중단되었으며, 그 대신 {@code AudioManager.requestAudioFocus()} 메서드를 호출해야 합니다. + 이와 마찬가지로, {@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 메서드도 사용이 중단되었습니다. 그 대신 {@code AudioManager.adjustStreamVolume()} 메서드를 호출하고 방향 값 {@code ADJUST_MUTE} 또는 {@code ADJUST_UNMUTE}에서 전달해야 합니다. + + +</p> + +<h2 id="behavior-test-selection">텍스트 선택</h2> + +<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" /> + +<p>사용자가 앱에서 텍스트를 선택하면 이제 텍스트 선택 작업을 표시할 수 있습니다. 예를 들어 <em>잘라내기</em>, <em>복사</em> 및 <em>붙여넣기</em>를 <a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">부동 도구 모음</a>으로 표시하게 됩니다. + + 이 사용자 상호작용 구현은 상황별 작업 모음에서와 비슷합니다. 이 내용은 <a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">각각의 보기에 대한 상황별 작업 모드의 활성화</a>에 설명되어 있습니다. + + +</p> + +<p>텍스트 선택을 위해 부동 도구 모음을 구현하려면 기존 앱에 다음과 같은 변경을 적용하면 됩니다. +</p> +<ol> +<li>{@link android.view.View} 또는 {@link android.app.Activity} 객체에서 {@link android.view.ActionMode} 호출을 {@code startActionMode(Callback)}에서 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}로 변경합니다. + +</li> +<li>기존 {@code ActionMode.Callback} 구현을 변경하여 대신 {@code ActionMode.Callback2}를 확장합니다. +</li> +<li>{@code Callback2.onGetContentRect()} 메서드를 재정의하여 보기에서 콘텐츠 {@link android.graphics.Rect} 객체(예: 텍스트 선택 직사각형)의 좌표를 제공합니다. +</li> +<li>직사각형 위치 지정이 더 이상 유효하지 않고, 무효화할 요소가 이것뿐인 경우 {@code ActionMode.invalidateContentRect()} 메서드를 호출합니다. +</li> +</ol> + +<p><a href="{@docRoot}tools/support-library/index.html">Android 지원 라이브러리</a> 수정 버전 22.2를 사용하는 경우, 부동 도구 모음은 이전 버전과 호환되지 않으며 AppCompat이 기본적으로 {@link android.view.ActionMode} 객체의 제어권을 넘겨받는다는 점을 유의하세요. + + + 이렇게 하면 부동 도구 모음이 표시되지 않도록 방지합니다. {@link android.support.v7.app.AppCompatActivity}에서 {@link android.view.ActionMode}를 활성화하려면, {@code android.support.v7.app.AppCompatActivity.getDelegate()}를 호출한 다음 {@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()}를 반환된 {@link android.support.v7.app.AppCompatDelegate} 객체에서 호출하고 입력 매개변수를 {@code false}로 설정하세요. + + + + + + 이 호출은 {@link android.view.ActionMode} 객체의 제어권을 프레임워크에 돌려줍니다. + M 미리 보기를 실행하는 기기에서 이렇게 하면 프레임워크가 {@link android.support.v7.app.ActionBar} 또는 부동 도구 모음 모드를 지원할 수 있고, 한편 M 미리 보기 이전 기기에서는 {@link android.support.v7.app.ActionBar} 모드만 지원됩니다. + +</p> + +<h2 id="behavior-keystore">Android 키노트 변경</h2> +<p>이 미리 보기에서는 <a href="{@docRoot}training/articles/keystore.html">Android 키노트 제공자</a>가 더 이상 DSA를 지원하지 않습니다. + + ECDSA는 여전히 지원됩니다.</p> + +<p>휴식 중일 때 암호화가 필요하지 않은 키도 보안 잠금 화면이 비활성화되거나 재설정될 때(예: 사용자가 또는 기기 관리자가 재설정) 더 이상 삭제되지 않습니다. + 휴식 중일 때 암호화가 필요한 키는 이러한 이벤트 중에 삭제됩니다. +</p> + +<h2 id="behavior-network">Wi-Fi 및 네트워킹 변경</h2> + +<p>이 미리 보기에서는 Wi-Fi와 네트워킹 API에 다음과 같은 동작 변경을 도입합니다.</p> +<ul> +<li>이제 앱이 {@link android.net.wifi.WifiConfiguration} 객체의 상태를 변경할 수 있는 것은 개발자가 이와 같은 객체를 생성한 경우뿐입니다. + 사용자 또는 다른 앱이 생성한 {@link android.net.wifi.WifiConfiguration} 객체는 개발자가 수정하거나 삭제할 권한이 없습니다. + +</li> +<li> +이전에는 앱이 기기에 강제로 특정 Wi-Fi 네트워크에 연결하도록 하는 경우, 즉{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()}를 {@code disableAllOthers=true} 설정으로 사용하면 기기가 셀룰러 데이터와 같은 다른 네트워크에서는 연결을 해제했습니다. + + + 이 미리 보기에서는 기기가 그러한 다른 네트워크에서 더 이상 연결을 해제하지 않습니다. 앱의 {@code targetSdkVersion}이 {@code “20”} 이하인 경우, 이것은 선택한 Wi-Fi 네트워크에 고정되어 있습니다. + + 앱의 {@code targetSdkVersion}이 {@code “21”} 이상인 경우, 멀티네트워크 API를 사용합니다(예: {@link android.net.Network#openConnection(java.net.URL) openConnection()}, {@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} 및 새로운 {@code ConnectivityManager.bindProcessToNetwork()} 메서드). 이렇게 하면 네트워크 트래픽이 선택한 네트워크에서 전송되도록 보장할 수 있습니다. + + + + +</li> +</ul> + +<h2 id="behavior-camera">카메라 서비스 변경</h2> +<p>이 미리 보기에서는 카메라 서비스에서 공유된 리소스에 액세스하는 모델이 이전의 "선착순" 액세스 모델에서 바뀌어 우선 순위가 높은 프로세스를 선호하는 액세스 모델로 변경되었습니다. + + 서비스 동작에 대한 변경 내용은 다음과 같습니다.</p> +<ul> +<li>카메라 하위 시스템 리소스(카메라 기기 열기 및 구성하기 포함)에 대한 액세스 권한은 클라이언트 애플리케이션 프로세스의 "우선 순위"를 기반으로 부여됩니다. + 대개는 사용자에게 표시되는 액티비티 또는 전경 액티비티가 있는 애플리케이션 프로세스에 높은 우선 순위가 부여되어 카메라 리소스 획득과 사용에 좀 더 신뢰감을 더합니다. + +</li> +<li>우선 순위가 낮은 앱에 대한 활성 카메라 클라이언트는 우선 순위가 더 높은 애플리케이션이 카메라를 사용하려 시도하면 "제거"될 수 있습니다. + 사용이 중단된 {@link android.hardware.Camera} API의 경우, 이 때문에 {@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}가 제거된 클라이언트에 대해 호출되는 결과를 초래합니다. + + + {@link android.hardware.camera2 Camera2} API에서는 제거된 클라이언트에 대해 {@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()}가 호출됩니다. + +</li> +<li>적절한 카메라 하드웨어를 갖춘 기기에서는 별도의 애플리케이션 프로세스가 각자 따로따로 열려 동시에 각기 다른 카메라 기기를 사용할 수 있습니다. + 하지만 여러 프로세스를 사용하는 경우 동시에 액세스하면 열려 있는 카메라 기기 모두의 성능 또는 기능이 대폭 저하되는 결과를 유발했었는데, 이런 경우도 이제 카메라 서비스가 감지하여 허용하지 않게 됩니다. + + 이러한 변경으로 인해, 같은 카메라 기기에 직접 액세스하려 시도하는 앱이 없는 경우에도 우선 순위가 낮은 클라이언트를 "제거"하는 결과를 초래할 수도 있습니다. + + +</li> +<li> +현재 사용자를 변경하면 앱 내에서 이전 사용자 계정이 소유하는 활성 카메라 클라이언트를 제거하는 결과를 유발할 수 있습니다. + 카메라에 대한 액세스는 현재 기기 사용자가 소유한 사용자 프로필에게만 국한됩니다. 이것은 실제로 예를 들면, 사용자가 다른 계정으로 전환하면 "Guest" 계정은 카메라 시스템을 사용하는 실행 중인 프로세스에서 나갈 수 없게 된다는 뜻입니다. + + +</li> +</ul> + +<h2 id="behavior-art-runtime">ART 런타임</h2> +<p>이제 ART 런타임이 {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 메서드에 대한 액세스 규칙을 제대로 구현할 수 있습니다. + 이 변경 덕분에 이전 버전에서는 Dalvik이 액세스 규칙을 잘못 확인하던 문제를 해결했습니다. 앱이 {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 메서드를 사용하고 액세스 확인을 재정의하고자 하는 경우, {@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 메서드를 호출하되 입력 매개변수를 {@code true}로 설정한 상태로 사용합니다. + + + + + + 앱이 <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 AppCompat 라이브러리</a> 또는 <a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 RecyclerView 라이브러리</a>를 사용하는 경우, 앱을 업데이트하여 이러한 라이브러리의 최신 버전을 사용하도록 해야 합니다. + + + 그렇지 않으면, XML에서 참조되는 모든 사용자 지정 클래스가 업데이트되도록 확인하여 그 클래스 생성자에 액세스할 수 있도록 해야 합니다. +</p> + +<p>이 미리 보기에서는 동적 링커의 동작을 업데이트합니다. 동적 링커는 이제 라이브러리의 {@code soname}과 그 경로(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">공개 버그 6670</a>) 사이의 차이점을 숙지하고 있으며, 이제 {@code soname} 기준 검색도 구현되었습니다. + + + + 이전에 작동한 앱 중에서 {@code DT_NEEDED} 항목이 있는 경우(주로 빌드 머신의 파일 시스템에 있는 절대 경로) 로딩했을 때 실패할 수 있습니다. +</p> + +<p>이제 {@code dlopen(3) RTLD_LOCAL} 플래그를 올바르게 구현했습니다. 이때 {@code RTLD_LOCAL}이 기본이므로 {@code dlopen(3)}에 대한 호출 중에서 {@code RTLD_LOCAL}을 명시적으로 사용하지 않으면 영향받을 수 있다는 점을 유의하세요(다만 앱이 명시적으로 {@code RTLD_GLOBAL}을 사용한 경우는 예외입니다). + + {@code RTLD_LOCAL}의 경우, 나중에 {@code dlopen(3)}으로 한 호출로 인해 로딩된 라이브러리에서는 기호를 이용할 수 없게 됩니다({@code DT_NEEDED} 항목에 의해 참조된 것과는 반대입니다). + +</p> +</p> + +<h2 id="behavior-apk-validation">APK 유효성 검사</h2> +<p>이제 플랫폼이 APK에 대해 좀 더 엄격한 유효성 검사를 수행합니다. APK는 파일이 매니페스트에서는 선언되었지만 APK 자체에는 없는 경우 손상된 것으로 간주됩니다. + 콘텐츠가 하나라도 제거되면 APK를 다시 서명해야 합니다. +</p> + +<h2 id="behavior-afw">Android for Work 변경</h2> +<p>이 미리 보기에는 Android for Work에 대해 다음과 같은 동작 변경을 포함합니다.</p> +<ul> +<li><strong>업무용 연락처를 개인적인 맥락에서 이용.</strong> 이제 Google 다이얼러 통화 기록에서 사용자가 이전 통화 목록을 볼 때 업무용 연락처를 표시합니다. {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()}를 {@code true}로 설정하면 Google 다이얼러 통화 기록에서 업무용 프로필 연락처를 숨길 수 있습니다. + + + {@code DevicePolicyManager.setBluetoothContactSharingDisabled()}를 {@code false}로 설정했을 때에만 블루투스를 통해 기기에 업무용 연락처를 개인용 연락처와 함께 표시합니다. + + 이것은 기본적으로 {@code true}로 설정되어 있습니다. + +</li> +<li><strong>WiFi 구성 제거:</strong> 프로필 소유자가 추가한 WiFi 구성(예를 들어 {@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration) +addNetwork()} 메서드로의 호출을 통해)은 이제 해당 작업 프로필이 삭제되면 함께 제거됩니다. + +</li> +<li><strong>WiFi 구성 잠금:</strong> 이제 활성 기기 소유자가 생성한 WiFi 구성이라면 사용자는 임의의 구성을 수정 또는 삭제할 수 없습니다. + 사용자는 여전히 본인의 WiFi 구성을 생성하고 수정할 수 있습니다. 해당 사용자에 대해 {@link android.os.UserManager} 상수 {@link android.os.UserManager#DISALLOW_CONFIG_WIFI}가 설정되지만 않았으면 됩니다. + +</li> +<li><strong>Google 계정 추가를 통해 작업 정책 컨트롤러 다운로드:</strong> 작업 정책 컨트롤러(WPC) 앱을 통해 관리해야 하는 Google 계정이 관리된 맥락을 벗어나 기기에 추가되는 경우, 이제 추가 계정 흐름이 사용자에게 메시지를 표시하여 적절한 WPC를 설치하도록 합니다. 이 동작은 최초 기기 설정 마법사의 <strong>설정 > 계정</strong>을 통해서 추가되는 계정에도 적용됩니다. + + + +</li> +<li><strong>특정 DevicePolicyManager API 동작에 적용된 변경:</strong> {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} 메서드를 호출하면 호출한 사용자에 대한 카메라에만 영향을 미칩니다. 이것을 관리된 프로필에서 호출하면 기본 사용자에서 실행 중인 카메라 앱에 영향을 미치지 않습니다. + + + 또한, 이제 {@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} 메서드를 기기 소유자뿐만 아니라 프로필 소유자에 대해서도 이용할 수 있습니다. + + 프로필 소유자는 다음과 같은 키가드 제한 사항을 설정할 수 있습니다. + +<ul> +<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} 및 {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}를 설정하면 프로필의 상위 사용자에 대한 키가드 설정에 영향을 미칩니다. + +</li> +<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}를 설정하면 관리된 프로필에 있는 애플리케이션이 생성한 알림에만 영향을 미칩니다. +</li> +</ul> +</li> +</ul> diff --git a/docs/html-intl/intl/ko/preview/features/runtime-permissions.jd b/docs/html-intl/intl/ko/preview/features/runtime-permissions.jd new file mode 100644 index 0000000..20c5232 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/features/runtime-permissions.jd @@ -0,0 +1,794 @@ +page.title=권한 +page.tags=previewresources, androidm +page.keywords=권한, 런타임, 미리 보기 +page.image={@docRoot}preview/features/images/permissions_check.png +@jd:body + + +<div id="qv-wrapper"> + <div id="qv"> + <h2>간략히 보기</h2> + <ul> + <li>앱이 M 미리 보기 SDK를 대상으로 하는 경우, 앱은 사용자에게 설치 시점이 아닌 런타임에 권한을 허용하도록 메시지를 표시합니다. +</li> + <li>사용자는 앱 설정 화면에서 언제든 권한을 취소할 수 있습니다. +</li> + <li>앱은 실행될 때마다 자신에게 필요한 권한이 있는지 확인해야 합니다. +</li> + </ul> + + <h2>이 문서의 내용</h2> + <ol> + <li><a href="#overview">개요</a></li> + <li><a href="#coding">런타임 권한에 대한 코딩</a></li> + <li><a href="#testing">런타임 권한 테스트</a></li> + <li><a href="#best-practices">모범 사례</a></li> + </ol> + +<!-- + <h2>Related Samples</h2> + <ol> + <li></li> + </ol> +--> + +<!-- + <h2>See also</h2> + <ol> + <li></li> + </ol> +--> + </div> <!-- qv --> +</div> <!-- qv-wrapper --> + + +<p> + M 개발자 미리 보기에서는 새로운 앱 권한 모델을 소개하여 사용자가 앱을 설치하고 업그레이드하는 과정을 간소화할 수 있습니다. + M 미리 보기에서 실행되는 앱이 새 권한 모델을 지원하는 경우, 사용자가 앱을 설치하거나 업그레이드할 때 아무런 권한을 허용하지 않아도 됩니다. 그 대신, 앱이 필요할 때마다 권한을 요청하고 시스템이 사용자에게 해당 권한을 요청하는 대화창을 표시합니다. + + + + +</p> + +<p> + 앱이 새 권한 모델을 지원하는 경우, Android 이전 버전을 실행하는 기기에서도 설치 및 실행할 수 있는 것은 변하지 않습니다. 이 경우, 그러한 기기의 기존 권한 모델을 사용합니다. + + +</p> + +<h2 id="overview"> + 개요 +</h2> + +<p> + M 개발자 미리 보기에서는 플랫폼에 새로운 권한 모델을 도입합니다. + 이 새로운 모델의 주요 구성 요소를 다음과 같이 요약해 보았습니다. +</p> + +<ul> + <li> + <strong>권한 선언:</strong> 이전 Android 플랫폼에서와 같이 앱은 자신이 필요로 하는 권한을 모두 매니페스트에서 선언합니다. + + </li> + + <li> + <strong>권한 그룹:</strong> 권한은 각자의 기능을 기반으로 <em>권한 그룹</em>으로 나뉩니다. + 예를 들어 <code>CONTACTS</code> 권한 그룹에는 사용자의 연락처와 프로필 정보를 읽고 쓰는 데 필요한 권한이 들어있습니다. + + + </li> + + <li> + <p><strong>설치 시점에 제한된 권한 허용:</strong> 사용자가 앱을 설치 또는 업데이트하면 시스템이 해당 앱에 앱이 요청하는 권한 중 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}에 포함되는 것을 모두 허용합니다. + + + + 예를 들어 알람 시계와 인터넷 권한은 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}에 속하므로 이들 권한은 설치 시점에 자동으로 허용됩니다. + + + </p> + + <p>시스템은 이외에도 앱 서명과 시스템 권한을 허용할 수도 있습니다. 이 내용은 <a href="#system-apps">시스템 앱 및 서명 권한</a>에 설명되어 있습니다. + + 설치 시 사용자에게 권한을 허용하라는 메시지가 표시되지 <em>않습니다.</em> +</p> + </li> + + <li> + <strong>사용자가 런타임에 권한 허용:</strong> 앱이 권한을 요청하면, 시스템이 사용자에게 대화창을 표시한 다음 앱의 콜백 기능을 호출해 권한이 허용되었는지를 알려줍니다. + + 사용자가 권한을 허용하는 경우, 앱에는 앱 매니페스트에서 선언한 해당 권한의 기능 영역에 관한 모든 권한이 부여됩니다. + + + </li> + +</ul> + +<p> + 이 권한 모델은 앱이 권한을 필요로 하는 기능에 대해 동작하는 방식을 바꾸어 놓습니다. + 다음은 이 모델에 적응하기 위한 몇 가지 개발 사례를 요약했습니다. + +</p> + +<ul> + + <li> + <strong>항상 권한을 확인:</strong> 앱이 권한을 필요로 하는 작업을 수행해야 할 때마다, 우선 앱에 해당 권한이 있는지 확인해야 합니다. + + 권한이 없는 경우, 해당 권한을 허용해도록 요청합니다. + + </li> + + <li> + <strong>권한 부족을 안정적으로 처리:</strong> 앱이 적절한 권한을 허용받지 못하면, 실패를 깔끔하게 처리할 수 있어야 합니다. + + 예를 들어 권한에 기능만 추가하면 되는 것이었다면, 앱이 해당 기능을 비활성화하면 됩니다. + 해당 권한이 앱이 제대로 기능하는 데 꼭 필요한 것이라면, 앱이 자신의 기능을 모두 비활성화하고 사용자에게 그 권한을 허용해야 한다고 알릴 수도 있습니다. + + + </li> + + <div class="figure" style="width:220px" id="fig-perms-screen"> + <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220"> + <p class="img-caption"> + <strong>그림 1.</strong> 앱의 '설정'에 있는 권한 화면. + </p> + </div> + + <li> + <strong>취소 가능한 권한:</strong> 사용자는 언제든 앱의 권한을 취소할 수 있습니다. + 사용자가 앱의 권한을 끄면 해당 앱에 그 사실을 알리지 <em>않습니다.</em> + 이런 경우, 앱이 제한된 작업을 수행하려면 필요한 권한이 있다는 점을 다시 확인해야 합니다. + + </li> +</ul> + +<p class="note"> + <strong>참고:</strong> 앱이 M 개발자 미리 보기를 대상으로 하는 경우, <em>반드시</em> 새 권한 모델을 사용해야 합니다. + +</p> + +<p> + M 개발자 미리 보기 시작 시점에는 Google 앱 중에 새 권한 모델을 완전히 구현하지 않는 앱도 있습니다. + Google은 이러한 앱을 M 개발자 미리 보기를 시행하면서 시간을 두고 업데이트하여 권한 설정/해제 설정을 제대로 사용하도록 할 예정입니다. + + +</p> + +<p class="note"> + <strong>참고:</strong> 앱에 자체 API 표면이 있는 경우, 권한을 대리로 허가하기 전에 우선 발신자에게 해당 데이터에 액세스할 필수 권한이 있는지 확인해야 합니다. + + +</p> + +<h3 id="system-apps"> + 시스템 앱 및 서명 권한 +</h3> + +<p> + 보통 사용자가 앱을 설치하면 시스템이 앱에 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}만 허용합니다. + + 하지만 시스템이 앱에 더 많은 권한을 허용하는 경우도 몇 가지 있습니다. + +</p> + +<ul> + <li>앱이 시스템 이미지의 일부분인 경우, 이 앱의 매니페스트에 목록으로 표시된 권한을 자동으로 모두 허용합니다. + + </li> + + <li>앱이 매니페스트에서 권한을 요청했는데 그것이 {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE}에 속하며 해당 앱이 그러한 권한을 선언한 앱과 같은 인증서로 서명되어 있는 경우, 시스템은 요청하는 앱을 설치할 때 그러한 권한을 허용합니다. + + + + + </li> +</ul> + +<p> + 두 가지 경우 모두, 사용자가 언제든 권한을 취소할 수 있는 것은 변하지 않습니다. 시스템의 <strong>설정</strong> 화면으로 이동하여 <strong>앱 ></strong> + + <i>app_name</i> <strong>> 권한</strong>을 선택하면 됩니다. 이 앱은 계속해서 런타임에 권한을 확인하고 필요한 경우 해당 권한을 요청해야 합니다. + + +</p> + +<h3 id="compatibility"> + 이전 및 이후 버전과의 호환성 +</h3> + +<p> + 앱이 M 개발자 미리 보기를 대상으로 하지 않더라도, 앱은 M 미리 보기 기기에서도 기존 권한 모델을 계속 사용합니다. + 사용자가 앱을 설치하면 시스템이 사용자에게 앱의 매니페스트에 목록으로 표시된 권한을 모두 허용하도록 요청합니다. + + +</p> + +<p class="note"> + <strong>참고:</strong> M 개발자 미리 보기를 실행하는 기기에서는 사용자가 어느 앱에 대해서든(레거시 앱 포함) 앱의 설정 화면에서 권한을 끌 수 있습니다. + + 사용자가 레거시 앱에 대한 권한을 끄면, 시스템이 자동으로 적절한 기능을 비활성화합니다. + 앱이 해당 권한을 필요로 하는 작업을 수행하려 시도한다고 해도 그 작업이 반드시 예외를 발생시키는 것은 아닙니다. + + 그 대신에 빈 데이터 세트를 반환하거나 오류를 신호하거나, 기타 예기치 못한 동작을 선보일 수 있습니다. + 예를 들어 권한 없이 캘린더를 쿼리하면 해당 메서드가 빈 데이터 세트를 반환합니다. + +</p> + +<p> + M 미리 보기를 실행하지 않는 기기에서 새 권한 모델을 사용하는 앱을 설치하면 시스템은 해당 앱을 다른 앱과 똑같이 다룹니다. 즉, 설치 시점에 시스템에 사용자에게 선언된 권한 모두를 허용하도록 요청합니다. + + + +</p> + +<p class="note"> + <strong>참고:</strong> 미리 보기 릴리스에서는 최소 SDK 버전을 M 미리 보기 SDK로 설정해야 미리 보기 SDK와 컴파일할 수 있습니다. + 즉, 개발자 미리 보기 시행 중에는 그러한 앱을 기존 플랫폼에서 테스트할 수 없다는 뜻입니다. + + +</p> + +<h3 id="perms-vs-intents">권한과 인텐트 비교</h3> + +<p> + 대부분의 경우, 앱에게 어떤 작업을 수행하도록 하려면 두 가지 방식 중 하나를 선택할 수 있습니다. + 첫째로 앱이 작업을 직접 수행하도록 권한을 요청할 수 있습니다. + 또는, 앱에 인텐트를 사용하도록 하여 또 다른 앱이 해당 작업을 수행하도록 할 수 있습니다. + +</p> + +<p> + 예를 들어 앱이 기기 카메라로 사진을 촬영할 수 있어야 한다고 가정합시다. + 그러면 앱은 <code>android.permission.CAMERA</code> 권한을 요청할 수 있습니다. 이렇게 하면 앱이 카메라에 직접 액세스할 수 있습니다. + + 그런 다음 앱이 카메라 API를 사용하여 카메라를 제어하고 사진을 촬영합니다. + 이 방식을 사용하면 앱에 사진 촬영 과정에 대해 완전한 제어권을 부여하고, 카메라 UI를 앱에 통합할 수 있습니다. + + +</p> + +<p> + 하지만, 그러한 제어권이 필요하지 않은 경우라면 그저 {@link android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 인텐트를 사용해 이미지를 요청하면 됩니다. + + 이 인텐트를 시작하면 사용자에게 카메라 앱을 선택하라는 메시지가 표시되고(기본 카메라 앱이 이미 있는 경우) 그 앱이 사진을 촬영합니다. + + 이 카메라 앱은 촬영한 사진을 개발자의 앱의 {@link android.app.Activity#onActivityResult onActivityResult()} 메서드에 반환합니다. + +</p> + +<p> + 이와 마찬가지로, 전화를 걸어야 하거나 사용자의 연락처에 액세스해야 하는 경우 등에는 적절한 인텐트를 만들거나 적절한 객체에 직접 액세스하도록 권한을 요청할 수 있습니다. + + 이 두 가지 방식에는 각각 장단점이 있습니다. + +</p> + +<p> + 권한을 사용하는 경우: +</p> + +<ul> + <li>개발자가 직접 작업을 수행하는 경우 본인의 앱이 사용자 환경을 완전히 제어합니다. + 다만, 그렇게 포괄적인 제어권을 가지면 적절한 UI를 디자인해야 하므로 작업이 복잡해집니다. + + </li> + + <li>사용자에게 권한을 부여하라는 메시지는 작업을 처음 수행할 때만 표시됩니다. + 그 다음부터는 앱이 사용자로부터 더 이상의 상호작용을 요청하지 않아도 작업을 수행할 수 있습니다. + 다만, 사용자가 해당 권한을 허용하지 않는 경우(또는 나중에 취소하는 경우), 앱은 해당 작업을 수행할 수 없게 됩니다. + + + </li> +</ul> + +<p> + 인텐트를 사용하는 경우: +</p> + +<ul> + <li>작업을 위해 UI를 디자인하지 않아도 됩니다. 이는 인텐트를 처리하는 앱이 UI를 제공하기 때문입니다. 하지만, 이것은 즉 개발자에게 사용자 환경에 대한 제어권이 전혀 없다는 뜻이기도 합니다. + + 사용자는 어쩌면 개발자가 본 적도 없는 앱과 상호작용하고 있을지 모릅니다. + + </li> + + <li>사용자에게 해당 작업에 대한 기본 앱이 없는 경우, 시스템은 사용자에게 앱을 선택하라는 메시지를 표시합니다. 사용자가 기본 처리기를 지정하지 않으면 해당 작업을 수행할 때마다 추가 대화창을 거쳐야 할 수도 있습니다. + + + + </li> +</ul> + +<h2 id="coding">런타임 권한에 대한 코딩</h2> + +<p> + 새로운 M 개발자 미리 보기를 대상으로 앱을 개발하는 경우, 새 권한 모델을 사용해야 합니다. + 이는 즉, 매니페스트에 필요한 권한을 선언하는 것 말고도 런타임에 자신이 해당 권한을 가지고 있는지도 확인해야 하며, 그러한 권한을 이미 가지고 있지 않으면 권한을 요청해야 한다는 뜻입니다. + + + +</p> + +<h3 id="enabling"> + 새 권한 모델 활성화하기 +</h3> + +<p> + 새로운 M 개발자 미리 보기 권한 모델을 활성화하려면 앱의 <code>targetSdkVersion</code> 특성을 <code>"MNC"</code>로 설정하고, <code>compileSdkVersion</code>은 <code>"android-MNC"</code>로 설정하세요. + + 이렇게 하면 새 권한 기능이 모두 활성화됩니다. + +</p> + +<p> + 미리 보기 릴리스에서는 <code>minSdkVersion</code>을 <code>"MNC"</code>로 설정해야만 미리 보기 SDK와 컴파일할 수 있습니다. + +</p> + +<h3 id="m-only-perm"> + M 미리 보기 전용 권한 지정하기 +</h3> + +<p> + 새 <code><uses-permission-sdk-m></code> 요소를 앱 매니페스트에 사용하여 권한이 M 개발자 미리 보기에서만 필요하다는 것을 나타낼 수 있습니다. + 권한을 이런 식으로 선언하면 앱이 이전 버전의 기기에 설치될 때마다 시스템에서 사용자에게 메시지를 표시하지도 않고 앱에 권한을 허용하지도 않습니다. <code><uses-permission-sdk-m></code> 요소를 사용하면 새 권한을 앱의 업데이트된 버전에 추가하면서도 사용자가 업데이트를 설치할 때 권한을 허용하라고 강제로 시키지 않아도 됩니다. + + + + + + +</p> + +<p> + 앱이 M 개발자 미리 보기를 갖춘 기기에서 실행되는 경우, <code><uses-permission-sdk-m></code>은 <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>과 똑같이 동작합니다. + + + 시스템은 사용자가 앱을 설치할 때 권한을 허용하라는 메시지를 표시하지 않고, 앱이 필요할 때마다 권한을 요청하게 됩니다. + +</p> + +<h3 id="prompting"> + 권한에 대한 메시지 표시하기 +</h3> + +<p> + 앱이 새로운 M 개발자 미리 보기 권한 모델을 사용하는 경우, 앱이 M 미리 보기에서 실행되는 기기에서 처음 시작되었을 때 사용자에게 모든 권한을 허용하도록 요청하지 않습니다. + + 대신, 앱은 필요할 때마다 권한을 요청합니다. + 앱이 권한을 요청하면 시스템이 사용자에게 대화창으로 표시합니다. + +</p> + +<p> + 앱이 SDK 22 이하를 탑재한 기기에서 실행되는 경우, 앱은 기존 권한 모델을 사용합니다. + 사용자가 앱을 설치하면 앱이 자신의 매니페스트에서 요청하는 모든 권한을 허용하라는 메시지가 표시되는데, 이때 <code><uses-permission-sdk-m></code>이라는 레이블이 붙은 권한은 예외입니다. + + +</p> + +<h4 id="check-platform">앱이 실행되는 플랫폼 확인</h4> + +<p> + 이 권한 모델은 M 개발자 미리 보기를 실행하는 기기에서만 지원됩니다. + 이러한 메서드 중에서 호출하려면 앱은 우선 {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME} 값을 확인하여 자신이 어느 플랫폼에서 실행 중인지 확인해야 합니다. + + + 기기가 M 개발자 미리 보기에서 실행 중인 경우, {@link android.os.Build.VERSION#CODENAME CODENAME}은 <code>"MNC"</code>입니다. + +</p> + +<h4 id="check-for-permission">앱에 필요한 권한이 있는지 확인</h4> + +<p>사용자가 권한을 필요로 하는 무언가를 하려고 시도하면, 앱은 자신이 현재 이 작업을 수행하는 데 필요한 권한을 가지고 있는지 확인합니다. + 이렇게 하기 위해 앱은 <code>Context.checkSelfPermission( )</code>을 호출합니다. + +<i>permission_name</i> 사용자가 앱의 권한을 언제든 취소할 수 있기 때문에 앱은 사용자가 해당 권한을 이미 허용했다는 것을 알고 있더라도 확인 작업을 수행해야 합니다. + + + 예를 들어, 사용자가 사진 촬영 앱을 사용하고자 한다면 앱은 <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>를 호출합니다. + +</p> + +<p class="table-caption" id="permission-groups"> + <strong>표 1.</strong> 권한과 권한 그룹.</p> +<table> + <tr> + <th scope="col">권한 그룹</th> + <th scope="col">권한</th> + </tr> + + <tr> + <td><code>android.permission-group.CALENDAR</code></td> + <td> + <ul> + <li> + <code>android.permission.READ_CALENDAR</code> + </li> + </ul> + <ul> + <li> + <code>android.permission.WRITE_CALENDAR</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.CAMERA</code></td> + <td> + <ul> + <li> + <code>android.permission.CAMERA</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.CONTACTS</code></td> + <td> + <ul> + <li> + <code>android.permission.READ_CONTACTS</code> + </li> + <li> + <code>android.permission.WRITE_CONTACTS</code> + </li> + <li> + <code>android.permission.READ_PROFILE</code> + </li> + <li> + <code>android.permission.WRITE_PROFILE</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.LOCATION</code></td> + <td> + <ul> + <li> + <code>android.permission.ACCESS_FINE_LOCATION</code> + </li> + <li> + <code>android.permission.ACCESS_COARSE_LOCATION</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.MICROPHONE</code></td> + <td> + <ul> + <li> + <code>android.permission.RECORD_AUDIO</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.PHONE</code></td> + <td> + <ul> + <li> + <code>android.permission.READ_PHONE_STATE</code> + </li> + <li> + <code>android.permission.CALL_PHONE</code> + </li> + <li> + <code>android.permission.READ_CALL_LOG</code> + </li> + <li> + <code>android.permission.WRITE_CALL_LOG</code> + </li> + <li> + <code>com.android.voicemail.permission.ADD_VOICEMAIL</code> + </li> + <li> + <code>android.permission.USE_SIP</code> + </li> + <li> + <code>android.permission.PROCESS_OUTGOING_CALLS</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.SENSORS</code></td> + <td> + <ul> + <li> + <code>android.permission.BODY_SENSORS</code> + </li> + </ul> + <ul> + <li> + <code>android.permission.USE_FINGERPRINT</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.SMS</code></td> + <td> + <ul> + <li> + <code>android.permission.SEND_SMS</code> + </li> + <li> + <code>android.permission.RECEIVE_SMS</code> + </li> + <li> + <code>android.permission.READ_SMS</code> + </li> + <li> + <code>android.permission.RECEIVE_WAP_PUSH</code> + </li> + <li> + <code>android.permission.RECEIVE_MMS</code> + </li> + <li> + <code>android.permission.READ_CELL_BROADCASTS</code> + </li> + </ul> + </td> + </tr> + +</table> + +<h4 id="request-permissions">필요한 경우 권한 요청</h4> + +<p>앱이 자신에게 필요한 권한을 이미 가지고 있지 않은 경우, 앱은 <code>Activity.requestPermissions(String[], int)</code> 메서드를 호출하여 적절한 권한(여러 개일 수 있음)을 요청합니다. + + 앱은 원하는 권한을 요청하면서 정수 "요청 코드"를 요청합니다. + + 이 메서드는 비동기화 방식으로 기능합니다. 이는 즉각적으로 반환되며, 사용자가 대화 상자에 응답한 다음에는 시스템이 결과를 가지고 앱의 콜백 메서드를 호출하여 앱이 <code>requestPermissions()</code>에 전달한 "요청 코드"와 같은 코드를 전달합니다. + + +</p> + + <p>다음 코드는 앱에 사용자의 연락처를 읽을 권한이 있는지 코드 확인을 하고, 필요한 경우 해당 권한을 요청합니다. +</p> + +<pre> +if (checkSelfPermission(Manifest.permission.READ_CONTACTS) + != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, + MY_PERMISSIONS_REQUEST_READ_CONTACTS); + + // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an + // app-defined int constant + + return; +} +</pre> + +<h4 id="handle-response">권한 요청 응답 처리하기</h4> + +<p> + 앱이 권한을 요청하면 시스템이 사용자에게 대화 상자를 표시합니다. + 사용자가 응답하면 시스템은 앱의 <code>Activity.onRequestPermissionsResult(int, String[], int[])</code>를 불러내 이를 사용자 응답에 전달합니다. + + 앱은 해당 메서드를 재정의해야 합니다. 이 콜백에는 개발자가 <code>requestPermissions()</code>에 전달한 것과 같은 요청 코드가 전달됩니다. + + 예를 들어 어느 앱이 <code>READ_CONTACTS</code> 액세스를 요청한다면 다음과 같은 콜백 메서드를 가지고 있을 수 있습니다. + + +</p> + +<pre> +@Override +public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + + // permission was granted, yay! do the + // calendar task you need to do. + + } else { + + // permission denied, boo! Disable the + // functionality that depends on this permission. + } + return; + } + + // other 'switch' lines to check for other + // permissions this app might request + } +} +</pre> + + <p>사용자가 권한을 허용하면 시스템은 앱 매니페스트에 그 기능 영역에 대해 목록으로 표시된 모든 권한을 해당 앱에 부여합니다. + 사용자가 요청을 거부하면 적절한 조치를 취해야 합니다. + 예를 들어 이 권한에 좌우되는 메뉴 작업을 모두 비활성화할 수 있습니다. + + </li> +</p> + +<p> + 시스템이 사용자에게 권한을 허용하도록 요청하면 사용자에게는 시스템에 해당 권한을 다시 요청하지 말라고 지시할 선택권이 있습니다. + 그런 경우, 앱이 해당 권한을 요청하기 위해 <code>requestPermissions()</code>를 사용하면 시스템이 즉시 요청을 거부합니다. + + 이 경우 시스템은 사용자가 명시적으로 개발자의 요청을 다시 거부한 것처럼 <code>onRequestPermissionsResult()</code>를 호출합니다. + + 이러한 이유로, 앱은 사용자와의 직접적인 상호작용이 일어났다고 가정해서는 안 됩니다. + +</p> + +<h2 id="testing">런타임 권한 테스트</h2> + + +<p> + M 개발자 미리 보기를 대상으로 삼고 앱을 개발하는 경우, 이 앱이 권한을 적절하게 처리하는지 테스트해보아야 합니다. + 앱이 실행될 때 특정 권한을 가지고 있다고 가정해서는 안 됩니다. + 앱을 처음 시작할 때에는 아무런 권한도 없을 가능성이 높고, 사용자가 언제든 권한을 취소하거나 복원할 수 있기 때문입니다. + + +</p> + +<p> + 앱을 테스트하여 모든 권한 관련 상황에서 제대로 작동하는지 확인하는 것이 좋습니다. + M 미리 보기 SDK에서는 새로운 <a href="{@docRoot}tools/help/adb.html">Android 디버그 브리지(adb)</a> 명령을 제공하여 여러분이 시도해 보아야 하는 권한 설정이 무엇이든 앱을 테스트할 수 있도록 하였습니다. + + + +</p> + +<h3> + 새로운 adb 명령 및 선택 사항 +</h3> + +<p> + M 미리 보기 SDK 플랫폼 도구에서는 여러 가지 새로운 명령을 제공하여 앱이 권한을 처리하는 방식을 테스트해볼 수 있습니다. + +</p> + +<h4> + 권한으로 설치 +</h4> + +<p> + <a href="{@docRoot}tools/help/adb.html#move"><code>adb + install</code></a> 명령의 새로운 <code>-g</code> 선택 항목을 사용하면 앱을 설치하고 해당 앱의 매니페스트에 목록으로 표시된 모든 권한을 허용합니다. + +</p> + +<pre class="no-pretty-print"> +$ adb install -g <path_to_apk> +</pre> + +<h4> + 권한 허용 및 취소 +</h4> + +<p> + 새로운 ADB <a href="{@docRoot}tools/help/adb.html#pm">패키지 관리자(pm)</a> 명령을 사용하면 설치된 앱에 권한을 허용하고 취소할 수 있습니다. 이 기능은 자동화 설정에서 유용하게 쓰일 수 있습니다. + + +</p> + +<p> + 권한을 허용하려면, 패키지 관리자의 <code>grant</code> 명령을 사용하세요. +</p> + +<pre class="no-pretty-print"> +$ adb pm grant <package_name> <permission_name> +</pre> + +<p> + 예를 들어 com.example.myapp 패키지 권한을 허용하여 오디오를 녹음하려면 이 명령을 사용하면 됩니다. + +</p> + +<pre class="no-pretty-print"> +$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO +</pre> + +<p> + 권한을 취소하려면, 패키지 관리자의 <code>revoke</code> 명령을 사용하세요. +</p> + +<pre class="no-pretty-print"> +$ adb pm revoke <package_name> <permission_name> +</pre> + +<h2 id="best-practices">모범 사례</h2> + +<p> + 새 권한 모델을 사용하면 사용자에게 보다 원활한 환경을 제공하고, 앱을 더욱 쉽게 설치하며 앱이 어떤 작업을 하고 있는지 바로 확인할 수 있습니다. + + 새 모델의 장점을 최대한 활용할 수 있도록 다음과 같은 모범 사례를 추천해 드립니다. + +</p> + + +<h3 id="bp-what-you-need">필요한 권한만 요청</h3> + +<p> + 권한을 요청할 때마다 사용자에게는 결정을 내리라는 강요를 하는 셈입니다. + 사용자가 요청을 거절하면 앱의 기능이 저하됩니다. + 때문에 이러한 요청을 하는 횟수를 최소한으로 줄이는 것이 좋습니다. +</p> + +<p> + 예를 들어 앱이 권한을 요청하는 대신 <a href="{@docRoot}guide/components/intents-filters.html">인텐트</a>를 사용해 필요한 기능을 얻을 수 있는 경우도 꽤 많습니다. + + 앱이 전화기의 카메라를 사용해 사진을 촬영해야 하는 경우, 앱은 {@link android.provider.MediaStore#ACTION_IMAGE_CAPTURE MediaStore.ACTION_IMAGE_CAPTURE} 인텐트를 사용할 수 있습니다. + + + 앱이 인텐트를 실행하면 시스템이 사용자에게 메시지를 표시해 이미 설치된 카메라 앱을 선택하여 사진을 촬영하도록 합니다. + + +</p> + +<h3 id="bp-dont-overwhelm"> + 사용자에게 부담을 주지 말 것 +</h3> + +<p> + 사용자에게 엄청나게 많은 수의 권한 요청을 한꺼번에 들이밀면 사용자가 부담을 느끼고 앱을 종료해버리는 결과를 초래할 수 있습니다. 대신 권한이 필요할 때마다 요청하는 것이 좋습니다. + + +</p> + +<p> + 일부 경우에는 앱에 절대적으로 꼭 필요한 권한이 한 개 이상 있을 수도 있습니다. 그런 경우에는 앱이 시작되자마자 해당 권한을 모두 요청하는 것을 권장합니다. + + 예를 들어 사진 앱을 만들면 앱이 기기 카메라로 액세스할 수 있는 권한이 필요합니다. + 사용자가 앱을 처음으로 시작할 때 카메라를 사용할 권한을 요청받아도 놀라지는 않을 것입니다. + + 하지만 같은 앱에 사용자의 연락처과 사진을 공유하는 기능도 있다고 가정한다면 이 경우 해당 권한을 첫 시작 시점에 요청하는 것은 별로 권장할 만한 일이 <em>아닙니다.</em> + + 대신, 사용자가 "공유" 기능을 요청하려 할 때까지 기다렸다가 그 때 해당 권한을 요청하면 됩니다. + +</p> + +<p> + 앱이 튜토리얼을 제공하는 경우, 튜토리얼 시퀀스가 다 끝날 무렵에 앱의 필수 권한을 요청하는 것이 이치에 맞을 수 있습니다. + +</p> + +<h3 id="bp-explain"> + 권한이 필요한 이유 설명 +</h3> + +<p> + 개발자가 <code>requestPermissions()</code>를 호출하면 시스템이 표시하는 권한 대화창에는 앱이 원하는 권한이 무엇인지는 나타나 있지만 그것이 필요한 이유는 설명하지 않습니다. + + 사용자가 이런 것을 의아하게 여기는 경우가 있을 수 있습니다. + 우선 사용자에게 앱이 왜 그런 권한을 원하는지 설명한 다음 <code>requestPermissions()</code>를 호출하는 것이 좋습니다. + +</p> + +<p> + 예를 들어 사진 앱인 경우 위치 서비스를 이용하고자 할 수 있습니다. 그래야 사진에 지오태그를 표시할 수 있기 때문입니다. + 일반적인 사용자는 사진에 위치 정보를 담을 수 있다는 점을 모를 수도 있고, 그러면 사진 앱이 왜 위치를 알고 싶어 하는지 의아하게 여길 수 있습니다. + + 그러므로 이런 경우에는 앱이 사용자에게 이런 기능에 대해 <em>미리</em> 알려드린 후 <code>requestPermissions()</code>를 호출하는 것이 좋습니다. + + +</p> + +<p> + 이를 수행하기 위한 한 가지 방법은 이러한 요청을 앱 튜토리얼에 넣는 것입니다. 튜토리얼에는 앱의 각 기능을 표시할 수 있고, 그러면서 어느 권한이 필요한지 설명할 수도 있기 때문입니다. + + 예를 들어 사진 앱의 튜토리얼에서 "연락처 목록의 지인들과 사진 공유" 기능을 시연한 다음 사용자에게 앱이 사용자의 연락처를 보려면 권한을 부여해야 한다고 알리면 됩니다. + + + 그런 다음, 앱이 <code>requestPermissions()</code>를 호출하여 사용자에게 해당 액세스를 요청합니다. + 물론 튜토리얼을 따르지 않는 사용자도 있게 마련이므로 앱의 정상 작동 중에 권한을 확인하고 요청해야 합니다. + + +</p> diff --git a/docs/html-intl/intl/ko/preview/overview.jd b/docs/html-intl/intl/ko/preview/overview.jd new file mode 100644 index 0000000..d325725 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/overview.jd @@ -0,0 +1,362 @@ +page.title=프로그램 개요 +page.metaDescription=Android M 개발자 미리 보기를 시작하신 여러분, 환영합니다. 이 프로그램은 Android의 다음 버전에 대해 앱을 테스트하고 최적화하는 데 필요한 모든 것을 제공해 드립니다. +page.image=images/cards/card-preview_16-9_2x.png +page.tags="preview", "developer", "android" + +@jd:body + +<p> + <strong>Android M 개발자 미리 보기</strong>를 시작하신 여러분, 환영합니다. 이 프로그램은 Android의 다음 버전에 대해 앱을 테스트하고 최적화하는 데 필요한 모든 것을 제공해 드립니다. + + 이 프로그램은 무료이며, M 개발자 미리 보기 도구만 다운로드하면 시작하실 수 있습니다. + +</p> + +<div style="background-color:#eceff1;padding:1em;"> +<div class="wrap"> + <div class="cols"> + <div class="col-4of12"> + <h5> + 하드웨어 및 에뮬레이터 시스템 이미지 + </h5> + + <p> + Nexus 5, 6, 9, Player(TV용)와 에뮬레이터에서 앱을 실행하고 테스트해 보세요. + + </p> + </div> + + <div class="col-4of12"> + <h5> + 최신 플랫폼 코드 + </h5> + + <p> + 미리 보기 시행 중에 여러 번의 업데이트를 제공할 예정입니다. 이로써 여러분은 항상 최신 플랫폼 변경에 대해 테스트할 수 있습니다. + + </p> + </div> + + <div class="col-4of12"> + <h5> + 업데이트를 OTA로 전달 + </h5> + + <p> + 일단 기기를 최초 미리 보기에 플래시하고 나면 OTA로 업데이트를 받을 수 있습니다. + + </p> + </div> + </div> + + <div class="cols"> + + + <div class="col-4of12"> + <h5> + 새 동작 및 기능 + </h5> + + <p> + 작업을 일찍 시작하여 새 런타임 권한 모델과 절전 기능 등 새로운 플랫폼 동작을 지원합니다. + + </p> + </div> + + <div class="col-4of12"> + <h5> + 개발자가 보고한 문제에 대한 우선 순위 창 + </h5> + + <p> + Google에서는 처음 몇 주 동안 개발자가 보고한 문제에 우선 순위를 부여할 예정입니다. 가능한 빨리 테스트하고 피드백을 보내 주세요. + + </p> + </div> + + <div class="col-4of12"> + <h5> + 피드백 및 지원 + </h5> + + <p> + 문제를 보고하고 Google의 <a href="https://code.google.com/p/android-developer-preview/">문제 추적기</a>를 사용해 피드백을 보내 주세요. + <a href="http://g.co/dev/AndroidMDevPreview">M 개발자 커뮤니티</a>를 이용하면 다른 개발자들과 의견을 주고받을 수 있습니다. + + </p> + </div> + </div> +</div> +</div> + +<!-- +<p> + With the M Developer Preview, you'll get an early start on testing your apps, + with enough time to make adjustments before the public platform release later + in the year. We'll provide several updates to the Preview tools in the weeks + ahead, so you can keep in sync with the latest changes as the platform moves + toward launch. +</p> +<img src="{@docRoot}preview/images/m-preview-timeline.png" alt= +"Preview program timeline" id="timeline"> +<p> + You can help us improve the platform by <a href= + "https://code.google.com/p/android-developer-preview/">reporting issues</a> + through our feedback channels. This is especially + critical in the first month of the preview, when we’ll be giving priority to + developer-reported issues and feedback. +</p> --> + + +<h2 id="timeline"> + 일정 및 업데이트 +</h2> +<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline"> +<p> + M 개발자 미리 보기는 5월 28일부터 최종 Android M SDK가 출시될 때까지 실행됩니다. 최종 버전은 2015년 3사분기 중으로 예정된 공개 릴리스 직전에 출시할 계획입니다. + + +</p> + +<p> + 개발 중 중요 단계에 다다를 때마다 여러분의 테스트 기기를 위해 업데이트를 전달해 드리겠습니다. + 잠정적인 중요 단계는 다음과 같습니다. +</p> + +<ul> + <li> + <strong>미리 보기 1</strong>(최초 미리 보기 릴리스, 5월 말) + </li> + + <li> + <strong>미리 보기 2</strong>(6월 말/7월 초) + </li> + + <li> + <strong>미리 보기 3</strong>(최종 버전 출시 직전, 7월 말) + </li> +</ul> + +<p> + 이러한 업데이트는 <strong>최종 SDK</strong>(3사분기 후반)로 막을 내릴 것이며, 이것으로 Android 새 버전에 대한 공식 API뿐만 아니라 최종 시스템 동작 및 기능도 제공하게 됩니다. + + +</p> + +<p> + Android M에서 테스트와 개발을 수행하는 동안 미리 보기 업데이트가 출시되는 것에 맞춰 <strong>개발 환경을 최신 상태로 유지</strong>할 것을 강력히 권장합니다. + + 이 과정을 보다 단순화하기 위해 이미 미리 보기 빌드에 플래시한 기기에는 <strong>OTA(over-the-air) 업데이트</strong>를 제공할 예정이며, 이외에도 수동으로 다운로드하고 플래시할 수 있는 시스템 이미지도 제공할 계획입니다. + + +</p> +<p class="note"> + <strong>참고:</strong> 최종 SDK와 시스템 이미지는 OTA로 전달할 수 없습니다. 그 대신 개발자 본인의 테스트 기기에서 <strong>수동으로 플래시</strong>해야 합니다.</strong> + + +</p> + +<p> + 미리 보기 업데이트를 이용할 수 있게 될 때마다 <a href="http://android-developers.blogspot.com/">Android 개발자 블로그</a>, 해당 사이트 및 <a href="http://g.co/dev/AndroidMDevPreview">Android M 개발자 커뮤니티</a>를 통해서 알려드릴 것입니다. + + +</p> + +<h2 id="preview_tools"> + 미리 보기 내용 +</h2> + +<p> + M 개발자 미리 보기에는 기존 앱을 여러 가지 화면 크기, 네트워크 기술, CPU/GPU 칩세트 및 하드웨어 아키텍처에서 테스트하는 데 필요한 모든 것이 포함되어 있습니다. + + +</p> + +<h4> + SDK 도구 +</h4> + +<p> + 이러한 구성 요소는 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>에서 SDK Manager를 통해 다운로드할 수 있습니다. +</p> + +<ul> + <li>M 개발자 미리 보기 <strong>SDK 도구</strong> + </li> + + <li>M 개발자 미리 보기 <strong>에뮬레이터 시스템 이미지</strong>(32비트 및 64비트) + + </li> + + <li>M 개발자 미리 보기 <strong>Android TV용 에뮬레이터 시스템 이미지</strong>(32비트) + + </li> +</ul> + +<h4> + 하드웨어 시스템 이미지 +</h4> + +<p> + Nexus 기기에 대한 다음과 같은 하드웨어 시스템 이미지는 <a href="download.html">다운로드 페이지</a>에서 다운로드할 수 있습니다. + +</p> + +<ul> + <li> + <strong>Nexus 5</strong>(GSM/LTE) “hammerhead” 기기 시스템 이미지 + </li> + + <li> + <strong>Nexus 6</strong> “shamu” 기기 시스템 이미지 + </li> + + <li> + <strong>Nexus 9</strong>(Wi-Fi) “volantis” 기기 시스템 이미지 + </li> + + <li> + <strong>Nexus Player</strong>(Android TV) “fugu” 기기 시스템 이미지 + </li> +</ul> + +<h4> + 관련 문서 및 샘플 코드 +</h4> + +<p> + 다음과 같은 관련 문서 리소스는 미리 보기에 대해 익히는 데 유용합니다. +</p> + +<ul> + <li> + <a href="setup-sdk.html">SDK 설정</a>에는 시작하는 데 필요한 단계별 지침이 들어 있습니다. + + </li> + + <li> + <a href="{@docRoot}preview/testing/guide.html">테스트 가이드</a>와 <a href="behavior-changes.html">동작 변경</a>에서는 테스트해야 할 주요 영역을 알려줍니다. + </li> + + <li>새 API 관련 문서 중에서 <a href="api-overview.html">API 개요</a>, 다운로드할 수 있는 <a href="{@docRoot}preview/download.html#docs">API 참조</a>와 자세한 개발자 가이드(<a href="{@docRoot}preview/features/runtime-permissions.html">권한</a>, <a href="{@docRoot}preview/backup/index.html">앱 백업</a> 등 주요 기능에 대한 내용)도 참조하세요. + + + + + </li> + + <li> + <a href="{@docRoot}preview/samples.html">샘플 코드</a>는 권한과 기타 새로운 기능을 지원하는 방법을 설명합니다. + + </li> + + <li> + <a href="{@docRoot}preview/support.html#release-notes">릴리스 노트</a>를 보면 M 개발자 미리 보기의 현재 버전에 대해 변경 내용 참고 사항과 차이점 보고서 등 관련 정보를 확인할 수 있습니다. + + </li> +</ul> + +<h4> + 지원 리소스 +</h4> + +<p> + M 개발자 미리 보기에서 테스트하고 개발하는 데 유용한 지원 리소스를 소개합니다. + +</p> + +<ul> + <li><a href="https://code.google.com/p/android-developer-preview/">M 개발자 미리 보기 문제 추적기</a>가 여러분의 <strong>기본 피드백 채널</strong>입니다. + + 문제 추적기를 통해 버그와 성능 문제를 보고하고 전반적인 피드백을 주시면 됩니다. + 이를 통해 <a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">알려진 문제</a>를 확인하고 해결 방법 단계를 찾아볼 수도 있습니다. + + </li> + + <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 개발자 커뮤니티</a>는 일종의 Google+ 커뮤니티로, 여기에서 여러분은 Android M을 가지고 작업하는 <strong>다른 개발자들과 이야기</strong>를 나눌 수 있습니다. 서로의 의견이나 아이디어를 나누고 Android M 관련 질문에 대한 대답을 찾을 수도 있습니다. + + + + </li> +</ul> + + +<h2 id="preview_apis_and_publishing"> + 대상 지정, 미리 보기 API 및 게시 +</h2> + +<p> + Android M 개발자 미리 보기는 개발 전용 릴리스이며 <strong>표준 API 레벨이 없습니다</strong>. + 앱을 테스트하기 위해 호환성 동작에서 옵트아웃하고자 하는 경우(강력히 권장함), M 개발자 미리 보기를 대상으로 지정하면 됩니다. 앱의 <code><a href= + "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>을 <code>“MNC”</code>로 지정하세요. + + + +</p> + +<p> + Android M 개발자 미리 보기에서는 <strong>미리 보기 API</strong>를 제공합니다. —이 API는 최종 SDK가 출시될 때까지 공식적인 버전으로 인정되지 않습니다. 최종 SDK 릴리스는 현재 2015년 삼사분기 무렵으로 예정되어 있습니다. + + 이는 즉, 시간이 지나면서 <strong>사소한 API 변경</strong>이 있을 것이라는 점을 예상해야 한다는 뜻입니다. 특히 프로그램 초반 몇 주 동안은 유의해야 합니다. + + Android M 개발자 미리 보기를 업데이트할 때마다 변경 내용을 요약해서 제공해 드릴 것입니다. + +</p> + +<p class="note"> + 미리 보기 API는 변경될 수 있지만, 런타임 권한과 절전 기능과 같은 기본 시스템 동작은 안정적이며 지금 바로 테스트 가능한 상태입니다. + + +</p> + +<p> + 게시에 관해서는, Google Play에서는 <strong>M 개발자 미리 보기를 대상으로 삼는 앱의 게시를 방지합니다.</strong> + Android M 최종 SDK를 이용할 수 있게 되면 공식 Android M API 레벨을 대상으로 지정할 수 있고, 그때 Google Play에 앱을 게시하면 됩니다. + + 그때까지는 테스터들에게 Android M을 대상으로 지정한 앱을 배포하고자 하는 경우 이메일이나 본인의 사이트에서 직접 다운로드를 통해 하시면 됩니다. + + +</p> + +<h2 id="get_started"> + 시작 방법 +</h2> + +<p> + 앱 테스트를 시작하려면 +</p> + +<ol> + <li><a href="{@docRoot}preview/api-overview.html">API 개요</a>와 <a href="{@docRoot}preview/behavior-changes.html">동작 변경</a>을 검토해 새로운 내용과 이것이 본인의 앱에 미치는 영향에 대해 알고 있어야 합니다. + + 특히, 새로운 <a href="{@docRoot}preview/features/runtime-permissions.html">런타임 권한</a> 모델, 절전 기능과 자동 백업에 대해 숙지하는 것이 좋습니다. + + + </li> + + <li>환경을 설정할 때에는 <a href="{@docRoot}preview/setup-sdk.html">미리 보기 SDK 설정</a>과 테스트 기기를 구성하는 데 관련된 지침을 따르세요. + + + </li> + + <li><a href="https://developers.google.com/android/nexus/images">플래시 지침</a>을 따라 최신 M 개발자 미리 보기 시스템 이미지를 Nexus 5, 6, 9 및 Player에 플래시하세요. + + 일단 개발 기기를 플래시하고 나면, 미리 보기 업데이트가 OTA(over-the-air) 업데이트를 통해 전달됩니다.</a> + + </li> + + <li><a href="{@docRoot}preview/download.html#docs">M 미리 보기 API 참조</a>와 <a href="{@docRoot}preview/samples.html">M 미리 보기 샘플</a>을 다운로드하면 새로운 API 기능과 앱에서 그러한 기능을 사용하는 방법에 대해 좀 더 자세히 파악할 수 있습니다. + + + + </li> + + <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 개발자 커뮤니티</a>에 가입하여 최신 소식을 알아보고, 새 플랫폼으로 작업하는 다른 개발자들과 이야기를 나눠보세요. + + + </li> +</ol> + +<p> + Android M 개발자 미리 보기 프로그램에 참가해 주셔서 대단히 감사합니다! +</p> |