blob: aac9a44924e04da678b6bf38398022c60ce1ff28 [file] [log] [blame]
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 &raquo;</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>
&lt;uses-permission
android:name="android.permission.USE_FINGERPRINT" /&gt;
</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>설정 &gt; 보안 &gt; 지문</strong>으로 이동한 다음, 등록 지침을 따르면 됩니다.
</li>
<li>에뮬레이터를 사용하여 지문 터치 이벤트를 에뮬레이트하되 다음 명령을 사용하세요.
잠금 화면이나 앱에서 지문 터치 이벤트를 에뮬레이트할 때에도 같은 명령을 사용합니다.
<pre class="no-prettyprint">
adb -e emu finger touch &lt;finger_id&gt;
</pre>
<p>Windows에서는 {@code telnet 127.0.0.1 &lt;emulator-id&gt;}에 뒤이어 {@code finger touch &lt;finger_id&gt;}를 실행해야 수도 있습니다.
</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>
&lt;service android:name=".ChooserTargetService"
android:label="&#64;string/service_name"
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"&gt;
&lt;intent-filter&gt;
&lt;action android:name="android.service.chooser.ChooserTargetService" /&gt;
&lt;/intent-filter&gt;
&lt;/service&gt;
</pre>
<p>{@code ChooserTargetService}에 노출하고자 하는 액티비티마다 {@code &lt;meta-data&gt;} 요소를 하나씩 추가하고, 매니페스트에 {@code "android.service.chooser.chooser_target_service"} 이름을 추가합니다.
</p>
<pre>
&lt;activity android:name=".MyShareActivity”
android:label="&#64;string/share_activity_label"&gt;
&lt;intent-filter>
&lt;action android:name="android.intent.action.SEND" /&gt;
&lt;/intent-filter>
&lt;meta-data
android:name="android.service.chooser.chooser_target_service"
android:value=".ChooserTargetService" /&gt;
&lt;/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>설정 &gt; 데이터</strong>에 표시되는 데이터 사용량 통계를 쿼리할 있습니다.
프로필 소유자에게는 자신이 관리하는 프로필에서 데이터를 쿼리할 권한이 자동으로 부여되는 반면, 기기 소유자의 경우에는 관리된 기본 사용자의 사용량 데이터에 대한 액세스 권한이 주어집니다.
</li>
<li><strong>런타임 권한 관리:</strong>
<p>프로필 또는 기기 소유자는 모든 애플리케이션의 모든 런타임 요청에 대해 권한 정책을 설정할 있습니다. {@code DevicePolicyManager.setPermissionPolicy()}를 사용해 사용자에게 정상적으로 권한을 부여하라는 메시지를 표시하거나, 자동으로 권한을 허용하거나 해당 권한을 자동으로 거부하도록 수도 있습니다.
후자의 정책이 설정된 경우, 사용자는 앱의 <strong>설정</strong> 내에 있는 권한 화면 안에서 프로필 또는 기기 소유자가 선택한 내용을 수정할 없습니다.
</p></li>
<li><strong>설정 VPN:</strong> 이제 VPN 앱이 <strong>설정 &gt; 더 보기 &gt; 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>