1page.title=Información general de la API
2page.keywords=preview,sdk,compatibility
3page.tags=previewresources, androidm
4sdk.platform.apiLevel=22-mnc
5page.image=images/cards/card-api-overview_16-9_2x.png
6@jd:body
7
8
9<div id="qv-wrapper">
10<div id="qv">
11
12<h2>Contenido del documento<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
13
14        <span class="more">mostrar más</span>
15        <span class="less" style="display:none">mostrar menos</span></a></h2>
16
17<ol id="toc44" class="hide-nested">
18  <li><a href="#app-linking">Vinculación de la aplicación</a></li>
19  <li><a href="#backup">Copia de seguridad automática para aplicaciones</a></li>
20  <li><a href="#authentication">Autenticación</a>
21    <ol>
22      <li><a href="#fingerprint-authentication">Autenticación por huellas dactilares</a></li>
23      <li><a href="#confirm-credential">Confirmar credencial</a></li>
24    </ol>
25  </li>
26  <li><a href="#direct-share">Compartir de forma directa</a></li>
27  <li><a href="#voice-interactions">Interacciones de voz</a></li>
28  <li><a href="#assist">Asistencia de API</a></li>
29  <li><a href="#notifications">Notificaciones</a></li>
30  <li><a href="#bluetooth-stylus">Soporte del lápiz Bluetooth</a></li>
31  <li><a href="#ble-scanning">Exploración mejorada de Bluetooth de bajo consumo</a></li>
32  <li><a href="#hotspot">Soporte de Hotspot 2.0 versión 1</a></li>
33  <li><a href="#4K-display">Modo de pantalla 4K</a></li>
34  <li><a href="#behavior-themeable-colorstatelists">ColorStateLists para poder aplicar temas</a></li>
35  <li><a href="#audio">Características de audio</a></li>
36  <li><a href="#video">Características de video</a></li>
37  <li><a href="#camera">Características de la cámara</a>
38    <ol>
39      <li><a href="#flashlight">API para luz de flash</a></li>
40      <li><a href="#reprocessing">Reprocesamiento de la cámara</a></li>
41    </ol>
42  </li>
43  <li><a href="#afw">Características de Android for Work</a></li>
44</ol>
45
46<h2>Diferencias de las API</h2>
47<ol>
48<li><a href="{@docRoot}preview/download.html">Nivel de API 22 para la versión preliminar de Android M &raquo;</a> </li>
49</ol>
50
51</div>
52</div>
53
54<p>M Developer Preview le brinda una perspectiva avanzada de la próxima versión de la plataforma Android, que ofrece nuevas características para usuarios y desarrolladores de aplicaciones.
55
56 En este documento, se brinda una introducción sobre las API más distinguidas.</p>
57
58<p>M Developer Preview está destinado a <strong>usuarios desarrolladores principiantes</strong> y <strong>evaluadores</strong>.
59 Si le interesa influenciar la dirección del marco de trabajo de Android,
60<a href="{@docRoot}preview/setup-sdk.html">pruebe M Developer Preview y</a> envíenos sus comentarios.
61
62</p>
63
64<p class="caution"><strong>Advertencia:</strong> No publique las aplicaciones que utilizan M Developer Preview en la tienda de Google Play.
65</p>
66
67<p class="note"><strong>Nota:</strong> Este documento, a menudo, hace referencia a clases y métodos que aún no cuentan con materiales de referencia disponibles en <a href="{@docRoot}">developer.android.com</a>.
68 Estos elementos de API tienen el formato {@code code style} en este documento (sin hipervínculos).
69 Para obtener la documentación preliminar de la API para estos elementos, descargue la <a href="{@docRoot}preview/download.html#docs"> referencia de la versión preliminar</a>.
70</p>
71
72<h3>Importantes cambios en los comportamientos</h3>
73
74<p>Si publicó anteriormente una aplicación para Android, tenga en cuenta que su aplicación podría verse afectada por los cambios en la plataforma.
75</p>
76
77<p>Consulte la sección <a href="behavior-changes.html">Cambios en los comportamientos</a> para obtener información detallada.</p>
78
79<h2 id="app-linking">Vinculación de la aplicación</h2>
80<p>Esta versión preliminar mejora el sistema de intentos de Android al proporcionar una vinculación más sólida de la aplicación. Esta característica le permite asociar una aplicación con un dominio web propio.
81 Según esta asociación, la plataforma puede determinar la aplicación predeterminada que se debe utilizar para controlar un vínculo web en particular y omitir el paso de pedirles a los usuarios que seleccionen una aplicación. Para aprender a implementar esta característica, consulte la sección
82<a href="{@docRoot}preview/features/app-linking.html">Vinculación de la aplicación</a>.
83
84
85
86<h2 id="backup">Copia de seguridad automática para aplicaciones</h2>
87<p>Ahora, el sistema realiza restauraciones y copias de seguridad de datos completas y automáticas para las aplicaciones. Este comportamiento se habilita de forma predeterminada para las aplicaciones que tienen como destino la versión preliminar de Android M; usted no necesita agregar ningún código adicional.
88 Si los usuarios eliminan sus cuentas de Google, también se eliminarán sus datos de copias de seguridad.
89 Para obtener información sobre cómo funciona esta característica y cómo configurar qué elementos incluir en la copia de seguridad del sistema de archivo, consulte la sección
90<a href="{@docRoot}preview/backup/index.html">Copia de seguridad automática para aplicaciones</a>.
91</p>
92
93<h2 id="authentication">Autenticación</h2>
94<p>Esta versión preliminar ofrece nuevas API para permitirle autenticar usuarios al usar escaneos de huellas dactilares en los dispositivos compatibles y verificar cuán reciente es la última autenticación del usuario al utilizar un mecanismo de desbloqueo de dispositivos (como una contraseña de pantalla de bloqueo).
95
96 Use estas API junto con el <a href="{@docRoot}training/articles/keystore.html">sistema Android Keystore</a>.
97</p>
98
99<h3 id="fingerprint-authentication">Autenticación por huellas dactilares</h3>
100
101<p>Para autenticar usuarios mediante el escaneo de huellas dactilares, obtenga una instancia de la nueva clase
102{@code android.hardware.fingerprint.FingerprintManager} y llame al método
103{@code FingerprintManager.authenticate()}. Su aplicación se debe ejecutar en un dispositivo compatible con un sensor de huellas dactilares.
104 Debe implementar la interfaz de usuario para el flujo de autenticación por huellas dactilares en su aplicación y debe utilizar el ícono de huella dactilar estándar de Android en la UI. El ícono de huella dactilar de Android ({@code c_fp_40px.png}) se incluye en la
105<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">aplicación de muestra</a>. Si está desarrollando múltiples aplicaciones que utilizan la autenticación por huellas dactilares, tenga en cuenta que cada aplicación debe autenticar la huella dactilar del usuario de manera independiente.
106
107
108
109</p>
110
111<p>Para utilizar esta característica en su aplicación, primero agregue el permiso {@code USE_FINGERPRINT} en su manifiesto.
112</p>
113
114<pre>
115&lt;uses-permission
116        android:name="android.permission.USE_FINGERPRINT" /&gt;
117</pre>
118
119<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" />
120
121<p>Para ver cómo una aplicación implementa la autenticación por huellas dactilares, consulte la sección
122<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">
123Ejemplo de diálogo de huella dactilar</a>.</p>
124
125<p>Si está evaluando esta característica, siga estos pasos:</p>
126<ol>
127<li>Instale la Revisión de herramientas del SDK de Android versión 24.3, si todavía no la instaló.</li>
128<li>Registre una huella dactilar nueva en el emulador; para hacerlo, vaya a
129<strong>Settings &gt; Security &gt; Fingerprint</strong>, luego siga las instrucciones de registro.</li>
130<li>Use un emulador para emular eventos táctiles de huellas dactilares con el siguiente comando.
131 Utilice el mismo comando para emular eventos táctiles de huellas dactilares en la pantalla de bloqueo o en su aplicación.
132
133<pre class="no-prettyprint">
134adb -e emu finger touch &lt;finger_id&gt;
135</pre>
136<p>En Windows, posiblemente tenga que ejecutar {@code telnet 127.0.0.1 &lt;emulator-id&gt;} seguido de
137  {@code finger touch &lt;finger_id&gt;}.
138</p>
139</li>
140</ol>
141
142<h3 id="confirm-credential">Confirmar credencial</h3>
143<p>Su aplicación puede autenticar usuarios según el tiempo que haya pasado desde que desbloquearon su dispositivo por última vez. Esta característica evita que los usuarios tengan que recordar contraseñas adicionales específicas de la aplicación y elimina la necesidad de que usted tenga que implementar su propia interfaz de usuario de autenticación.
144
145 Su aplicación debe utilizar esta característica junto con una implementación de clave pública o secreta para la autenticación del usuario.
146</p>
147
148<p>Para definir la duración del tiempo de espera en el que se puede volver a usar la misma clave después de que un usuario se haya autenticado correctamente, llame al nuevo método
149{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
150cuando configure {@link javax.crypto.KeyGenerator} o
151{@link java.security.KeyPairGenerator}.
152 Esta característica actualmente funciona para operaciones criptográficas simétricas.
153</p>
154
155<p>Evite mostrar el diálogo de nueva autenticación de forma excesiva: sus aplicaciones deben intentar utilizar el objeto criptográfico primero y, si se agota el tiempo de espera, deben usar el método
156{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()}
157para volver a autenticar el usuario dentro de su aplicación.
158
159</p>
160
161<p>Para ver cómo la aplicación implementa esta característica, consulte la sección
162<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">
163Ejemplo de cómo confirmar la credencial</a>.</p>
164
165<h2 id="direct-share">Compartir de forma directa</h2>
166
167<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" />
168
169<p>Esta versión preliminar le proporciona API para que la acción de compartir sea intuitiva y rápida para los usuarios. Ahora, puede definir <em>destinos para compartir de forma directa</em> que inician una actividad específica en su aplicación. Estos destinos para compartir de forma directa se exponen a los usuarios a través del menú <em>Share</em>.
170
171 Esta característica les permite a los usuarios compartir contenido con los destinos, como contactos, dentro de otras aplicaciones.
172 Por ejemplo, el destino para compartir de forma directa podría iniciar una actividad en otra aplicación de red social, lo que le permite al usuario compartir contenido directamente con una comunidad o un amigo específicos de esa aplicación.
173
174</p>
175
176<p>Para habilitar destinos para compartir de forma directa, debe definir una clase que extienda el
177{@code android.service.} <br>
178Clase {@code chooser.ChooserTargetService}. Declare su
179{@code ChooserTargetService} en el manifiesto. En esa declaración, especifique el permiso
180{@code BIND_CHOOSER_TARGET_SERVICE} y un filtro de intento con la acción
181{@code SERVICE_INTERFACE}.</p>
182<p>El ejemplo a continuación muestra de qué manera podría declarar {@code ChooserTargetService} en su manifiesto.
183</p>
184<pre>
185&lt;service android:name=".ChooserTargetService"
186        android:label="&#64;string/service_name"
187        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"&gt;
188    &lt;intent-filter&gt;
189        &lt;action android:name="android.service.chooser.ChooserTargetService" /&gt;
190    &lt;/intent-filter&gt;
191&lt;/service&gt;
192</pre>
193
194<p>Para cada actividad que desee exponer a {@code ChooserTargetService}, agregue un elemento
195{@code &lt;meta-data&gt;} con el nombre
196{@code "android.service.chooser.chooser_target_service"} en el manifiesto de su aplicación.
197</p>
198
199<pre>
200&lt;activity android:name=".MyShareActivity”
201        android:label="&#64;string/share_activity_label"&gt;
202    &lt;intent-filter>
203        &lt;action android:name="android.intent.action.SEND" /&gt;
204    &lt;/intent-filter>
205&lt;meta-data
206        android:name="android.service.chooser.chooser_target_service"
207        android:value=".ChooserTargetService" /&gt;
208&lt;/activity>
209</pre>
210
211<h2 id="voice-interactions">Interacciones de voz</h2>
212<p>
213Esta versión preliminar proporciona una nueva API de interacción de voz que, junto con las
214<a href="https://developers.google.com/voice-actions/" class="external-link">acciones de voz</a>,
215le permite compilar experiencias de conversaciones de voz en sus aplicaciones. Llame al método
216{@code android.app.Activity.isVoiceInteraction()} para determinar si su actividad se inició en respuesta a una acción de voz.
217 De ser así, su aplicación puede utilizar la clase
218{@code android.app.VoiceInteractor} para solicitar una confirmación de voz por parte del usuario, realizar una selección de una lista de opciones y mucho más.
219 Para obtener más información sobre cómo implementar acciones de voz, consulte el
220<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">sitio para desarrolladores de acciones de voz</a>.
221</p>
222
223<h2 id="assist">Asistencia de API</h2>
224<p>
225Esta versión preliminar ofrece una nueva manera para que los usuarios interactúen con sus aplicaciones a través de un asistente. Si desea utilizar esta característica, el usuario debe habilitar el asistente para utilizar el contexto actual.
226 Una vez habilitado, para invocar al asistente dentro de cualquier aplicación, el usuario debe mantener presionado el botón <strong>Home</strong>.
227</p>
228<p>Su aplicación puede optar por no compartir el contexto actual con el asistente al configurar la marca
229{@link android.view.WindowManager.LayoutParams#FLAG_SECURE}. Además del conjunto de información estándar que la plataforma le pasa al asistente, su aplicación puede compartir información adicional usando la nueva clase {@code android.app.Activity.AssistContent}.
230
231</p>
232
233<p>Para proporcionarle al asistente contexto adicional desde su aplicación, siga estos pasos:</p>
234
235<ol>
236<li>Implemente la interfaz {@link android.app.Application.OnProvideAssistDataListener}.</li>
237<li>Registre esta escucha usando
238{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}.</li>
239<li>Para proporcionar información contextual específica de la actividad, invalide la devolución de llamada
240{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
241y, opcionalmente, la nueva devolución de llamada {@code Activity.onProvideAssistContent()}.
242</ol>
243
244<h2 id="notifications">Notificaciones</h2>
245<p>Esta versión preliminar agrega los siguientes cambios de API para las notificaciones:</p>
246<ul>
247  <li>Nuevo nivel de filtro {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} que corresponde al nuevo modo ocupado <em>Solo alarmas</em>.
248</li>
249  <li>Nuevo valor de categoría {@code Notification.CATEGORY_REMINDER} que se utiliza para distinguir recordatorios programados por el usuario de otros eventos
250 ({@link android.app.Notification#CATEGORY_EVENT}) y alarmas
251 ({@link android.app.Notification#CATEGORY_ALARM}).
252</li>
253  <li>Nueva clase {@code android.graphics.drawable.Icon} que se puede adjuntar a sus notificaciones a través de los métodos {@code Notification.Builder.setSmallIcon(Icon)} y
254{@code Notification.Builder.setLargeIcon(Icon)}.
255</li>
256  <li>Nuevo método {@code NotificationManager.getActiveNotifications()} que permite que sus aplicaciones descubran qué notificaciones se encuentran actualmente activas.
257 Para ver una implementación de la aplicación que utilice esta característica, consulte la sección <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">Ejemplo de notificaciones activas</a>.
258</li>
259</ul>
260
261<h2 id="bluetooth-stylus">Compatibilidad del lápiz Bluetooth</h2>
262<p>Esta versión preliminar ofrece soporte mejorado para las entradas de usuarios que utilizan un lápiz Bluetooth. Los usuarios pueden sincronizar y conectar un lápiz Bluetooth compatible con su teléfono o tablet.
263  Mientras está conectado, la información de posición de la pantalla táctil se fusiona con la información de los botones y la presión del lápiz para proporcionar una mayor variedad de expresiones que al utilizar la pantalla táctil solamente.
264
265 Su aplicación puede obedecer cuando se presiona el botón del lápiz y cuando se realizan acciones secundarias al registrar las nuevas devoluciones de llamadas
266{@code View.onStylusButtonPressListener} y {@code GestureDetector.OnStylusButtonPressListener}
267en su actividad.
268</p>
269
270<p>Utilice las constantes y los métodos {@link android.view.MotionEvent} para detectar las interacciones del botón del lápiz:
271</p>
272<ul>
273<li>Si el usuario toca un lápiz con un botón en la pantalla de su aplicación, el método
274{@link android.view.MotionEvent#getToolType(int) getTooltype()} devuelve
275{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li>
276<li>Para las aplicaciones que tienen como destino la versión preliminar de Android M, el método
277{@link android.view.MotionEvent#getButtonState() getButtonState()}
278devuelve {@code MotionEvent.STYLUS_BUTTON_PRIMARY} cuando el usuario presiona el botón principal del lápiz.
279 Si el lápiz tiene un segundo botón, el mismo método devuelve
280{@code MotionEvent.STYLUS_BUTTON_SECONDARY} cuando el usuario lo presiona. Si el usuario presiona ambos botones simultáneamente, el método devuelve ambos valores juntos separados por “OR” ({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}).
281
282</li>
283<li>
284Para las aplicaciones que tienen como destino una versión anterior de la plataforma, el método
285{@link android.view.MotionEvent#getButtonState() getButtonState()} devuelve
286{@link android.view.MotionEvent#BUTTON_SECONDARY} (cuando se presiona el botón principal),
287{@link android.view.MotionEvent#BUTTON_TERTIARY} (cuando se presiona el botón secundario) o ambos.
288</li>
289</ul>
290
291<h2 id="ble-scanning">Exploración mejorada de Bluetooth de bajo consumo</h2>
292<p>
293Si su aplicación realiza exploraciones de Bluetooth de bajo consumo, puede utilizar el nuevo método
294{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} para especificar que usted desea que las devoluciones de llamadas se notifiquen solo cuando se encuentre por primera vez un paquete de anuncio que coincida con el conjunto
295{@link android.bluetooth.le.ScanFilter} y cuando no se vea durante un período determinado.
296
297 Este enfoque de exploración es más eficaz en cuanto al consumo de energía que la que se proporciona en la versión anterior de la plataforma.
298
299</p>
300
301<h2 id="hotspot">Soporte de Hotspot 2.0 versión 1</h2>
302<p>
303Esta versión preliminar agrega soporte para la especificación de Hotspot 2.0 versión 1 en los dispositivos Nexus 6 y Nexus 9. Para proveer credenciales de Hotspot 2.0 en su aplicación, use los métodos nuevos de la clase
304{@link android.net.wifi.WifiEnterpriseConfig}, como {@code setPlmn()} y
305{@code setRealm()}.
306 En el objeto {@link android.net.wifi.WifiConfiguration}, puede configurar los campos
307{@link android.net.wifi.WifiConfiguration#FQDN} y {@code providerFriendlyName}. La nueva propiedad {@code ScanResult.PasspointNetwork} indica si una red detectada representa un punto de acceso de Hotspot 2.0.
308
309
310</p>
311
312<h2 id="4K-display">Modo de pantalla 4K</h2>
313<p>Ahora, la plataforma permite que las aplicaciones soliciten que la resolución de pantalla se actualice a una representación 4K en el hardware compatible.
314 Para consultar la resolución física actual, use las nuevas API
315{@code android.view.Display.Mode}. Si la UI se establece en una resolución lógica más baja y se aumenta a una resolución física más alta, tenga en cuenta que la resolución física que devuelve el método
316{@code Display.Mode.getPhysicalWidth()} puede ser diferente de la resolución lógica informada por {@link android.view.Display#getSize(android.graphics.Point) getSize()}.
317
318</p>
319
320<p>Puede pedirle al sistema que cambie la resolución física en su aplicación mientras se ejecuta y, para ello, debe configurar la propiedad {@code WindowManager.LayoutParams.preferredDisplayModeId} de la ventana de su aplicación.
321  Esta característica resulta útil si desea cambiar a la resolución de pantalla 4K.
322 Mientras se encuentra en el modo de pantalla 4K, la UI se continúa representando en la resolución original (como 1080p) y se aumenta a 4K, pero los objetos
323{@link android.view.SurfaceView} pueden mostrar contenido en la resolución nativa.
324</p>
325
326<h2 id="behavior-themeable-colorstatelists">ColorStateLists para poder aplicar temas</h2>
327<p>Ahora, los atributos de tema se admiten en
328{@link android.content.res.ColorStateList} para los dispositivos que ejecutan la versión preliminar de Android M. Los métodos
329{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} y
330{@link android.content.res.Resources#getColor(int) getColor()} se dejaron de usar. Si desea llamar a estas API, en su lugar, llame a los métodos nuevos {@code Context.getColorStateList()} o
331{@code Context.getColor()}.
332 Estos métodos también se encuentran disponibles en la biblioteca AppCompat v4 vía {@link android.support.v4.content.ContextCompat}.
333</p>
334
335<h2 id="audio">Características de audio</h2>
336
337<p>Esta versión preliminar agrega mejoras al procesamiento de audio en Android, lo que incluye lo siguiente: </p>
338<ul>
339  <li>Soporte para el protocolo <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
340, con las nuevas API {@code android.media.midi}. Utilice estas API para enviar y recibir eventos MIDI.
341</li>
342  <li>Clases nuevas {@code android.media.AudioRecord.Builder} y {@code android.media.AudioTrack.Builder}
343 para crear capturas de audio digital y objetos de reproducción respectivamente, y configurar propiedades de receptores y fuentes de audio para invalidar los valores predeterminados del sistema.
344</li>
345  <li>Enlaces de API para asociar dispositivos de entrada y de audio. Esto resulta particularmente útil si su aplicación les permite a los usuarios iniciar una búsqueda por voz desde un controlador para juegos o un control remoto conectados a un TV con Android. El sistema invoca la nueva devolución de llamada {@code android.app.Activity.onSearchRequested()} cuando el usuario inicia una búsqueda.
346
347
348 Para determinar si el dispositivo de entrada del usuario tiene un micrófono incorporado, recupere el objeto {@link android.view.InputDevice} de esa devolución de llamada y luego llame al nuevo método
349{@code InputDevice.hasMic()}.
350</li>
351  <li>Nueva clase {@code android.media.AudioDevicesManager}, que le permite recuperar una lista de todos los dispositivos de audio receptores y fuente adjuntos.
352 También puede especificar un objeto
353{@code android.media.OnAudioDeviceConnectionListener} si desea que su aplicación reciba una notificación cuando se conecta o desconecta un dispositivo de audio.
354</li>
355</ul>
356
357<h2 id="video">Características de video</h2>
358<p>Esta versión preliminar agrega nuevas capacidades a las API de procesamiento de video, entre ellas, las siguientes:</p>
359<ul>
360<li>Nueva clase {@code android.media.MediaSync} que ayuda a las aplicaciones a representar de forma sincrónica transmisiones de audio y video.
361 Los búferes de audio se envían de manera que no generan bloqueo y regresan mediante una devolución de llamada.
362 Además, admite una velocidad de reproducción dinámica.
363</li>
364<li>Nuevo evento {@code MediaDrm.EVENT_SESSION_RECLAIMED}, que indica cuando una sesión abierta por la aplicación es reclamada por el administrador de recursos.
365 Si su aplicación utiliza sesiones DRM, debe controlar este evento y asegurarse de no utilizar una sesión reclamada.
366
367</li>
368<li>Nuevo código de error {@code MediaCodec.CodecException.ERROR_RECLAIMED}, que indica que el administrador de recursos reclamó el recurso multimedia utilizado por el códec.
369 Con esta excepción, se debe liberar el códec, ya que pasó al estado terminal.
370
371</li>
372<li>Nueva interfaz {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} para obtener una indicación de la cantidad máxima de instancias concurrentes de códec admitidas.
373
374</li>
375<li>Nuevo método {@code MediaPlayer.setPlaybackParams()} para configurar la velocidad de reproducción multimedia para reproducciones rápidas o lentas.
376 Además, alarga o acelera la reproducción de audio de forma automática junto con el video.
377</li>
378</ul>
379
380<h2 id="camera">Características de la cámara</h2>
381<p>Esta versión preliminar incluye las siguientes API nuevas para acceder a la luz de flash de la cámara y para el reprocesamiento de imágenes de la cámara:
382</p>
383
384<h3 id="flashlight">API para luz de flash</h3>
385<p>Si un dispositivo de cámara cuenta con una unidad de flash, puede llamar al método {@code CameraManager.setTorchMode()}
386para activar o desactivar el modo linterna de una unidad de flash sin abrir el dispositivo de cámara. La aplicación no tiene propiedad exclusiva de la unidad de flash ni del dispositivo de cámara.
387 El modo linterna se desactiva y deja de estar disponible cuando la cámara no se encuentra disponible o cuando otros recursos de la cámara que mantienen la linterna encendida dejan de estar disponibles.
388
389 Otras aplicaciones también pueden llamar a {@code setTorchMode()}
390para desactivar el modo linterna. Cuando se cierra la última aplicación que activó el modo linterna, este modo se desactiva.
391</p>
392
393<p>Si desea registrar una devolución de llamada para recibir una notificación sobre el estado del modo linterna, llame al método
394{@code CameraManager.registerTorchCallback()}. La primera vez que se registra la devolución de llamada, se llama inmediatamente con el estado del modo linterna de todos los dispositivos de cámara que se conocen actualmente y que tengan una unidad de flash.
395
396 Si el modo linterna se activa o desactiva correctamente, se invoca al método
397{@code CameraManager.TorchCallback.onTorchModeChanged()}.</p>
398
399<h3 id="reprocessing">API de reprocesamiento</h3>
400<p>La API {@link android.hardware.camera2 Camera2} se extiende para admitir el reprocesamiento de imágenes privadas de formato opaco y YUV.
401 Su aplicación determina si las capacidades de reprocesamiento se encuentran disponibles vía {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}.
402 Si un dispositivo admite el reprocesamiento, usted puede crear una sesión de captura de cámara reprocesable llamando a
403{@code CameraDevice.createReprocessableCaptureSession()} y puede crear solicitudes para el reprocesamiento de búferes de entrada.
404
405</p>
406
407<p>Utilice la clase {@code ImageWriter} para conectar el flujo del búfer de entrada a la entrada de reprocesamiento de la cámara.
408 Para obtener un búfer vacío, siga el modelo de programación que se indica a continuación:</p>
409
410<ol>
411<li>Llame al método {@code ImageWriter.dequeueInputImage()}.</li>
412<li>Complete los datos en el búfer de entrada.</li>
413<li>Envíe el búfer a la cámara llamando al método {@code ImageWriter.queueInputImage()}.</li>
414</ol>
415
416<p>Si está utilizando un objeto {@code ImageWriter} junto con una imagen
417{@code android.graphics.ImageFormat.PRIVATE}, su aplicación no puede acceder a los datos de la imagen de forma directa.
418 En cambio, pase la imagen {@code ImageFormat.PRIVATE} directamente a
419{@code ImageWriter} llamando al método {@code ImageWriter.queueInputImage()} sin ninguna copia del búfer.
420</p>
421
422<p>La clase {@code ImageReader} ahora admite secuencias de imagen de formato {@code android.graphics.ImageFormat.PRIVATE}.
423 Este soporte le permite que su aplicación mantenga una cola de imagen circular de imágenes de salida
424{@code ImageReader}, seleccione una o más imágenes y las envíe a
425{@code ImageWriter} para el reprocesamiento de la cámara.</p>
426
427<h2 id="afw">Características de Android for Work</h2>
428<p>Esta versión preliminar incluye las siguientes API nuevas para Android for Work:</p>
429<ul>
430  <li><strong>Controles mejorados para dispositivos corporativos de uso único:</strong> El propietario de dispositivo ahora puede controlar las configuraciones que se describen a continuación para mejorar la administración de los dispositivos corporativos de uso único (Corporate-Owned, Single-Use, COSU).
431
432
433  <ul>
434    <li>Deshabilitar o volver a habilitar la protección de seguridad con el método
435{@code DevicePolicyManager.setKeyguardEnabledState()}.</li>
436    <li>Deshabilitar o volver a habilitar la barra de estado (lo que incluye configuraciones rápidas, notificaciones y el gesto de navegación al deslizar el dedo hacia arriba para iniciar Google Now) con el método
437{@code DevicePolicyManager.setStatusBarEnabledState()}.
438</li>
439    <li>Deshabilitar o volver a habilitar el inicio seguro con la constante {@link android.os.UserManager}
440{@code DISALLOW_SAFE_BOOT}.</li>
441    <li>Evitar que se apague la pantalla mientras el dispositivo se encuentra conectado con la constante
442  {@link android.provider.Settings.Global} {@code STAY_ON_WHILE_PLUGGED_IN}.</li>
443  </ul>
444  </li>
445  <li><strong>Instalación y desinstalación automáticas de aplicaciones por parte del propietario de dispositivo:</strong> Un propietario de dispositivo ahora puede instalar y desinstalar aplicaciones de manera automática con las API {@link android.content.pm.PackageInstaller}
446, independiente de Google Play for Work.
447 Ahora, puede aprovisionar los dispositivos a través de un propietario de dispositivo que obtiene e instala aplicaciones sin interacción del usuario.
448 Esta característica es útil para habilitar el aprovisionamiento con un toque de quioscos u otros dispositivos similares sin activar una cuenta de Google.
449</li>
450<li><strong>Acceso automático al certificado de empresa:</strong> Ahora cuando una aplicación llama a
451{@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()}, antes de que se indique al usuario que seleccione un certificado, el propietario de dispositivo o perfil puede llamar al método {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} para proporcionar el alias de forma automática a la aplicación que realiza la solicitud.
452
453
454 Esta característica le permite conceder a las aplicaciones gestionadas acceso a certificados sin interacción del usuario.
455</li>
456<li><strong>Aceptación automática de actualizaciones del sistema:</strong> Al configurar una directiva de actualización del sistema con
457{@code DevicePolicyManager.setSystemUpdatePolicy()}, el propietario de dispositivo ahora puede aceptar automáticamente una actualización del sistema, por ejemplo, en el caso de un dispositivo de quiosco, o posponer la actualización y evitar que el usuario la ejecute durante un plazo de hasta 30 días.
458
459 Además, un administrador puede configurar un período de tiempo diario en el que se debe ejecutar una actualización, por ejemplo, durante las horas en que no se usa el dispositivo de quiosco.
460 Cuando hay una actualización del sistema disponible, el sistema verifica si la aplicación Work Policy Controller definió una directiva de actualización del sistema y se comporta según corresponda.
461
462
463</li>
464<li>
465<strong>Instalación delegada de certificados:</strong> Ahora, un propietario de dispositivo o perfil puede concederle a una aplicación de terceros la capacidad de llamar a estas API de administración de certificados {@link android.app.admin.DevicePolicyManager}:
466
467
468<ul>
469  <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
470getInstalledCaCerts()}</li>
471  <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
472hasCaCertInstalled()}</li>
473  <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
474installCaCert()}</li>
475  <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
476uninstallCaCert()}</li>
477  <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
478uninstallAllUserCaCerts()}</li>
479  <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
480installKeyPair()}</li>
481</ul>
482</li>
483<li><strong>Protección de restablecimiento de la configuración predeterminada de fábrica:</strong> Al aprovisionar a un propietario de dispositivo, ahora podrá configurar parámetros para desbloquear la protección de restablecimiento de la configuración predeterminada de fábrica (Factory Reset Protection, FRP) configurando el paquete
484{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS}.
485 Una aplicación de Programador NFC puede proporcionar estos parámetros después del restablecimiento de un dispositivo para desbloquear la FRP y aprovisionar al dispositivo sin requerir la cuenta de Google configurada previamente.
486
487 Si no modifica estos parámetros, la FRP se conserva y evita que el dispositivo se active sin las credenciales de Google activadas previamente.
488
489
490<p>Además, al configurar las restricciones de la aplicación en los servicios de Google Play, los propietarios de dispositivos pueden especificar cuentas de Google alternativas para desbloquear la FRP y reemplazar las que se encuentran activadas en el dispositivo.
491</p>
492</li>
493<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" />
494<li><strong>Seguimiento del uso de datos:</strong> Ahora, un propietario de dispositivo o perfil puede consultar las estadísticas de uso de datos que se pueden ver en <strong>Settings &gt; Data</strong> utilizando los nuevos métodos
495{@code android.app.usage.NetworkStatsManager}.
496 A los propietarios de perfiles se les concede automáticamente permiso para consultar los datos del perfil que administran, mientras que los propietarios de dispositivo obtienen acceso a los datos de uso del usuario principal administrado.
497
498</li>
499<li><strong>Administración de permisos de tiempo de ejecución:</strong>
500<p>Un propietario de dispositivo o perfil puede configurar una directiva de permisos para todas las solicitudes de tiempo de ejecución de todas las aplicaciones que utilizan
501{@code DevicePolicyManager.setPermissionPolicy()}, a fin de pedirle confirmación al usuario para conceder el permiso de manera normal, o bien, para conceder o negar el permiso automáticamente sin notificarlo.
502
503 Si se configura la última directiva, el usuario no puede modificar la selección realizada por el propietario de dispositivo o perfil dentro de la pantalla de permisos de la aplicación en <strong>Settings</strong>.
504
505</p></li>
506<li><strong>VPN en Settings:</strong> Las aplicaciones de la VPN (red privada virtual) ahora se pueden ver en
507<strong>Settings &gt; More &gt; VPN</strong>. Además, las notificaciones que acompañan el uso de la VPN ahora son específicas para la manera en que dicha VPN está configurada.
508
509 Para el propietario de perfil, las notificaciones son específicas dependiendo de si la VPN se configura para un perfil administrado, un perfil personal o ambos.
510 Para un propietario de dispositivo, las notificaciones son específicas dependiendo de si la VPN se configura para todo el dispositivo.
511</li>
512<li><strong>Notificación del estado del trabajo:</strong> Ahora aparecerá un ícono de maletín en la barra de estado siempre que una aplicación del perfil administrado tenga una actividad en primer plano.
513 Además, si el dispositivo se desbloquea directamente para la actividad de una aplicación del perfil administrado, se mostrará una notificación del sistema para informarle al usuario que se encuentra dentro del perfil de trabajo.
514
515
516</li>
517</ul>
518
519<p class="note">
520  Para obtener una vista detallada de todos los cambios de la API en M Developer Preview, consulte el <a href="{@docRoot}preview/download.html">Informe de diferencias de las API</a>.
521</p>
522