From 8f1f66f061843185fa79b757074374898851019f Mon Sep 17 00:00:00 2001
From: David Friedman Android N aún se encuentra en proceso activo de desarrollo, pero puedes probarlo
+ahora como parte de la N Developer Preview. En las secciones siguientes se destacan algunas de
+las nuevas funciones para desarrolladores.
+ Asegúrate de ver los Cambios de comportamiento para obtener información sobre
+ áreas en las cuales los cambios en las plataformas puedan tener efecto en tus aplicaciones, consultar las
+ guías del desarrollador para conocer mejor las funciones claves y descargar la Referencia de la API para obtener información sobre
+ API nuevas.
+ En Android N, presentamos una nueva y muy solicitada función multitarea
+en la plataforma: la compatibilidad con ventanas múltiples. Los usuarios ahora pueden abrir dos aplicaciones al mismo tiempo en la pantalla. En las tabletas, en particular, y en otros dispositivos de pantallas más grandes, la compatibilidad con ventanas múltiples
+ofrece nuevas maneras de captar a los usuarios. Puedes, incluso, habilitar acciones de arrastrar y soltar en
+tu aplicación para que los usuarios arrastren contenido hacia tu aplicación o desde ella; es una excelente
+manera de mejorar su experiencia. Es sencillo agregar compatibilidad con ventanas múltiples a tu aplicación y configurar la manera en que
+administra la visualización de estas ventanas. Por ejemplo, puedes especificar las dimensiones mínimas
+permitidas de tu actividad, y evitar así que los usuarios den a la actividad un tamaño inferior
+al que establecen estas. También puedes deshabilitar la visualización de ventanas múltiples para tu aplicación, lo cual
+ garantiza que en el sistema solo se muestre tu aplicación en el modo de pantalla completa.
+ Para obtener más información, consulta la documentación sobre Compatibilidad con ventanas múltiples
+para desarrolladores.
+ En Android N, hemos rediseñado las notificaciones para facilitar y agilizar su
+uso. Entre los cambios se incluyen los siguientes: Para obtener información acerca de cómo implementar las nuevas funciones, consulta la guía
+
+ Notificaciones. En Android N, agregamos un compilador “Just in Time” (JIT) con generación de perfiles de código para
+ART, lo cual le permite mejorar constantemente el rendimiento de las aplicaciones de Android mientras se
+ejecutan. El compilador JIT complementa al compilador “Ahead of Time” (AOT) actual de ART
+y permite mejorar el rendimiento del tiempo de ejecución, ahorrar espacio de almacenamiento y acelerar las actualizaciones
+de aplicaciones y del sistema. La compilación guiada por perfiles permite que ART maneje la compilación de AOT y JIT de cada aplicación
+conforme a su uso real, además de las condiciones en el dispositivo. Por
+ejemplo, conserva un perfil de los métodos directos de cada aplicación, y puede compilar previamente
+y almacenar en el caché dichos métodos para obtener el mejor rendimiento. A su vez, deja otras partes de la aplicación
+sin compilar hasta que se aplican verdaderamente. Además de mejorar el rendimiento de partes claves de la aplicación, la compilación guiada por
+perfiles permite reducir la superficie de memora RAM total de una aplicación, incluidos los archivos binarios
+asociados. Esta función tiene particular importancia en los dispositivos de memoria reducida. ART administra la compilación guiada por perfiles de una manera que minimiza el impacto sobre la batería
+del dispositivo. Realiza compilaciones previas únicamente cuando el dispositivo se encuentra inactivo y
+en proceso de carga, con lo cual permite ahorrar tiempo y batería al hacer el trabajo en forma anticipada. Uno de los beneficios más palpables del compilador JIT de ART es la velocidad de instalación de las
+aplicaciones y de actualización del sistema. Incluso las aplicaciones de mayor tamaño, en cuyos casos se necesitaban varios minutos para la
+optimización y la instalación en Android 6.0, ahora pueden instalarse en cuestión de
+segundos. Las actualizaciones del sistema también son más rápidas debido a que ya no hay paso de optimización. En Android 6.0 se presentó Doze, un modo de sistema que ahorra batería al aplazar
+actividades de CPU y red de las aplicaciones cuando el dispositivo se encuentra inactivo; por ejemplo, al hallarse
+sobre una mesa o en un cajón. Ahora, en Android N, el modo Doze ofrece el beneficio adicional de ahorrar batería en movimiento.
+Siempre que la pantalla permanezca apagada durante un tiempo y el dispositivo esté desenchufado,
+Doze aplicará un subconjunto de las restricciones de CPU y red conocidas a las aplicaciones.
+Esto significa que los usuarios pueden ahorrar batería aun cuando lleven sus dispositivos
+en los bolsillos. Poco tiempo después de que la pantalla se apaga, cuando el dispositivo no está enchufado, Doze
+restringe el acceso a la red y aplaza tareas y sincronizaciones. Durante períodos de mantenimiento
+breves, las aplicaciones tienen acceso a la red y se ejecutan todas sus
+tareas y sincronizaciones aplazadas. Al encenderse la pantalla o enchufarse el dispositivo se desactiva el modo
+Doze del dispositivo. Cuando el dispositivo vuelve a estar quieto, desenchufado y con la pantalla apagada durante un
+tiempo, Doze aplica todas las restricciones de CPU y redes en {@link
+android.os.PowerManager.WakeLock}, alarmas de {@link android.app.AlarmManager} y análisis de
+GPS o Wi-Fi. Las prácticas recomendadas para adaptar tu aplicación a Doze no varían si el
+dispositivo estará en movimiento o no. Por lo tanto, si ya actualizaste tu aplicación para que administre
+Doze en forma equilibrada, estarás listo. Si no lo hiciste, comienza a adaptarla
+a Doze ahora. Project Svelte representa un esfuerzo constante por minimizar el uso de memoria RAM a través del sistema y de las aplicaciones
+en los diferentes dispositivos Android del ecosistema. En Android N, el objetivo principal de Project
+Svelte es optimizar la manera en que las aplicaciones se ejecutan en segundo plano. El procesamiento en segundo plano es una parte esencial de la mayoría de las aplicaciones. Cuando se maneja en forma adecuada, puede
+hacer que la experiencia de tu usuario sea increíble (inmediata, rápida y pertinente al contexto).
+Cuando no se maneja de tal manera, el procesamiento en segundo plano puede suponer un consumo innecesario de memoria RAM (y
+batería), y afectar el rendimiento del sistema para otras aplicaciones. A partir de Android 5.0, {@link android.app.job.JobScheduler} ha sido el
+método preferido para ejecutar tareas en segundo plano con resultados positivos
+para los usuarios. Las aplicaciones pueden programar tareas y, al mismo tiempo, permitir que el sistema se optimice según las condiciones de
+memoria, energía y conectividad. JobScheduler ofrece control y
+simpleza, y nuestro deseo es que todas las aplicaciones lo usen.
+ Otra buena opción es
+ Continuaremos ampliando En Android N, eliminaremos tres difusiones implícitas que se usan normalmente (
+ {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
+ android.hardware.Camera#ACTION_NEW_PICTURE} y {@link
+ android.hardware.Camera#ACTION_NEW_VIDEO}), ya que pueden activar los
+procesos en segundo plano de varias aplicaciones al mismo tiempo, y así exigir la memoria y la batería. Si
+tu aplicación recibe estas difusiones, aprovecha la N Developer Preview y
+ realiza la migración a
+ Para obtener información detallada, consulta la documentación de Optimizaciones
+ en segundo plano.
+ Durante la vida útil de un dispositivo móvil, el costo de un plan de datos móviles normalmente
+superará el costo del propio dispositivo. Para muchos usuarios, los datos móviles son un
+recurso costoso que desean conservar. En Android N se presenta el modo de ahorro de datos, un nuevo servicio del sistema que permite reducir
+el uso de datos móviles de las aplicaciones, ya sea con servicio de itinerancia, cerca del final del ciclo de facturación
+o con un paquete de datos prepagos. El ahorro de datos permite que los usuarios controlen la manera en que las aplicaciones
+usan los datos móviles y que los desarrolladores brinden un servicio más eficaz cuando el ahorro
+de datos se encuentra activo. Cuando un usuario habilita el ahorro de datos en Settings y el dispositivo está
+conectado a una red de uso medido, el sistema bloquea el uso de datos en segundo plano y ordena a las aplicaciones
+usar menos datos en primer plano siempre que sea posible (por ejemplo, limitando
+la tasa de bits para la transmisión, reduciendo la calidad de la imagen y aplazando el valor optimista de almacenamiento previo en caché,
+entre otras posibilidades). Los usuarios pueden permitir que aplicaciones específicas habiliten el uso de datos medidos en segundo plano
+aun cuando esté activo el ahorro de datos. Android N extiende {@link android.net.ConnectivityManager} para que las aplicaciones
+tengan una manera de recuperar las
+preferencias de ahorro de datos del usuario y los monitor
+cambios en estas. Todas las aplicaciones deben verificar si el usuario habilitó el ahorro de
+datos e intentar limitar el uso de datos en primer y segundo plano. Quick Settings es una manera popular y simple de exhibir configuraciones y acciones claves
+directamente desde el panel de notificaciones. En Android N, expandimos el alcance de
+Quick Settings para que sea más útil y práctico. Agregamos más espacio para mosaicos adicionales de Quick Settings, a los cuales los usuarios pueden
+acceder desde un área de visualización paginada deslizando el dedo hacia la izquierda o la derecha. También permitimos
+que los usuarios determinen los mosaicos de Quick Settings que aparecerán y los puntos en los cuales
+se mostrarán; pueden agregar o mover mosaicos con solo arrastrarlos y soltarlos. Para los desarrolladores, en Android N también se agrega una nueva API que les permite definir mosaicos de
+ Quick Settings propios para facilitar, dentro de sus aplicaciones, el acceso a controles y acciones claves por parte de los usuarios.
+ Los mosaicos de Quick Settings se reservan para controles o acciones que se necesiten
+ con urgencia o se usen con frecuencia; no deben emplearse como accesos directos para
+ iniciar una aplicación.
+
+ Una vez que hayas definido tus mosaicos, puedes dejarlos a disposición de los usuarios, quienes tendrán la posibilidad de agregarlos
+ a Quick Settings con solo arrastrarlos y soltarlos.
+
+ Para obtener información sobre la creación de un mosaico de aplicación, consulta
+ Android N ahora admite el bloqueo de números en la plataforma y proporciona una API
+de framework para que los proveedores de servicios dispongan de una lista con números bloqueados. La
+aplicación de SMS predeterminada, la aplicación telefónica predeterminada y las aplicaciones de proveedores tienen capacidad de lectura y
+escritura en la lista de números bloqueados. Otras aplicaciones no pueden acceder a la lista. Al hacer que el bloqueo de números sea una función estándar de la plataforma, Android permite que las
+aplicaciones admitan de manera uniforme el bloqueo de números en una amplia variedad de
+dispositivos. Entre los demás beneficios que pueden aprovecharse en las aplicaciones, se encuentran los siguientes: De manera adicional, la integración de aplicaciones de proveedores a través de Android permite que estos
+lean la lista de números bloqueados del dispositivo y realicen un bloqueo de servicio
+para el usuario, a fin de evitar que el usuario reciba llamadas o mensajes de texto no deseados
+por cualquier medio, como terminales VOIP o teléfonos con transferencia de llamadas.
+ Para obtener más información, consulta
+ Android N permite que la aplicación predeterminada de un teléfono filtre las llamadas entrantes. La aplicación
+ hace esto a través del nuevo
+ Para obtener más información, consulta Android N permite a los usuarios seleccionar varias configuraciones regionales en Settings,
+para brindar una mejor compatibilidad con casos de uso de dos idiomas. Las aplicaciones pueden usar
+una nueva API para obtener las configuraciones regionales seleccionadas del usuario y luego ofrecer experiencias
+más sofisticadas para usuarios que usen varias configuraciones regionales; por ejemplo, pueden mostrar resultados de búsqueda en
+varios idiomas y no ofrecer traducciones de páginas web con idiomas que el
+usuario conozca. Además de la compatibilidad con varias configuraciones regionales, en Android N también se amplía la variedad de idiomas
+disponibles para los usuarios. Se ofrecen 25 variantes, cada una de ellas para idiomas de uso
+común, como el inglés, el español, el francés y el árabe. También se agrega compatibilidad
+parcial con más de 100 idiomas nuevos. Las aplicaciones pueden obtener la lista de configuraciones regionales establecida por el usuario llamando a Para obtener información sobre el nuevo comportamiento de resolución de recursos y las prácticas recomendadas que
+debes aplicar, consulta Compatibilidad con varios idiomas.
+ Android N ahora ofrece un subconjunto de API de ICU4J dentro del framework de Android, en el paquete
+
+ Para obtener más información sobre las API de ICU4J de Android, consulta Compatibilidad con ICU4J.
+ En Android N se agregan interfaces de framework y compatibilidad con plataformas para OpenGL ES 3.2, entre las que se incluye lo siguiente: En Android N, la API de framework para OpenGL ES 3.2 se proporciona con la clase
+ Para obtener información sobre el uso de OpenGL ES, incluida la manera de comprobar la
+versión de OpenGL ES que admite el dispositivo durante el tiempo de ejecución, consulta laguía de la API OpenGL ES. En Android N se agrega la capacidad de grabar y reproducir contenido de servicios
+de entrada de Android TV a través de las nuevas API de grabación. Aprovechando las mejoras existentes de las API time shifting
+, los servicios de entrada de TV pueden controlar los datos de canales que pueden grabarse y la manera
+en que se guardan las sesiones grabadas, y administrar la interacción del usuario con el contenido grabado. Para obtener más información, consulta API de grabación de Android TV. Android for Work suma muchas funciones y API nuevas para dispositivos con Android N.
+A continuación, se muestran algunos aspectos destacados. Para hallar una lista completa de actualizaciones de Android for Work
+relacionadas con Android N, consulta la sección de cambios en Android for Work.
+ Quienes posean perfiles pueden especificar una comprobación de seguridad separada para aplicaciones que se ejecuten en el
+ perfil de trabajo. La comprobación para perfiles de trabajo se muestra cuando un usuario intenta abrir
+ aplicaciones de trabajo. Cuando la comprobación de seguridad es exitosa, se desbloquea el
+ perfil de trabajo y se descifra si es necesario. Para quienes posean perfiles,
+
+ Quienes posean perfiles pueden establecer políticas de contraseñas diferentes
+ (por ejemplo, la extensión que debe tener el PIN o la posibilidad de usar una huella digital
+ para desbloquear el perfil) usando En dispositivos con perfil de trabajo, los usuarios pueden alternar el modo de trabajo. Cuando este último está
+inactivo, el usuario administrado queda deshabilitado temporalmente, con lo cual se desactivan las aplicaciones de perfiles
+de trabajo, la sincronización en segundo plano y las notificaciones. Esto incluye la aplicación del propietario del
+perfil. Cuando el modo de trabajo está inactivo, en el sistema se muestra un icono de estado persistente
+para recordar al usuario que no puede iniciar aplicaciones de trabajo. El lanzador
+indica que no es posible acceder a aplicaciones ni widgets de trabajo. Los propietarios de dispositivos y perfiles pueden asegurarse de que las aplicaciones de trabajo siempre se conecten
+a través de una VPN especificada. El sistema inicia dicha VPN en forma automática después del
+inicio del dispositivo.
+ Los nuevos métodos de Debido a que los servicios de VPN pueden enlazarse directamente a través del sistema sin interacción con
+aplicaciones, los clientes de VPN deben administrar nuevos puntos de entrada para Always on VPN. Al igual que
+antes, los servicios se indican al sistema con una clase
+ Los usuarios también pueden establecer clientes Always on VPN que implementen métodos
+ Android N ahora ofrece Vision Settings directamente en la pantalla de Bienvenida para la configuración de
+dispositivos nuevos. Esto permite a los usuarios descubrir y configurar de manera mucho más sencilla
+funciones de accesibilidad en sus dispositivos, como el gesto de ampliación, el tamaño
+de fuente, el tamaño de pantalla y TalkBack. Al tener estas funciones de accesibilidad una disposición más prominente, es más probable
+que tus usuarios prueben tu aplicación con ellas habilitadas. Asegúrate de probar tus aplicaciones
+en forma anticipada con esta configuración habilitada. Puedes activarla en Settings >
+Accessibility. Otra posibilidad en Android N: los servicios de accesibilidad ahora pueden asistir a los usuarios con discapacidades
+motoras para el uso de la pantalla. La nueva API permite crear servicios con
+funciones como el seguimiento de rostros u ojos y la exploración por puntos, entre otros, para satisfacer
+las necesidades de estos usuarios. Para obtener más información, consulta El inicio directo optimiza los tiempos de inicio del dispositivo y permite una funcionalidad
+limitada de las aplicaciones aun después de un reinicio inesperado.
+Por ejemplo, si un dispositivo cifrado se reinicia mientras el usuario duerme,
+este último puede continuar recibiendo en forma normal notificaciones de alarmas, llamadas entrantes y mensajes
+registrados. Esto también significa que los servicios de accesibilidad también pueden estar
+ disponibles de inmediato después de un reinicio. El inicio directo aprovecha el cifrado basado en archivos de Android N,
+a fin de habilitar políticas de cifrado específicas para datos del sistema y de aplicaciones.
+El sistema usa un depósito cifrado por el dispositivo para datos de sistema seleccionados y datos de aplicaciones
+explícitamente registrados. En forma predeterminada, se usa un depósito cifrado con credenciales para los
+ datos de sistema, los datos de usuario, las aplicaciones y los datos de aplicaciones restantes. Durante el inicio, el sistema se carga en un modo restringido con acceso únicamente
+a datos cifrados por el dispositivo y sin acceso general a aplicaciones o datos.
+Si hay componentes que deseas ejecutar en este modo, puedes registrarlos
+configurando un marcador en el manifiesto. Después del reinicio, el sistema activa
+componentes registrados transmitiendo la intención
+ Funciones claves para desarrolladores
+
+
+
+
Compatibilidad con ventanas múltiples
+
+
+
+
+
+Mejoras en las notificaciones
+
+
+
+
+Compilación de JIT y AOT guiada por perfiles
+
+Acceso rápido a la instalación de aplicaciones
+
+Doze en movimiento...
+
+Project Svelte: Optimizaciones en segundo plano
+
+GCMNetworkManager
, que forma parte de Google Play Services y
+ ofrece una capacidad similar de programación de tareas con compatibilidad en versiones heredadas de
+ Android.
+JobScheduler
y
+GCMNetworkManager
para que se apliquen a más
+casos de uso de tus aplicaciones; por ejemplo, en Android N ahora puedes programar procesos
+en segundo plano según los cambios de los proveedores de contenido. Al mismo tiempo, comenzaremos a
+dejar de usar algunos de los patrones anteriores que pueden reducir el rendimiento del sistema,
+en especial en dispositivos de memoria reducida.JobScheduler
y hacia las API relacionadas, como alternativa. Ahorro de datos
+
+API para Mosaico de Configuración rápida
+
+
+android.service.quicksettings.Tile
en la Referencia de la API descargable.
+Bloqueo de números
+
+
+
+
+android.provider.BlockedNumberContract
+ en la Referencia de la API
+ descargable.
+Filtración de llamadas
+
+CallScreeningService
,
+ que le permite realizar varias acciones según la clase
+ {@link android.telecom.Call.Details Call.Details} de la llamada entrante. Algunos ejemplos:
+
+
+
+android.telecom.CallScreeningService
+ en la Referencia de la API
+ descargable.
+Compatibilidad con varias configuraciones regionales y más idiomas
+
+
+LocaleList.GetDefault()
. A fin de admitir la cantidad ampliada de configuraciones regionales, en Android N se modificará la forma de
+resolver recursos. Asegúrate de controlar que tus aplicaciones
+funcionen de la manera esperada con la nueva lógica de resolución de recursos.API de ICU4J en Android
+
+android.icu
. La migración es sencilla y en mayor medida implica
+ simplemente un cambio del espacio de nombres com.java.icu
a
+ android.icu
. Si ya usas el paquete ICU4J en tus
+ aplicaciones, el cambio a las API de android.icu
en el framework de Android
+ puede reducir notablemente el tamaño del APK.
+API™ de OpenGL ES 3.2
+
+
+
+
+EXT_texture_sRGB_decode
;
+ GLES32
. Al usar OpenGL ES 3.2, asegúrate de declarar el
+requisito en tu archivo de manifiesto, con la etiqueta <uses-feature>
y el
+atributo android:glEsVersion
. Grabación de Android TV
+
+Android for Work
+
+Comprobación de seguridad para perfiles de trabajo
+
+ACTION_SET_NEW_PASSWORD
solicita al usuario establecer una comprobación de
+ trabajo y ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
le solicita
+ establecer un bloqueo de dispositivo.
+setPasswordQuality()
,
+ setPasswordMinimumLength()
y métodos relacionados. También
+ pueden establecer el bloqueo del dispositivo usando la instancia de DevicePolicyManager
+ devuelta por el nuevo método getParentProfileInstance()
.
+ Además, tiene la posibilidad de personalizar la pantalla de credenciales de la
+ comprobación de trabajo usando los nuevos métodos setOrganizationColor()
y
+ setOrganizationName()
.
+Desactivación del modo de trabajo
+
+Always on VPN
+
+DevicePolicyManager
son
+ setAlwaysOnVpnPackage()
y
+ getAlwaysOnVpnPackage()
.
+android.net.VpnService
de acción de coincidencia de filtro
+de intenciones. VPNService
en el usuario principal con
+ Settings>More>Vpn.
+Mejoras de accesibilidad
+
+android.accessibilityservice.GestureDescription
+ en la Referencia de la API descargable.Inicio directo
+
+LOCKED_BOOT_COMPLETED
. El sistema garantiza que estén disponibles los datos de aplicaciones cifrados por el dispositivo
+antes de la desactivación del bloqueo. No es posible acceder a los demás datos hasta que el usuario confirme sus credenciales de pantalla de
+ bloqueo para descifrarlos.
Los depósitos de claves guardados en hardware proporcionan un método mucho más seguro para crear, almacenar +y usar claves criptográficas en dispositivos Android. Protegen las claves contra funciones del kernel de +Linux, vulnerabilidades potenciales de Android y extracciones +de dispositivos con derechos de administrador.
+ +Para hacer más sencillo y seguro el uso de depósitos de claves guardados en hardware, +en Android N se presenta la atestación de claves. En las aplicaciones y en los servicios que no dependen de los dispositivos se puede usar la atestación +de claves para determinar fehacientemente el almacenamiento de un par de claves RSA o EC se +en hardware, las propiedades de dicho par y las + limitaciones aplicadas a su uso y validez.
+ +Los servicios que no dependen de los dispositivos y las aplicaciones pueden solicitar información acerca de un par de claves +a través de un certificado de atestación X.509 que debe firmarse con una clave de atestación +válida. La claves de atestación es una clave de firma ECDSA que se +inyecta en el depósito de claves guardado en hardware en la fábrica. +Por lo tanto, un certificado de atestación firmado con una clave de atestación +válida confirma la existencia de un depósito de claves guardado en hardware y de información detallada + sobre los pares de claves en dicho depósito de claves.
+ +Para asegurarse de que el dispositivo use una imagen segura y oficial de fábrica de +Android, la atestación de claves solicita que el bootloader +del dispositivo proporcione la siguiente información al entorno de ejecución +seguro (TEE):
+ +Para obtener más información sobre la función de depósitos de claves guardados en hardware, +consulta la guía deDepósito de clave guardado en hardware.
+ +Además de la atestación de claves, en Android N también se presentan + claves enlazadas a huellas digitales no revocadas en la inscripción con estas huellas.
+ +En Android N, las aplicaciones pueden personalizar el comportamiento de sus conexiones protegidas (HTTPS y TLS) +en forma segura, sin modificaciones en el código, a través de la +Configuración de seguridad de la red en lugar de las API +convencionales, propensas a generar errores (p. ej., X509TrustManager).
+ +Funciones admitidas:
+Para obtener más información, consulta Configuración de seguridad de +la red.
+ +De manera predeterminada, en las aplicaciones orientadas a Android N solo se consideran como confiables los certificados proporcionados por el sistema +y ya no se da esta misma consideración a las entidades de certificación (CA) añadidas por usuarios. En aquellas aplicaciones orientadas a Android +N para las cuales se desee considerar tales CA como válidas, se debe usar la +Configuración de seguridad de la red a fin de +especificar los términos de confianza de dichas CA.
+ +La clase PackageManager ahora admite la verificación de aplicaciones con el esquema +de firma de APK v2. Se trata de un esquema de firma de archivos completos +que agiliza considerablemente la verificación y refuerza las garantías de + integridad al detectar todos los cambios no autorizados en archivos APK.
+ +Para conservar la compatibilidad con versiones anteriores, se debe firmar un APK con el esquema de firma +v1 (esquema de firma JAR) antes de la firma con el esquema de firma v2. +Si se usa este último, la verificación experimenta errores cuando se firma el APK con un + certificado adicional después de la firma con el esquema v2.
+ +Se ofrecerá disponibilidad con el esquema de firma de APK v2 más adelante en la N Developer +Preview.
+ +En Android N, las aplicaciones pueden usar nuevas API para solicitar acceso a directorios dealmacenamiento
+externo específicos, incluidos los directorios de medios extraíbles, como las tarjetas
+SD. Las nuevas API simplifican enormemente la manera en que tu aplicación accede a directorios
+de almacenamiento externo estándares, como Pictures
. Las aplicaciones
+de fotografía pueden usar estas API en lugar de
+READ_EXTERNAL_STORAGE
, que otorga acceso a todos los directorios
+de almacenamiento, o del framework de acceso a almacenamiento, con el cual el usuario debe navegar hasta
+el directorio.
A su vez, las nuevas API simplifican los pasos que un usuario debe seguir para otorgar a tu aplicación acceso a almacenamiento +externo. Cuando se usan las nuevas API, el sistema emplea una IU de +permisos simple en la que se detallan claramente los directorios a los cuales +la aplicación solicita acceso.
+ +Para obtener más información, consulta la documentación sobre +Acceso +a directorios determinados para desarrolladores.
+ + + + + + diff --git a/docs/html-intl/intl/es/preview/behavior-changes.jd b/docs/html-intl/intl/es/preview/behavior-changes.jd new file mode 100644 index 000000000000..fdc85464df54 --- /dev/null +++ b/docs/html-intl/intl/es/preview/behavior-changes.jd @@ -0,0 +1,480 @@ +page.title=Cambios en los comportamientos +page.keywords=preview,sdk,compatibility +meta.tags=“preview”, “compatibilidad” +page.tags="preview", "developer preview" +page.image=images/cards/card-n-changes_2x.png +@jd:body + + ++ Además de nuevas funciones y capacidades, en Android N + se incluyen varios cambios en el comportamiento del sistema y de las API. En este documento + se destacan algunos de los cambios principales que debes comprender y tener en cuenta + en tus aplicaciones. +
+ ++ Si publicaste anteriormente una aplicación para Android, ten en cuenta que tu aplicación + podría verse afectada por estos cambios en la plataforma. +
+ + ++ Android N contiene cambios en el comportamiento del sistema destinados a lograr mejoras en la duración + de las baterías de los dispositivos, el uso de la memoria RAM y el rendimiento de las aplicaciones. Estos cambios pueden tener efecto en la + disponibilidad de recursos y notificaciones de sistema para tu aplicación. Debes + revisar estos cambios y evaluar las posibles formas en que tu aplicación deba adecuarse a + ellas. +
+ ++ Doze, presentado en Android 6.0 (nivel de API 23), prolonga la duración de la batería + aplazando actividades de CPU y red cuando un usuario deja un dispositivo desenchufado, + quieto y con la pantalla apagada. En Android N se ofrecen más + mejoras para Doze a través de la aplicación de un subconjunto de restricciones de CPU y red + mientras el dispositivo se encuentra desenchufado y con la pantalla apagada, aunque no necesariamente + quieto; por ejemplo, al ir dentro del bolsillo de un usuario en movimiento. +
+ + + + + ++ Cuando un dispositivo funciona con la batería y la pantalla permanece apagada durante un tiempo + determinado, se activa en este el modo Doze y se aplica el primer subconjunto de restricciones: se desactiva + el acceso de las aplicaciones a la red y se aplazan tareas y sincronizaciones. Si el dispositivo + permanece quieto durante un tiempo determinado tras activarse el modo Doze, el sistema aplica el + resto de las restricciones del modo a alarmas de {@link android.os.PowerManager.WakeLock}, + {@link android.app.AlarmManager} y análisis de GPS o Wi-Fi. Independientemente de que + se apliquen algunas o todas las restricciones del modo Doze, el sistema activa el + dispositivo durante plazos de mantenimiento breves en los cuales las aplicaciones tienen + acceso a la red y pueden ejecutar sincronizaciones o procesos aplazados. +
+ + + + + ++ Ten en cuenta que cuando se activar la pantalla o se enchufa el dispositivo se desactiva el modo Doze y + se retiran estas restricciones de procesamiento. El comportamiento adicional no + tiene efecto sobre las recomendaciones ni las prácticas recomendadas para adaptar tu aplicación a la versión + anterior de Doze, presentada en Android 6.0 (nivel de API 23), según lo descrito en + + Optimización para Doze y App Standby. De todos modos, debes + seguir las recomendaciones; por ejemplo, la de usar Google Cloud Messaging (GCM) para + enviar y recibir mensajes, y la de planificar actualizaciones para considerar + el comportamiento adicional de Doze. +
+ + ++ En Android N se eliminan tres difusiones implícitas para optimizar el uso de la + memoria y el consumo de energía. Este cambio es necesario porque las difusiones + implícitas a menudo inician aplicaciones que se registran para realizar un seguimiento de ellas en + segundo plano. La eliminación de estas difusiones puede mejorar sustancialmente el rendimiento + del dispositivo y la experiencia del usuario. +
+ ++ Los dispositivos móviles están sujetos a cambios de conectividad frecuentes + entre los modos de datos Wi-Fi y móviles. Actualmente, las aplicaciones pueden realizar controles en busca de cambios en la + conectividad registrando un receptor para la difusión implícita {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} en su + manifiesto. Debido a que muchas aplicaciones se registran para recibir esta difusión, un cambio de + red puede hacer que todas se activen y procesen la difusión a la + vez. +
+ ++ Asimismo, las aplicaciones pueden registrarse para recibir las difusiones implícitas {@link + android.hardware.Camera#ACTION_NEW_PICTURE} y {@link + android.hardware.Camera#ACTION_NEW_VIDEO} de otras aplicaciones, como la + cámara. Cuando un usuario toma una foto con la aplicación de la cámara, estas aplicaciones se activan + para procesar la difusión. +
+ ++ Para corregir estos problemas, en Android N se aplican las siguientes + optimizaciones: +
+ ++ En versiones futuras de Android, es posible que dejen de usarse más difusiones implícitas y + servicios en segundo plano no asociados. Por esta razón, debes evitar dependencias en receptores declarados en manifiestos para difusiones implícitas o + eliminarlas de ellos, + y aplicar lo mismo a los servicios en segundo plano. +
+ ++ El framework de Android proporciona varias soluciones para reducir la necesidad de + difusiones implícitas o servicios en segundo plano. Por ejemplo, la API de {@link + android.app.job.JobScheduler} proporciona un mecanismo sólido para programar + operaciones de red cuando se cumplen condiciones especificadas, como la conexión a una red + de uso no medido. Puedes incluso usar {@link + android.app.job.JobScheduler} para responder a cambios de los proveedores de contenido. +
+ ++ Para obtener más información sobre este cambio en el comportamiento y la manera de adaptar tu aplicación, + consulta Optimizaciones + en segundo plano. +
+ + ++ En Android N se incorporan cambios en permisos que pueden tener efecto en tu aplicación. + Se incluyen cambios en permisos de cuentas de usuarios y un nuevo permiso para operaciones de escritura en + dispositivos de almacenamiento externo. A continuación, se ofrece un resumen de los permisos que se modificaron en + la muestra: +
+ ++ El permiso GET_ACCOUNTS ha quedado en desuso. El sistema ignora este + permiso para las aplicaciones orientadas a Android N. +
++ En Android N se incluyen cambios destinados a mejorar la utilidad de la + plataforma para usuarios con defectos o discapacidades visuales. Estos cambios + generalmente no exigirán modificaciones en el código de tu aplicación. Sin embargo, debes revisar + estas funciones y probarlas con tu aplicación para avaluar el posible impacto en la experiencia + del usuario. +
+ + ++ Android N permite a los usuarios configurar Display size, el ajuste que expande + o contrae todos los elementos de la pantalla lo cual mejora la accesibilidad al dispositivo + para usuarios con poca visión. Estos no podrán superar el valor de zoom mínimo de zoom de + + sw320dp para el ancho de pantalla, que es el ancho de un Nexus 4, un teléfono común de tamaño intermedio. +
+ ++ Al cambiar la densidad del dispositivo, el sistema notifica a las aplicaciones de las + siguientes maneras: +
+ ++ En la mayoría de las aplicaciones no se necesitan cambios para admitir esta función, ya que + en ellas rigen prácticas recomendadas de Android. Verificaciones específicas que deben realizarse: +
+ +sw320dp
+ y asegúrate de que funcione bien.
+ + Nota: Si almacenaste en caché datos que dependen de la configuración, te + convendrá incluir metadatos relacionados, como el tamaño de pantalla + correspondiente o la densidad de píxeles para dichos datos. Guardar estos metadatos de permite + decidir si necesitas actualizar los datos almacenados en caché después de un cambio en la + configuración. +
+dp
) independientes de la densidad.
+ + Vision Settings se incluye en la pantalla de Bienvenida de Android N, en la cual los usuarios pueden + pueden configurar los siguientes ajustes de accesibilidad para un nuevo dispositivo: + Magnification gesture, Font size, + Display size y TalkBack. Este cambio + aumenta la visibilidad de errores relacionados con diferentes ajustes de pantalla. Para + evaluar el impacto de esta función, debes probar tus aplicaciones con estos + ajustes habilitados. Puedes encontrarlos en Settings > + Accessibility. +
+ ++ En Android N, se incluyen cambios en el espacio de nombres a fin de evitar la carga de API no públicas. + Si usas el NDK, solo debes emplear API públicas de la plataforma de + Android. El uso de API no públicas en la próxima versión oficial de Android + puede hacer que tu aplicación se bloquee. +
+ ++ Con el propósito de alertarte sobre el uso de API no públicas, las aplicaciones que funcionen en un dispositivo con + Android N producirán un error de salida de logcat cuando una de ellas llame a una API no pública. + Este error también aparecerá en la pantalla del dispositivo con forma de mensaje para + generar conciencia respecto de la situación. Debes revisar el código de tu aplicación para + eliminar el uso de API de plataforma no públicas y probar por completo tus aplicaciones con + un dispositivo de prueba o emulador. +
+ +
+ Si tu aplicación depende de bibliotecas de plataformas, consulta la documentación sobre NDK para hallar
+ soluciones típicas para el reemplazo de API privadas comunes por API equivalentes.
+ También es posible que establezcas vínculos con bibliotecas de plataformas sin notarlo,
+ en especial si tu aplicación usa una biblioteca que forma parte de la plataforma (como
+ libpng
), pero no del NDK. En ese caso, asegúrate de que
+ tu APK contenga todos los archivos .so con los cuales intentaste establecer vínculos.
+
+ Precaución: Algunas bibliotecas de terceros pueden establecer vínculos con API + no públicas. Si tu aplicación usa estas bibliotecas, es probable que se bloquee al ejecutarse + en la próxima versión oficial de Android. +
+ ++ Las aplicaciones no deben depender de bibliotecas nativas no incluidas en el NDK + ni usarlas, ya que pueden modificarse o eliminarse en la transición de una versión de Android a + otra. El cambio de OpenSSL a BoringSSL es un ejemplo de modificaciones como esta. + A su vez, los diferentes dispositivos pueden ofrecer distintos niveles de compatibilidad debido a que + no existen requisitos de compatibilidad para bibliotecas de plataformas no incluidas + en el NDK. Si debes acceder a bibliotecas no relacionadas en dispositivos anteriores, haz que la + carga dependa del nivel de la Android API. +
+ ++ Para ayudarte a diagnosticar estos tipos de problemas, a continuación se ofrecen ejemplos de errores de Java y + NDK que podrías hallar al intentar crear tu aplicación con Android N: +
+ +Ejemplo de error de Java:
++java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" + is not accessible for the namespace "classloader-namespace" ++ +
Ejemplo de error de NDK:
++dlopen failed: cannot locate symbol "__system_property_get" referenced by ... ++ + +
+ Aquí se ofrecen soluciones típicas para aplicaciones en las que se produzcan estos tipos de errores: +
+ ++AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> +AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or +JavaVM::AttachCurrentThread from <jni.h>. ++
+#include <sys/system_properties.h> ++
+ Android N contiene cambios para aplicaciones orientadas a Android for Work, entre los que se incluyen + modificaciones en la instalación de certificados, el restablecimiento de contraseñas, la gestión de usuarios + secundarios y el acceso a identificadores de dispositivos. Si planeas crear aplicaciones para entornos de + Android for Work, debes repasar estos cambios y modificar + tu aplicación de manera correspondiente. +
+ +DevicePolicyManager.setCertInstallerPackage()
. Si el instalador
+ no está instalado de antemano, el sistema emite una
+ IllegalArgumentException
.
+ DevicePolicyManager.resetPassword()
para borrar contraseñas ni modificar
+ las que ya están establecidas. No obstante, pueden establecer una contraseña, aunque solo
+ cuando el dispositivo no tiene contraseña, PIN ni patrón.
+ DISALLOW_MODIFY_ACCOUNTS
para el usuario.
+ DISALLOW_ADD_USER
+ en forma automática. Esto evita que los usuarios creen usuarios secundarios no
+ administrados. A su vez, los métodos CreateUser()
y
+ createAndInitial()
han quedado en desuso; los reemplaza el nuevo método
+ DevicePolicyManager.createAndManageUser()
.
+ DevicePolicyManagewr.getWifiMacAddress()
. Si nunca se habilitó la función Wi-Fi
+ en el dispositivo, este método devuelve un valor {@code null}.
+ + Para obtener más información sobre los cambios de Android for Work en Android N, consulta + Actualizaciones de Android for Work. +
+ ++Debes probar tu aplicación para controlar que no tenga lugar +este comportamiento. +Puedes hacerlo produciendo un error idéntico +al finalizarla manualmente a través del panel DDMS. +
+ ++Las aplicaciones orientadas a Android N y versiones posteriores no finalizarán automáticamente por cambios en la densidad; +sin embargo, es posible que respondan en forma deficiente a los cambios en la configuración. +
++ Para ejecutar y probar tu aplicación en la plataforma nueva necesitas configurar el tiempo de ejecución de Android N + . Puedes realizar eso de las siguientes maneras: +
+ ++ Si deseas un entorno para realizarle pruebas básicas de compatibilidad a tu aplicación en la plataforma nueva + , todo lo que necesitas es tu actual APK y un dispositivo de hardware o + emulador. No necesitas actualizar todo tu entorno de desarrollo + para realizar pruebas básicas. +
+ ++ Si deseas modificar tu aplicación para seleccionar como destino Android N o usar las API nuevas de Android N, + debes configurar un entorno de desarrollo que esté actualizado para que admita + Android N. En Configuración para el desarrollo de + Android N se ofrece información detallada. +
+ + ++ En la N Developer Preview se ofrecen actualizaciones del sistema para una variedad de dispositivos de hardware +que puedes usar para realizarle pruebas a tu aplicación, desde teléfonos hasta tablets y TV. +
+ ++ Si tienes acceso a un dispositivo compatible, puedes actualizarlo a una versión "milestone" de la Developer Preview + de las siguientes maneras: +
+ ++ Si tienes acceso a un dispositivo compatible (consulta la lista en la tabla de descargas + ), puedes recibir actualizaciones inalámbricas para mostrar versiones de Android + registrando el dispositivo en el Programa de Android beta. Estas actualizaciones + se descargan de manera automática y actualizarán tu dispositivo como otras + actualizaciones oficiales del sistema. +
+ ++ Puedes dar de baja el registro de un dispositivo en cualquier momento. El dispositivo recibirá una actualización OTA + para la versión de producción más reciente de Android que se encuentre disponible para ese dispositivo + (por ejemplo, Android 6.0 Marshmallow). La actualización requiere un restablecimiento completo del dispositivo + , entonces se quitarán los datos del usuario en el dispositivo. Asegúrate de realizar una + copia de seguridad de los datos importantes antes de dar de baja un dispositivo. +
+ ++ Para obtener más información y para registrar tu dispositivo, consulta + el sitio web del Programa de Android beta . +
+ +Nota: + Dar de baja el registro requiere un restablecimiento completo del dispositivo. Realice una copia de seguridad de los + datos importantes primero. +
+ ++ En cualquier momento, puedes descargar las últimas imágenes de sistema de la Developer Preview y + puedes actualizarlas manualmente en tu dispositivo. Consulta la siguiente tabla para descargar la imagen de + sistema para tu dispositivo de prueba. La actualización manual de un dispositivo es útil si necesitas + un control preciso del entorno de prueba o necesitas reinstalar con frecuencia, + como en pruebas automatizadas. +
+ ++ El proceso de instalación de una imagen de sistema en un dispositivo elimina todos los datos del + dispositivo, por lo tanto, deberás hacer una copia de seguridad de los datos en primer lugar. +
+ ++ Después de que realices una copia de seguridad y que descargues la siguiente imagen de sistema que + se adecua a tu dispositivo, sigue las instrucciones que se describen en developers.google.com/android + para actualizar la imagen en tu dispositivo. +
+ ++ Las imágenes de sistema actualizadas de manera manual no + reciben actualizaciones OTA de manera automática para posteriores "milestone" + de la Developer Preview. Asegúrate de mantener tu entorno actualizado y actualiza una + nueva imagen de sistema en cada "milestone" de la Developer Preview. +
+ ++ Si decides que quieres obtener actualizaciones OTA después de actualizar de manera manual un dispositivo, + lo único que debes hacer es registrar el dispositivo en el Programa + de Android beta. Puedes registrar el dispositivo en cualquier momento para recibir la siguiente actualización de la Preview + vía inalámbrica. +
+ +Dispositivo | +Descarga/sumas de comprobación | +
---|---|
Nexus 5X “bullhead” |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 “shamu” |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P “angler” |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 “volantis” |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G “volantisg” |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player “fugu” |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C “ryu” |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
4G móviles en general (Android One) “seed” |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ Si quieres desinstalar la Preview de un dispositivo, puedes hacerlo de las + siguientes maneras:
++ El dispositivo recibirá una actualización OTA para la versión de producción más reciente + de Android que se encuentre disponible para ese dispositivo (por ejemplo, Android 6.0 Marshmallow). + La actualización requiere un restablecimiento completo del dispositivo, entonces se quitarán + los datos del usuario en el dispositivo. Asegúrate de realizar una copia de seguridad de los datos importantes antes + de dar de baja un dispositivo. +
+Nota: + Desinstalar una imagen de sistema de la Developer Preview antes + del final del programa requiere un restablecimiento completo del dispositivo y elimina todos los datos del usuario + en el dispositivo. +
+ + +Para usar el emulador de Android para la ejecución de la Android N Preview, necesitas +descargar Android N Preview SDK y crear un dispositivo virtual para el +emulador.
+ +Primero, descarga Android N Preview SDK de la siguiente manera (si +ya lo obtuviste durante la configuración +para desarrollar Android N, puedes omitir esta parte): + +
Ahora debes tener Android SDK Built-Tools 24.0 0 rc1, +Platform-Tools 24.0.0 rc1, y SDK Tools +25.0.9. Si no actualizas las SDK Tools a 25.0.9, luego no podrás +ejecutar las imágenes de sistema x86_64 para Android N.
+ + +Ahora crea un dispositivo virtual con la imagen de sistema de Android N:
+ +Ahora puedes lanzar el emulador de Android con el AVD de la Android N Preview.
+ ++A fin de garantizar la mejor experiencia en el emulador de Android, instala la +Android Studio 2.1 Preview, que admite el emulador Android 2.0 Beta +con mayor rendimiento en comparación con el emulador en +Android Studio 1.5.
+ +Nota: + Si actualmente estás usando Android Studio 2.0 Beta, existe un problema conocido + que no te permite crear AVD con las imágenes de sistema de la N Preview; + por el momento necesitas usar la muestra de Android Studio 2.1 para crear AVD. +
+ +Para obtener más información sobre la creación de dispositivos virtuales, consulte la Administración de dispositivos virtuales. +
+ + + + + + + + + + + + + + ++ Los procesos en segundo plano pueden consumir mucha memoria y batería. Por ejemplo, una + difusión implícita puede iniciar muchos procesos en segundo plano registrados para + escucharla, aunque esos procesos quizá no desempeñen un trabajo considerable. Esto puede + afectar de forma significativa tanto el rendimiento del dispositivo como la experiencia de usuario. +
+ ++ Para atenuar este problema, la N Developer Preview aplica las siguientes + restricciones: +
+ ++ El framework de Android ofrece varias soluciones para mitigar la necesidad de + estas difusiones implícitas. Por ejemplo, {@link android.app.job.JobScheduler} + y + {@code GcmNetworkManager} proporcionan mecanismos sólidos para programar operaciones + de red cuando se cumplen las condiciones especificadas, como una conexión a una + red de uso no medido. Ahora también puedes usar {@link android.app.job.JobScheduler} + para reaccionar a cambios en relación con los proveedores de contenido. Los objetos {@link android.app.job.JobInfo} + encapsulan los parámetros que usa {@link android.app.job.JobScheduler} + para programar el trabajo. Cuando se cumplen las condiciones del trabajo, el sistema + ejecuta ese trabajo en el {@link android.app.job.JobService} de tu aplicación. +
+ ++ En este documento, aprenderemos cómo usar métodos alternativos, como + {@link android.app.job.JobScheduler}, para adaptar tu aplicación a esas nuevas + restricciones. +
+ ++ Las aplicaciones orientadas a la N Developer Preview no reciben difusiones {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} si en su + manifiesto registran que las reciben, y los procesos dependen de que + no se inicie esa difusión. Esto podría ser un problema para aplicaciones que buscan + escuchar los cambios en la red o realizar múltiples actividades en red cuando el + dispositivo se conecta a una red sin medición de uso. Ya existen varias soluciones + en relación con esta restricción en el framework de Android, pero elegir + la correcta depende de lo que quieras lograr con tu aplicación. +
+ ++ Nota: Un {@link android.content.BroadcastReceiver} registrado con + {@link android.content.Context#registerReceiver Context.registerReceiver()} + continúa recibiendo esas difusiones mientras la aplicación está en segundo plano. +
+ ++ Cuando uses la clase {@link android.app.job.JobInfo.Builder JobInfo.Builder} + para crear tu objeto {@link android.app.job.JobInfo}, aplica el método {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} y pasa {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} como parámetro de trabajo. El siguiente ejemplo de código + programa la ejecución de un servicio cuando el dispositivo se conecta a una red sin + medición de uso y se está cargando: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ Cuando se cumplan las condiciones para tu trabajo, tu aplicación recibirá un callback para ejecutar + el método {@link android.app.job.JobService#onStartJob onStartJob()} en la + {@code JobService.class} especificada. Para ver más ejemplos de la implementación de {@link + android.app.job.JobScheduler}, consulta la aplicación de ejemplo JobScheduler. +
+ ++ Las aplicaciones que usan servicios de GMSCore y están orientadas a Android 5.0 (API nivel 21) + o anterior, pueden usar + {@code GcmNetworkManager} y especificar {@code Task.NETWORK_STATE_UNMETERED}. +
+ ++ Las aplicaciones que se ejecutan en segundo plano aún pueden escuchar {@code + CONNECTIVITY_CHANGE} con un {@link + android.content.BroadcastReceiver} registrado. No obstante, la API {@link + android.net.ConnectivityManager} ofrece un método más robusto para solicitar + un callback solo cuando se cumplen las condiciones de red especificadas. +
+ ++ Los objetos {@link android.net.NetworkRequest} definen los parámetros del + callback de la red en términos de {@link android.net.NetworkCapabilities}. Creas + objetos {@link android.net.NetworkRequest} con la clase {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} + y luego pasa el objeto {@link android.net.NetworkRequest} al sistema. Cuando + se cumplen las condiciones de la red, la aplicación recibe un callback para ejecutar el método + {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} definido en su clase {@link + android.net.ConnectivityManager.NetworkCallback}. +
+ ++ La aplicación continuará recibiendo callbacks hasta que la aplicación salga o llame a + {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()}. +
+ ++ En la N Developer Preview, las aplicaciones no pueden enviar ni recibir difusiones {@link + android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link + android.hardware.Camera#ACTION_NEW_VIDEO}. Esta restricción ayuda a + aliviar el impacto en el rendimiento y la experiencia de usuario cuando varias aplicaciones deben + activarse para procesar una nueva imagen o video. La N Developer Preview + extiende {@link android.app.job.JobInfo} y {@link + android.app.job.JobParameters} para proporcionar una solución alternativa. +
+ ++ Para activar trabajos en los cambios del URI de contenido, la N Developer Preview amplía + la API {@link android.app.job.JobInfo} con los siguientes métodos: +
+ ++ Nota: no se puede usar {@code TriggerContentUri()} junto + con {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} ni {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()}. Para controlar de forma constante la presencia de cambios, programa un nuevo + {@link android.app.job.JobInfo} antes de que el {@link + android.app.job.JobService} de la aplicación termine de administrar la callback más reciente. +
+ ++ El siguiente código de ejemplo programa la activación de un trabajo cuando el sistema informe + un cambio en el URI de contenido, {@code MEDIA_URI}: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ Cuando el sistema informa un cambio en el(los) URI de contenido especificado(s), tu aplicación + recibe un callback y se pasa un objeto {@link android.app.job.JobParameters} + al método {@link android.app.job.JobService#onStartJob onStartJob()} + en {@code MediaContentJob.class}. +
+ ++ La N Developer Preview también amplía {@link android.app.job.JobParameters} para + permitir que tu aplicación reciba información útil sobre qué autoridades de contenido + y URI activaron el trabajo: +
+ ++ El siguiente código de ejemplo anula el método {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} y + registra las autoridades de contenido y los URI que activaron el trabajo: +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ Optimizar tus aplicaciones para que se ejecuten en dispositivos con poca memoria o en condiciones de niveles bajos + de memoria puede mejorar el rendimiento y la experiencia del usuario. Eliminar + dependencias en servicios en segundo plano y receptores de difusiones implícitas + registrados estadísticamente puede ayudar a que tu aplicación se ejecute mejor en esos dispositivos. Si bien + la N Developer Preview toma medidas para reducir algunos de esos problemas, te + recomendamos que optimices tu aplicación para que pueda ejecutarse sin utilizar esos + procesos en segundo plano. +
+ ++ La N Developer Preview presenta algunos comandos adicionales de Puente de Depuración Android (en inglés, Android Debug Bridge, ADB) que + puedes usar para probar el comportamiento de la aplicación con esos procesos en segundo plano deshabilitados: +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N se ejecuta en un modo de arranque directo seguro +cuando el dispositivo se enciende pero el usuario no lo ha +desbloqueado. Para permitir esto, el sistema brinda dos ubicaciones de almacenamiento para los datos:
+ +De forma predeterminada, las aplicaciones no se ejecutan durante el modo de arranque directo. +Si necesita que su aplicación se ejecute durante el modo de arranque directo, puede registrar +los componentes de la aplicación que deberían ejecutarse durante este modo. Algunos casos comunes de +aplicaciones que necesitan ejecutarse durante el modo de arranque directo incluyen los siguientes:
+ +Si necesita que su aplicación acceda a datos mientras se ejecuta el modo de arranque directo, use +el almacenamiento cifrado por dispositivo. Este tipo de almacenamiento contiene datos +cifrados con una clave que solo está disponible luego de que el dispositivo haya realizado un inicio +verificado correctamente.
+ +Para los datos que se deben cifrar con una clave asociada con credenciales del +usuario, como un PIN o una contraseña, use el almacenamiento cifrado por credencial. +Este tipo de almacenamiento solo está disponible luego de que el usuario haya desbloqueado +correctamente el dispositivo y hasta que el usuario reinicie nuevamente el dispositivo. Si el +usuario habilita el bloqueo de pantalla luego de desbloquear el dispositivo, esto no bloquea +el almacenamiento cifrado por credencial.
+ +Debes registrar los componentes de las aplicaciones con el sistema antes de que estas puedan
+ejecutarse durante el modo de arranque directo o acceder al almacenamiento cifrado por
+dispositivo. Para registrar una aplicación en el sistema, debes marcar los componentes como
+reconocimiento de cifrado. Para marcar su dispositivo como "con reconocimiento de cifrado" , configure el atributo
+android:encryptionAware
como verdadero en el manifiesto.
+ +
Los componentes con reconocimiento de cifrado pueden registrarse para recibir un mensaje de difusión
+LOCKED_BOOT_COMPLETED
del
+sistema cuando el dispositivo se haya reiniciado. En este momento, el almacenamiento
+cifrado por dispositivo está disponible, y el componente puede ejecutar tareas que se deben
+ejecutar durante el modo de arranque directo, como disparar una alarma programada.
El siguiente fragmento de código es un ejemplo de cómo registrar un
+{@link android.content.BroadcastReceiver} como reconocimiento de cifrado y de cómo agregar un
+filtro de intenciones para LOCKED_BOOT_COMPLETED
en el manifiesto de la aplicación:
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
Una vez que el usuario haya desbloqueado el dispositivo, todos los componentes podrán acceder tanto al +almacenamiento cifrado por dispositivo como al almacenamiento cifrado por credencial.
+ +Para acceder al almacenamiento cifrado por dispositivo, crea una segunda
+instancia de {@link android.content.Context} llamando a
+Context.createDeviceEncryptedStorageContext()
. Todas las llamadas
+de API de almacenamiento que se hacen usando este contexto acceden al almacenamiento cifrado por dispositivo. El siguiente
+ejemplo accede al almacenamiento cifrado por dispositivo y abre un archivo de datos de la aplicación
+existente:
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
Solo debes usar el almacenamiento cifrado por dispositivo para +información que debe ser accesible durante el modo de arranque directo. +No uses este tipo de almacenamiento como un almacenamiento cifrado de propósito general. +Para información privada del usuario o datos cifrados que no son necesarios durante +el modo de arranque directo, usa el almacenamiento cifrado por credencial.
+ +Una vez que el usuario desbloquea el dispositivo después de reiniciarlo, la aplicación puede cambiar y acceder +al almacenamiento cifrado por credencial y usar servicios del sistema comunes que +dependen de credenciales de usuario.
+ +Para recibir una notificación cuando el usuario desbloquea el dispositivo luego de reiniciarlo,
+registra un {@link android.content.BroadcastReceiver} de un componente en ejecución
+para que escuche el mensaje ACTION_USER_UNLOCKED
. O puedes
+recibir el mensaje existente {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED}, que ahora indica que el dispositivo se ha iniciado y
+que el usuario ha desbloqueado el dispositivo.
Puedes consultar directamente si el usuario ha desbloqueado el dispositivo llamando a
+UserManager.isUserUnlocked()
.
Si un usuario actualiza el dispositivo para usar el modo de arranque directo, es posible que haya
+datos existentes que se deben migrar al almacenamiento cifrado por dispositivo. Usa
+Context.migrateSharedPreferencesFrom()
y
+Context.migrateDatabaseFrom()
para migrar los datos de preferencia y de base de datos
+del almacenamiento cifrado por credencial al almacenamiento cifrado por dispositivo.
Debes tener cuidado cuando decidas qué datos migrar entre +estos dos tipos de almacenamiento. No deberías migrar +información de usuario privada, como contraseñas o tokens de autorización, al + almacenamiento cifrado por dispositivo. En algunos casos, es posible que debas gestionar +conjuntos separados de datos en ambos tipos de almacenamiento cifrado.
+ +Prueba la aplicación con reconocimiento de cifrado usando el nuevo modo de arranque directo. Hay dos +maneras de habilitar el arranque directo.
+ +Advertencia: habilitar el arranque directo +borrará todos los datos de usuario del dispositivo.
+ +Para los dispositivos compatibles que tienen Android N instalado, habilita +el arranque directo mediante una de las siguientes opciones:
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
También está disponible un modo de arranque directo emulado en caso de que debas cambiar +de modo en los dispositivos de prueba. El modo emulado solo debería usarse durante +el desarrollo, y puede provocar la pérdida de datos. Para habilitar el modo de arranque directo emulado, +debes establecer un patrón de bloqueo en el dispositivo, elegir "No thanks" si te pregunta si deseas un +inicio seguro cuando estás estableciendo el patrón de bloqueo y, luego, usar el +siguiente comando shell ADB:
+ ++$ adb shell sm set-emulate-fbe true ++ +
Para deshabilitar el modo de arranque directo emulado, usa el siguiente comando:
+ ++$ adb shell sm set-emulate-fbe false ++ +
Usar estos comandos provoca el reinicio del dispositivo.
diff --git a/docs/html-intl/intl/es/preview/features/icu4j-framework.jd b/docs/html-intl/intl/es/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..4c5fc7b30ea0 --- /dev/null +++ b/docs/html-intl/intl/es/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=API de ICU4J del framework de Android + +@jd:body + ++ ICU4J es un conjunto de bibliotecas de Java de código abierto y amplio uso que brinda soporte de Unicode + y de globalización para aplicaciones de software. Android N + expone un subconjunto de las API de ICU4J en el framework de Android para que los desarrolladores de aplicaciones + lo usen debajo del paquete {@code android.icu}. Estas API usan + datos de ubicación que están presentes en el dispositivo. Como resultado, puedes reducir la superficie de APK + evitando la compilación de las bibliotecas de ICU4J en APK. En lugar de esto, puedes + llamarlas en el framework. (En este caso, posiblemente debas brindar + versiones múltiples + del APK, de modo que los usuarios que usan versiones de Android inferiores a Android N + puedan descargar una versión de la aplicación que incluya las bibliotecas de ICU4J). +
+ ++ Al principio de este documento, encontrarás información básica sobre el mínimo de niveles de Android API + necesarios para soportar estas bibliotecas. Más adelante, encontrarás explicaciones sobre qué + necesitas saber acerca de la implementación de ICU4J específica para Android. Por último, + encontrarás explicaciones sobre cómo usar las API de ICU4J en el framework de Android. +
+ +
+ Android N expone un subconjunto de las API de ICU4J mediante el
+ paquete android.icu
, en lugar de com.ibm.icu
. El
+framework de Android puede elegir no
+ exponer las API de ICU4J por varias razones; por ejemplo, Android N no expone
+ algunas API obsoletas o algunas que el equipo de ICU aún no ha declarado como
+ estables. A medida que el equipo de ICU deje de usar API en el futuro, Android también las marcará
+ como obsoletas, pero las seguirá incluyendo.
+
Nivel de Android API | +Versión de ICU | +Versión de CLDR | +
---|---|---|
Android N | +56 | +28 | +
Debes tener en cuenta lo siguiente:
+ +
+ Si ya estás usando las API de ICU4J en tu aplicación y las
+ API de android.icu
cumplen con tus requisitos, migrar hacia las
+ API del framework implicará que cambies tus importaciones de Java
+ de com.ibm.icu
a android.icu
. Luego, puedes
+ quitar tu propia copia de los archivos de ICU4J del APK.
+
+ Nota: Las API del framework de ICU4J usan el espacio de nombres {@code android.icu} + en lugar de {@code com.ibm.icu}. El motivo de esto es evitar conflictos de espacio de nombres + en APK que contienen sus propias bibliotecas de {@code com.ibm.icu}. +
+ +
+ Algunas clases de los paquetes de java
y de android
son
+ equivalentes a las clases de ICU4J. Sin embargo, ICU4J a menudo brinda una compatibilidad
+ más amplia para estándares e idiomas.
+
Aquí tienes algunos ejemplos para comenzar:
+Clase | +Alternativa | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J se presenta bajo la licencia de ICU. Para obtener información más detallada, consulta la Guía de usuario + de ICU. +
diff --git a/docs/html-intl/intl/es/preview/features/multi-window.jd b/docs/html-intl/intl/es/preview/features/multi-window.jd new file mode 100644 index 000000000000..4415ba97760d --- /dev/null +++ b/docs/html-intl/intl/es/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=Compatibilidad con ventanas múltiples +page.metaDescription=Nueva compatibilidad en Android N para mostrar más de una aplicación a la vez. +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N agrega compatibilidad con la visualización de más de una aplicación + a la vez. En dispositivos portátiles, se pueden ejecutar dos aplicaciones una al lado de la otra o + una por encima de la otra en modo de pantalla dividida. En dispositivos de TV, las aplicaciones pueden + usar el modo imagen en imagen para continuar la reproducción de video mientras los usuarios + interactúan con otra aplicación. +
+ ++ Si compilas tu aplicación con el N Preview SDK, puedes configurar la manera en que tu aplicación + administra la visualización de ventanas múltiples. Por ejemplo, puedes especificar las dimensiones + mínimas permitidas de tu actividad. También puedes inhabilitar la visualización de ventanas múltiples para + tu aplicación asegurándote de que el sistema solo muestre tu aplicación en modo de + pantalla completa. +
+ ++ Android N permite que varias aplicaciones compartan la pantalla al mismo tiempo. Por + ejemplo, un usuario podría dividir la pantalla y ver una página web a la izquierda + mientras escribe un correo electrónico a la derecha. La experiencia de usuario depende + del dispositivo: +
+ ++ El usuario puede cambiar a modo de ventanas múltiples de la siguiente manera: +
+ ++ Los usuarios pueden arrastrar y + soltar datos de una actividad a otra mientras las actividades comparten + la pantalla. (Antes, los usuarios solo podían arrastrar y soltar datos dentro de una sola + actividad). +
+ ++ El modo de ventanas múltiples no cambia el ciclo de vida + de la actividad. +
+ ++ En modo de ventanas múltiples, solo la actividad con la que el usuario interactuó más recientemente + está activa en un momento determinado. Esa actividad se considera la principal. + Todas las demás actividades están pausadas, aunque estén visibles. + No obstante, el sistema les da a esas actividades pausadas pero visibles una prioridad más alta + que las actividades que no están visibles. Si el usuario interactúa con una de las + actividades pausadas, se reanuda esa actividad y se pausa la actividad que antes + era la principal. +
+ ++ Nota: En modo de ventanas múltiples, una aplicación puede estar pausada + y aún visible para el usuario. Es posible que una aplicación necesite continuar sus + actividades mientras está pausada. Por ejemplo, una aplicación de reproducción de video que está + pausada pero visible debería continuar mostrando el video. Por ese + motivo, recomendamos que las actividades que reproducen video no pausen el + video en sus controladores{@link android.app.Activity#onPause onPause()}. + En su lugar, deben pausar el video en {@link android.app.Activity#onStop + onStop()} y reanudar la reproducción en {@link android.app.Activity#onStart + onStart()}. +
+ ++ Cuando el usuario coloca una aplicación en modo de ventanas múltiples, el sistema le notifica a la + actividad acerca de un cambio de configuración, tal como se especifica en Control de cambios en + tiempo de ejecución. Básicamente, este cambio tiene las mismas consecuencias en el ciclo de vida + de la actividad que cuando el sistema notifica a la aplicación que el dispositivo cambió de + modo vertical a modo horizontal, excepto porque se modifican las dimensiones del dispositivo + en lugar de intercambiarse solamente. Como se aborda en Control de cambios en + tiempo de ejecución, tu actividad puede administrar el cambio de configuración por sí misma, o + puede permitir que el sistema destruya la actividad y la vuelva a crear con las nuevas + dimensiones. +
+ +
+ Si el usuario cambia el tamaño de una ventana y la agranda en cualquier dirección, el
+ sistema modifica el tamaño de la actividad para que coincida con la acción del usuario y emite cambios en tiempo de ejecución
+ según sean necesarios. Si la aplicación se retrasa en el trazado de áreas recientemente expuestas, el
+ sistema rellena esas áreas con el color especificado por el atributo {@link
+ android.R.attr#windowBackground windowBackground} o por el atributo de estilo predeterminado
+ windowBackgroundFallback
.
+
+ Si tu aplicación está orientada a Android N, puedes configurar cómo y + si quieres que las actividades de tu aplicación admitan la visualización de ventanas múltiples. Puedes establecer + atributos en tu manifiesto para controlar el tamaño y el diseño. + La configuración de atributos de una actividad raíz aplica a todas las actividades + de su pila de tareas. +
+ ++ Nota: Si compilas una aplicación con múltiples orientaciones con una versión del + SDK anterior a Android N, y el usuario usa la aplicación en + modo de ventanas múltiples, el sistema cambia el tamaño de la aplicación de forma forzada. El sistema presenta un + cuadro de diálogo en el que se advierte al usuario que la aplicación puede comportarse de forma inesperada. El sistema + no modifica el tamaño de aplicaciones con orientación fija; si + el usuario intenta abrir una aplicación con orientación fija en modo de ventanas múltiples, + la aplicación ocupará toda la pantalla. +
+ +
+ Establece este atributo en el nodo <activity>
o
+ <application>
de tu manifiesto para habilitar o deshabilitar la visualización
+ en modo de ventanas múltiples:
+
+android:resizeableActivity=["true" | "false"] ++ +
+ Si este atributo se establece en true, la actividad puede iniciarse en + los modos de pantalla dividida y forma libre. Si el atributo se establece en false, la + actividad no admite el modo de ventanas múltiples. Si el valor es false, y el + usuario intenta iniciar la actividad en modo de ventanas múltiples, la actividad ocupará + toda la pantalla. +
+ ++ Si tu aplicación está orientada a Android N, pero no especificas un valor + para este atributo, el valor predeterminado del atributo será true. +
+ +
+ Establece este atributo en el nodo <activity>
de tu manifiesto
+ para indicar si la actividad admite la visualización de imagen en imagen. Este
+ atributo se ignora si android:resizeableActivity
es false.
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ Con Android N, el elemento de manifiesto <layout>
+ admite varios atributos que afectan cómo se comporta una actividad en
+ modo de ventanas múltiples:
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + Por ejemplo, el siguiente código muestra cómo especificar el tamaño + y la ubicación predeterminados de una actividad, y su tamaño mínimo, cuando la actividad se visualiza en + modo de forma libre: +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N ofrece nuevas funcionalidades para admitir aplicaciones que puedan ejecutarse + en modo de ventanas múltiples. +
+ ++ Ciertas funciones están deshabilitadas o se ignoran cuando un dispositivo se encuentra en modo de + ventanas múltiples, ya que no resultan útiles para una actividad que podría estar compartiendo la + pantalla del dispositivo con otras actividades o aplicaciones. Esas funciones incluyen las siguientes: + +
android:screenOrientation
.
+ + Se agregaron los siguientes métodos nuevos a la clase {@link android.app.Activity} + para admitir la visualización de ventanas múltiples. Para obtener información detallada sobre cada método, consulta la + Referencia del N Preview SDK. +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ Nota: El modo de Picture-in-Picture es un caso especial del
+ modo de ventanas múltiples. Si myActivity.inPictureInPicture()
+ devuelve true, myActivity.inMultiWindow()
también devuelve
+ true.
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ También hay versiones {@link android.app.Fragment} de cada uno de esos
+ métodos; por ejemplo, Fragment.inMultiWindow()
.
+
+ Para que una actividad entre en modo de imagen en imagen, debes llamar al nuevo método
+ Activity.enterPictureInPicture()
. Este método no tiene efecto si
+ el dispositivo no admite el modo de imagen en imagen. Para obtener más información,
+ consulta la documentación de Picture-in-Picture.
+
+ Cuando inicias una nueva actividad, puedes indicarle al sistema que la nueva
+ actividad se debe mostrar adyacente a la actual, si fuera posible. Para hacer
+ esto, usa el marcador
+ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
. Pasar
+ este marcador requiere el siguiente comportamiento:
+
+ Si un dispositivo está en modo de forma libre e inicias una nueva actividad, puedes
+ especificar las dimensiones y la ubicación de la pantalla de la nueva actividad al llamar a
+ ActivityOptions.setLaunchBounds()
. Este método no tiene efecto si
+ el dispositivo no está en modo de ventanas múltiples.
+
+ Nota: Si inicias una actividad en una pila de tareas, esa + actividad reemplaza la actividad en pantalla y hereda todas sus + propiedades de ventanas múltiples. Si quieres iniciar la nueva actividad en una ventana + independiente en modo de ventanas múltiples, debes iniciarla en una nueva pila de tareas. +
+ ++ Los usuarios pueden arrastrar y + soltar datos de una actividad a otra mientras las dos actividades + comparten la pantalla. (Antes, los usuarios solo podían arrastrar y soltar datos dentro de una + sola actividad). Por este motivo, te recomendamos que agregues la funcionalidad de arrastrar y + soltar a tu aplicación si es que aún no la admite. +
+ +
+ El N Preview SDK amplía el paquete android.view
+ para admitir la funcionalidad de arrastrar y soltar entre aplicaciones diferentes. Para obtener información detallada sobre las siguientes
+ clase y métodos, consulta la Referencia
+ del N Preview SDK.
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
. Si necesitas otorgar permisos de URI a
+ la actividad receptora, pasa los nuevos marcadores
+ View.DRAG_FLAG_GLOBAL_URI_READ
o
+ View.DRAG_FLAG_GLOBAL_URI_WRITE
, según corresponda.
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + Ya sea que actualices o no tu aplicación para Android N, debes + verificar la forma en que se comporta en modo de ventanas múltiples en caso de que un usuario intente iniciarla + en modo de ventanas múltiples en un dispositivo con Android N. +
+ ++ Si instalas Android N en un dispositivo, se admite automáticamente el modo + de pantalla dividida. +
+ ++ Si no creaste tu aplicación con el N Preview SDK y el usuario intenta usar + la aplicación en modo de ventanas múltiples, el sistema cambia el tamaño de la aplicación de forma forzada, a menos que la aplicación + declare una orientación fija. +
+ ++ Si tu aplicación no declara una orientación fija, debes iniciar tu aplicación + en un dispositivo con Android N e intentar colocar la aplicación en + modo de pantalla dividida. Cuando se modifique el tamaño de la aplicación de forma forzada, + comprueba que la experiencia de usuario sea aceptable. +
+ ++ Si la aplicación declara una orientación fija, debes intentar colocar la aplicación en + modo de ventanas múltiples. Cuando lo hagas, verifica que la aplicación + continúe en modo de pantalla completa. +
+ ++ Si compilaste tu aplicación con el N Preview SDK y no deshabilitaste + la compatibilidad con ventanas múltiples, verifica el siguiente comportamiento tanto en modo de pantalla dividida + como en modo de forma libre. +
+ ++ Para verificar el rendimiento de tu aplicación en modo de ventanas múltiples, intenta las siguientes + operaciones. Debes probar estas operaciones tanto en modo de pantalla dividida como en + modo de ventanas múltiples, excepto cuando se indique algo diferente. +
+ +
+ Si deshabilitaste la compatibilidad con el modo de ventanas múltiples al configurar
+ android:resizableActivity="false"
, debes iniciar tu aplicación en
+ un dispositivo con Android N e intentar colocar la aplicación en los
+ modos de forma libre y pantalla dividida. Cuando lo hagas, verifica que la aplicación
+ continúe en modo de pantalla completa.
+
Android N brinda un soporte mejorado para los usuarios de diferentes idiomas +y les permite seleccionar múltiples configuraciones regionales en la configuración. Android N +brinda esta capacidad expandiendo ampliamente la cantidad de configuraciones regionales compatibles +y cambiando la forma en que el sistema resuelve los recursos. El nuevo método de resolución +de recursos es más robusto y está diseñado para ser compatible con APK existentes, pero +debes tener especial cuidado para detectar cualquier comportamiento inesperado. Por ejemplo, debes +realizar pruebas para asegurarte de que tu aplicación muestre el idioma esperado de forma predeterminada. Además, +si tu aplicación permite múltiples idiomas, debes asegurarte de que esta compatibilidad funcione +como debería. Por último, debes tratar de asegurarte de que tu aplicación administre con facilidad +los idiomas para los cuales no diseñaste explícitamente la aplicación.
+ +Al inicio de este documento, encontrarás una explicación sobre la estrategia de resolución de recursos anterior a +Android N. Luego, encontrarás una descripción de la estrategia de resolución de recursos +mejorada de Android N. Por último, encontrarás una explicación sobre cómo aprovechar +la cantidad expandida de configuraciones regionales para permitir acceso a más usuarios de diferentes idiomas.
+ +Antes de Android N, Android no siempre podía +hacer coincidir correctamente las configuraciones regionales de la aplicación y del sistema. Por ejemplo, supongamos que el idioma predeterminado + de tu aplicación es inglés de EE. UU., pero que también tiene cadenas en español localizadas en archivos de recursos {@code es_ES}. +
+Cuando el código Java se refería a las cadenas, resolvía el idioma de las cadenas como +se muestra a continuación:
+Estos problemas de resolución surgieron debido a que el sistema quitaba el código de país +de la configuración regional si no podía encontrar una coincidencia exacta. Por ejemplo:
+ +Configuración del usuario | +Recursos de la aplicación | +Resolución de recursos | +
---|---|---|
fr_CH | +
+Predeterminado (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Intentar fr_CH => Error +Intentar fr => Error +Usar predeterminado (en) + |
+
En este ejemplo, el sistema muestra las cadenas en inglés sin +saber si el usuario comprende este idioma. Este comportamiento es muy común +hoy en día. Android N debería reducir sustancialmente la frecuencia +de resultados como este.
+ +Android N brinda una resolución de recursos más robusta y
+encuentra mejores recursos de forma automática. Sin embargo, para acelerar la resolución y mejorar la
+facilidad de mantenimiento, debes almacenar los recursos en el dialecto primario.
+ Por ejemplo, si antes almacenabas los recursos en español en el directorio {@code es-US}
+, pásalos al directorio {@code es-419}, que contiene la variante de Latinoamérica.
+ De forma similar, si tienes cadenas de recursos en una carpeta llamada {@code en-GB}, cámbiale
+ el nombre a {@code en-001} (inglés internacional), ya que el dialecto primario más común
+ para las cadenas en en-GB
es {@code en-001}.
+ Los siguientes ejemplos explican por qué estas prácticas mejoran el desempeño
+ y la confiabilidad de la resolución de recursos.
Con Android N, el caso descrito en la Tabla 1 se resuelve +de otra forma:
+ + +Configuración del usuario | +Recursos de la aplicación | +Resolución de recursos | +
---|---|---|
|
+
+Predeterminado (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Intentar fr_CH => Error +Intentar fr => Error +Intentar secundario de fr => fr_FR +Usar fr_FR + |
+
Así, los recursos se muestran en francés en lugar de en inglés. Este ejemplo también muestra + por qué deberías almacenar las cadenas en francés en {@code fr} en lugar de en {@code fr_FR} + para Android N. Aquí, el procedimiento se basa en hacer coincidir el dialecto primario más cercano, + lo cual hace que la resolución sea más rápida y más predecible.
+ +Además de esta lógica de resolución mejorada, Android ofrece ahora más + idiomas de usuario de entre los cuales elegir. Volvamos a ver el ejemplo anterior con el idioma italiano + especificado como un idioma de usuario adicional, pero sin compatibilidad de la aplicación con el idioma francés.
+ + +Configuración del usuario | +Recursos de la aplicación | +Resolución de recursos | + +
---|---|---|
|
+
+Predeterminado (en) +de_DE +es_ES +it_IT + |
+
+Intentar fr_CH => Error +Intentar fr => Error +Intentar secundario de fr => Error +Intentar it_CH => Error +Intentar it => Error +Intentar secundario de it => it_IT +Usar it_IT + |
+
+
El usuario recibe la información en un idioma que comprende, si bien la aplicación no +es compatible con el idioma francés.
+ + +Android N incorpora una nueva API, {@code LocaleList.GetDefault()}, +que les permite a las aplicaciones consultar directamente la lista de idiomas que ha especificado el usuario. Esta API + te permite crear un comportamiento de la aplicación + más sofisticado y una presentación de contenido más optimizada. Por ejemplo, las búsquedas + pueden mostrar resultados en múltiples idiomas según la configuración del usuario. Las aplicaciones de navegadores + pueden evitar ofrecer la traducción de páginas que están en un idioma que el usuario comprende, + y las aplicaciones de teclado pueden habilitar automáticamente todos los diseños correctos.
+ +Hasta Android 6.0 (API nivel 23), Android solo permitía una o dos + configuraciones regionales para muchos idiomas comunes + (en, es, ar, fr, ru). Debido a que había solo unas pocas variantes para cada idioma, +las aplicaciones podían almacenar algunos números y fechas como cadenas preprogramadas +en los archivos de recursos. Sin embargo, con el conjunto ampliado de configuraciones regionales +compatibles de Android, puede haber diferencias importantes +en los formatos de fecha, hora, moneda e +información similar, incluso dentro de una sola configuración regional. Preprogramar los formatos puede generar +una experiencia confusa para los usuarios. Por lo tanto, cuando desarrolles aplicaciones para Android, +asegúrate de usar formateadores en lugar de preprogramar las cadenas de números y fechas.
+ +Un muy buen ejemplo es el árabe. Android N expandió su compatibilidad de +una configuración regional, {@code ar_EG}, a 27 configuraciones regionales. Estas configuraciones regionales pueden compartir la mayoría de los recursos, +pero algunas prefieren dígitos ASCII, mientras que otras prefieren dígitos nativos. Por ejemplo, +cuando desees crear una oración con una variable de dígito, como +"Elige un PIN de 4 dígitos", usa formateadores como se muestra a continuación:
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/es/preview/features/notification-updates.jd b/docs/html-intl/intl/es/preview/features/notification-updates.jd new file mode 100644 index 000000000000..2679c3e32053 --- /dev/null +++ b/docs/html-intl/intl/es/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=Notificaciones +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + +
Android N incluye varias API nuevas que permiten a las aplicaciones publicar +notificaciones altamente visibles e interactivas.
+ +Android N amplía la API de notificación existente {@link android.support.v4.app.RemoteInput} +para admitir respuestas en línea en teléfonos celulares. Esta función permite a los usuarios + responder rápidamente desde el panel de notificaciones sin tener que visitar tu aplicación.
+ ++ Android N también te permite agrupar notificaciones similares para que + aparezcan como una sola notificación. Para que esto sea posible, Android N usa el método existente {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()}. Los usuarios pueden expandir cada una de las + notificaciones y realizar acciones como responder e ignorar en cada una + de ellas, de forma individual desde el panel de notificaciones. +
+ +Por último, Android N también suma nuevas API que te permiten aprovechar las decoraciones +del sistema en las vistas de notificación personalizadas de tu aplicación. Estas API ayudan a +garantizar que las vistas de notificaciones compartan una presentación acorde a las +plantillas estándar.
+ +En este documento se destacan algunos de los cambios clave que puedes tener en cuenta + al usar las nuevas funciones de notificación en tus aplicaciones.
+ +Con la función de respuesta directa en Android N, los usuarios pueden responder +rápidamente mensajes de texto o actualizar listas de tareas directamente dentro de la interfaz de +notificación. En un dispositivo portátil, la acción de respuesta en línea aparece como un botón adicional + anexado a la notificación. Cuando un usuario responde mediante un teclado, el sistema adjunta + la respuesta de texto a la intención + que especificaste para la acción de notificación y envía la intención a tu + aplicación para dispositivos portátiles. + + + +
+ +Para crear una acción de notificación que admita respuesta directa: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
.
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
Cuando se active la acción de notificación, +el sistema le solicitará al usuario que ingrese una respuesta.
+ + + + +Para recibir entradas del usuario de la interfaz de notificación a la actividad que +declaraste en la intención de la acción de respuesta:
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
El siguiente fragmento de código ilustra cómo un método recupera el texto de entrada +de un paquete:
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
Las aplicaciones pueden aplicar lógica para decir qué medidas tomar con respecto al texto +recuperado. +Para las aplicaciones interactivas (como los chats), proporciona más contexto sobre la notificación + (por ejemplo, varias líneas de historial de chat, incluidos los mensajes del usuario) + de modo que el usuario pueda responder correctamente. +Cuando el usuario responda a través de {@link android.support.v4.app.RemoteInput}, + incluye el texto del historial de respuestas con el método {@code setRemoteInputHistory()} +.
+ +Android N ofrece a los desarrolladores una nueva manera de representar + una cola de notificaciones: notificaciones integradas. Esto es similar a la función + Pilas de + notificaciones en Android Wear. Por ejemplo, si tu aplicación crea notificaciones + para los mensajes recibidos, cuando se recibe más de un mensaje, agrupa las + notificaciones en un solo paquete. Puedes + usar el método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} para agrupar notificaciones similares.
+ ++ El grupo de notificaciones impone una jerarquía en las notificaciones que lo integran. + En la parte superior de esa jerarquía se encuentra una notificación principal que muestra información + resumida para el grupo. El usuario puede expandir + progresivamente el grupo de notificaciones, y el sistema muestra más información a medida que el + usuario continúa indagando. Cuando el usuario expande el paquete, el sistema revela más + información para todas sus notificaciones secundarias; cuando el usuario + expande una de esas notificaciones, el sistema revela todo su contenido. +
+ + + + +Para obtener información acerca de cómo agregar notificaciones a un grupo, consulta +Agregar +cada notificación a un grupo.
+ + +Esta sección proporciona pautas acerca de cuándo usar grupos de notificaciones en lugar +de las notificaciones {@link android.app.Notification.InboxStyle InboxStyle} +que estaban disponibles en versiones anteriores de la +plataforma Android.
+ +Solo debes usar grupos de notificaciones si se cumplen todas las siguientes condiciones +para tu caso de uso:
+ +Algunos ejemplos de buenos casos de uso para grupos de notificaciones incluyen: una aplicación de mensajería +que exhiba una lista de mensajes entrantes, o una aplicación de correo electrónico que exhiba una lista de +correos electrónicos recibidos.
+ ++Algunos ejemplos de casos en los que se prefiere una sola notificación + incluyen mensajes individuales de una sola persona, o una lista de + elementos de texto de una sola línea. Para lograr esto, puedes usar +({@link android.app.Notification.InboxStyle InboxStyle} o +{@link android.app.Notification.BigTextStyle BigTextStyle}) +. +
+ ++ La aplicación siempre debe publicar un resumen del grupo, aún si el grupo contiene una sola + notificación secundaria. Si contiene una sola notificación, el sistema suprimirá el resumen y mostrará directamente la + notificación secundaria. Esto garantiza + que el sistema pueda proporcionar una experiencia uniforme cuando el usuario quita con un gesto de "deslizar" notificaciones + secundarias de un grupo. +
+ ++ Nota: Esta versión de Android N aún no + suprime el resumen para los grupos de notificaciones que contienen una sola notificación secundaria. Esta + funcionalidad se agregará en una versión posterior de Android N. +
+ +Si bien el sistema generalmente muestra las notificaciones secundarias como un grupo, puedes configurarlas + para que aparezcan temporalmente como + + notificaciones emergentes. Esta función es especialmente útil porque permite + el acceso inmediato a la notificación secundaria más reciente y a las acciones asociadas a ella. +
+ + ++ Tanto los grupos de notificaciones como las entradas remotas han formado parte de la API {@link + android.app.Notification} desde Android 5.0 (API nivel 21) para soportar dispositivos + con Android Wear. Si ya compilaste notificaciones con esas API, + lo único que debes hacer es verificar que el comportamiento de la aplicación concuerde + las pautas antes descritas y considerar la implementación de {@code + setRemoteInputHistory()}. +
+ ++ Para poder ser compatible con versiones anteriores, están disponibles las mismas API con + la clase {@link android.support.v4.app.NotificationCompat} + de la biblioteca de soporte, que te permite crear notificaciones que funcionan en versiones de Android + anteriores. En dispositivos portátiles y tablets, los usuarios solo ven la notificación de resumen + de modo que una aplicación aún debe tener un estilo de bandeja de entrada o una notificación equivalente + que represente todo el contenido del grupo. Dado que los dispositivos con Android + Wear permiten a los usuarios ver todas las notificaciones secundarias incluso en + niveles anteriores de la plataforma, debes crear notificaciones secundarias independientemente del nivel de + API. +
+ +A partir de la versión Android N, puedes personalizar vistas de notificaciones y +aún obtener decoraciones del sistema, como encabezados de notificaciones, acciones y diseños +expandibles.
+ +Para habilitar esta característica, Android N suma las siguientes API para que puedas diseñar tu + vista personalizada:
+ +Para usar esta nueva API, llama al método {@code setStyle()} y pásale +el estilo de la vista personalizada que hayas elegido.
+ +Este fragmento muestra cómo crear un objeto de notificación personalizada con el método +{@code DecoratedCustomViewStyle()}.
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/es/preview/features/picture-in-picture.jd b/docs/html-intl/intl/es/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..01e39a2a0010 --- /dev/null +++ b/docs/html-intl/intl/es/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=Picture-in-picture +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
Con Android N, los usuarios de Android TV ahora pueden ver un video +en una ventana fija que se ubica en una esquina de la pantalla mientras navegan dentro de +aplicaciones. El modo picture-in-picture (PIP) permite que las aplicaciones reproduzcan un video +en una ventana fija mientras se lleva a cabo otra actividad +en el fondo. La ventana de PIP les permite a los usuarios realizar múltiples tareas mientras usan tu aplicación, lo cual les permite +ser más productivos.
+ +Tu aplicación puede decidir cuándo activar el modo PIP. Aquí te mostramos algunos ejemplos de +situaciones en las que se podría usar el modo PIP:
+ +La ventana de PIP es de 240x135 dp y se muestra en la capa delantera en una de las +cuatro esquinas de la pantalla que el sistema elige. El usuario puede acceder a un menú de +PIP que le permite cambiar la ventana de PIP a pantalla completa o cerrarla +presionando el botón Home en el control remoto. Si se comienza a reproducir +otro video en la pantalla principal, la ventana de PIP se cierra +automáticamente. Los usuarios también pueden cerrar la ventana de PIP desde Recents.
+ + + + +El modo PIP aprovecha las API de ventanas múltiples disponibles en Android N para +brindar la ventana superpuesta fija de video. Para agregarle el modo PIP a tu aplicación, debes +registrar las actividades que permitan este modo, cambiar la actividad al modo PIP según +sea necesario y asegurarte de que los elementos de IU se oculten y que la reproducción de video continúe mientras +la actividad se encuentra en modo PIP.
+ +De forma predeterminada, el sistema no permite el modo PIP para aplicaciones automáticamente.
+Si deseas permitir este modo en tu aplicaciones, registra la actividad
+de video en tu manifiesto configurando
+android:supportsPictureInPicture
y
+android:resizeableActivity
en true
. Además, debes especificar
+que tu actividad gestiona los cambios de configuración de la presentación para que la actividad
+no se reinicie cuando ocurran cambios de presentación durante las transiciones en el modo PIP.
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
Cuando registres la actividad, ten en cuenta que, en el modo PIP, la +actividad se muestra en una ventana superpuesta pequeña en una pantalla de TV. Las actividades de reproducción +de videos con IU mínimas brindan la mejor experiencia de usuario. Las actividades que +incluyen elementos de IU pequeños podrían no brindar una buena experiencia de usuario +cuando se cambian al modo PIP, porque los usuarios no podrán ver los detalles de los elementos de IU +en la ventana PIP.
+ +Activity.enterPictureInPicture()
. El siguiente ejemplo cambia
+al modo PIP cuando el usuario selecciona un botón PIP especial en una barra
+de control de medios:
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
Agregar un botón PIP a la barra de control de medios le permite al usuario cambiar +fácilmente al modo PIP y seguir controlando la reproducción de video.
+ + + + +Android N incluye una nueva clase
+PlaybackControlsRow.PictureInPictureAction
que define
+las acciones de PIP de la barra de control y usa el ícono PIP.
Cuando la actividad ingresa al modo PIP, esta solo debería mostrar la reproducción
+de video. Debes quitar los elementos de IU antes de que la actividad ingrese al modo PIP
+y volver a mostrarlos cuando la actividad vuelva al modo de pantalla completa.
+Sobrescribe Activity.onPictureInPictureChanged()
o
+Fragment.onPictureInPictureChanged()
y habilita
+o deshabilita los elementos de IU según sea necesario, por ejemplo:
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
Cuando la actividad cambia al modo PIP, el sistema considera que se encuentra en
+pausa y llama al método onPause()
de la actividad. La reproducción
+de video no debería pausarse y debería continuar si la actividad se
+pausa debido al modo PIP. Busca el modo PIP en el método
+onPause()
de la actividad y controla la reproducción según corresponda, por
+ejemplo:
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
Cuando la actividad sale del modo PIP y vuelve al modo de pantalla completa, el
+sistema reinicia la actividad y llama al método onResume()
.
El modo PIP está diseñado para actividades que reproducen un video en pantalla completa. Cuando cambies la +actividad al modo PIP, evita que se muestre cualquier elemento que no sea el contenido del video. +Rastrea el cambio a modo PIP de la actividad y oculta los elementos de IU, como se explica +en la sección Gestionar las IU durante el modo picture-in-picture.
+ +Debido a que la ventana de PIP se muestra como una ventana flotante en una +esquina de la pantalla, debes evitar mostrar información importante en la pantalla principal +en cualquier área que pueda quedar oculta detrás de la ventana de PIP.
+ +Cuando una actividad se encuentra en modo PIP, de forma predeterminada, no tiene focalización en las entradas. Para
+recibir eventos de entradas durante este modo, usa
+MediaSession.setMediaButtonReceiver()
.
Las aplicaciones como las aplicaciones de fotografía generalmente solo necesitan acceso a directorios de
+almacenamiento externo, como el directorio Pictures
. Los métodos
+existentes para acceder a almacenamiento externo no están diseñados para brindar un
+acceso fácil a determinados directorios para estos tipos de aplicaciones. Por ejemplo:
Android N brinda una API nueva y simplificada para acceder a + directorios de almacenamiento externo comunes.
+ +Usa la clase StorageManager
para obtener la instancia de
+StorageVolume
correcta. Luego, crea una intención llamando al
+ método StorageVolume.createAccessIntent()
de esa instancia.
+Usa esta intención para acceder a directorios de almacenamiento externo. Para obtener una lista de
+todos los volúmenes disponibles, incluidos los volúmenes de medios extraíbles, usa
+StorageManager.getVolumesList()
.
El siguiente fragmento de código es un ejemplo de cómo abrir el
+directorio Pictures
en el almacenamiento compartido principal:
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
El sistema intenta otorgar acceso al directorio externo y, si +es necesario, confirma el acceso con el usuario usando una IU simplificada:
+ + + + +Si el usuario otorga el acceso, el sistema llama a tu
+ invalidación de onActivityResult()
con un código resultante de
+Activity.RESULT_OK
y datos de intención que contienen el URI. Usa
+el URI brindado para acceder a la información del directorio. Es similar a usar URI
+generados por el
+framework
+de acceso al almacenamiento.
Si el usuario no otorga el acceso, el sistema llama a tu
+invalidación de onActivityResult()
con un código resultante de
+Activity.RESULT_CANCELED
y datos de intención nulos.
Nota: obtener acceso a un directorio externo específico +también otorga el acceso a los subdirectorios de ese directorio.
+ +Para usar el acceso a directorios determinados para acceder a directorios de medios extraíbles, +primero debes agregar un {@link android.content.BroadcastReceiver} que escuche la +notificación{@link android.os.Environment#MEDIA_MOUNTED}, por ejemplo:
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
Cuando el usuario conecta un medio extraíble, como una tarjeta SD, el sistema envía una
+notificación{@link android.os.Environment#MEDIA_MOUNTED}. Esta notificación
+brinda un objeto StorageVolume
en los datos de intención que puedes
+usar para acceder a directorios del medio extraíble. El siguiente ejemplo
+accede al directorio Pictures
de medios extraíbles:
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Cuando sea posible, sigue usando el URI de acceso a directorios externos de modo que no tengas
+que solicitarle acceso al usuario continuamente. Una vez que el usuario haya otorgado el acceso, llama a
+getContentResolver().takePersistableUriPermssion()
con el
+URI de acceso a directorios. El sistema continuará el URI, y las siguientes solicitudes
+de acceso generarán RESULT_OK
y no le mostrarán una IU de confirmación al
+usuario.
Si el usuario deniega el acceso a un directorio externo, no vuelvas a solicitar el +acceso inmediatamente. Hacer esto provocaría una mala experiencia +de usuario.
diff --git a/docs/html-intl/intl/es/preview/features/security-config.jd b/docs/html-intl/intl/es/preview/features/security-config.jd new file mode 100644 index 000000000000..862fcd94df20 --- /dev/null +++ b/docs/html-intl/intl/es/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=Configuración de seguridad de la red +page.keywords=preview,security,network + +@jd:body + ++ Android N incluye una función de configuración de seguridad de la red + que les permite a las aplicaciones personalizar los ajustes de seguridad de la red mediante un archivo + de configuración declarativo seguro sin que haya que modificar el código de la aplicación. Estos ajustes se pueden + configurar para dominios específicos y para una aplicación específica. Las capacidades + clave de esta función son las siguientes: +
+ ++ La función de configuración de seguridad de la red usa un archivo XML donde + se especifican los ajustes para la aplicación. Debes incluir una entrada en el manifiesto de tu + aplicación que apunte a este archivo. El siguiente fragmento de código de un manifiesto + demuestra cómo crear esta entrada: +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ Una aplicación podría querer otorgar confianza a un conjunto personalizado de CA en lugar de hacerlo según los ajustes + predeterminados de la plataforma. Las razones más comunes son las siguientes: +
+ ++ De forma predeterminada, las conexiones seguras (p. ej.: TLS, HTTP) de todas las aplicaciones dependen de + las CA preinstaladas del sistema; las aplicaciones que tienen como objetivo a la API nivel 23 + (Android M) e inferiores también dependen de la tienda de CA agregada por el usuario de forma predeterminada. Una + aplicación puede personalizar sus propias conexiones usando {@code base-config} (para + la personalización de toda la aplicación) o {@code domain-config} (para la personalización + por dominio). +
+ + ++ Supongamos que deseas conectarte a tu host, el cual usa un certificado SSL + autofirmado, o a un host cuyo certificado SSL está emitido por una CA no pública + en la cual confías, como la CA interna de tu empresa. +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Agrega el certificado de CA autofirmado o no público, en formato PEM o DER, a + {@code res/raw/my_ca}. +
+ + ++ Una aplicación que no desee confiar en todas las CA en que confía el sistema puede, + en su lugar, especificar su propio conjunto reducido de CA en las que confía. Esto protege a la aplicación + de certificados fraudulentos emitidos por cualquiera de las demás CA. +
+ ++ La configuración para limitar el conjunto de CA de confianza es similar a confiar en una CA personalizada para un dominio específico, con la diferencia + de que se brindan múltiples CA en el recurso. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Agrega las CA de confianza, en formato PEM o DER, a {@code res/raw/trusted_roots}.
+ Ten en cuenta que, si usas el formato PEM, el archivo debe incluir solo datos PEM
+ y ningún texto adicional. También puedes brindar elementos
+<certificates>
+ múltiples en lugar de solo uno.
+
+ Una aplicación podría querer otorgar confianza a CA adicionales en las cuales el sistema no confía, + ya sea porque el sistema aún no incluye la CA o porque la CA no + cumple con los requisitos de inclusión del sistema Android. La + aplicación puede hacerlo especificando múltiples fuentes de certificado para una + configuración. +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ Cuando depuras una aplicación que se conecta mediante HTTPS, podrías querer + conectarte a un servidor de desarrollo local que no tiene el certificado + SSL de tu servidor de producción. Para poder hacerlo sin + tener que modificar el código de tu aplicación, puedes especificar CA de solo depuración que + solo son de confianza cuando +android:debuggable + es {@code true} usando {@code debug-overrides}. Generalmente, las herramientas de IDE + y de compilación configuran esta marca automáticamente para las versiones que no son de lanzamiento. +
+ ++ Esto es más seguro que el código condicional habitual ya que, como precaución + de seguridad, las tiendas de aplicaciones no aceptan aplicaciones que están marcadas + como depurables. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ Las aplicaciones que deseen conectarse a destinos usando solo conexiones + seguras pueden desactivar Cleartext (usando el protocolo + HTTP no cifrado en lugar del protocolo HTTPS) para esos destinos. Esta opción ayuda a prevenir + las regresiones accidentales en aplicaciones debido a cambios en direcciones URL generados por fuentes + externas como servidores backend. + Consulta {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()} para obtener más información. +
+ ++ Por ejemplo, una aplicación puede querer garantizar que todas las conexiones a {@code +secure.example.com} se hagan siempre mediante HTTPS para proteger el tráfico sensible + de redes hostiles. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ Generalmente, una aplicación otorga confianza a todas las CA preinstaladas. Si alguna de estas CA emitiera + un certificado fraudulento, la aplicación estaría en riesgo de sufrir un ataque + MiTM. Algunas aplicaciones eligen limitar el conjunto de certificados que aceptan + ya sea limitando el conjunto de CA al que otorgan confianza o fijando certificados. +
+ ++ La fijación de certificados se hace brindando un conjunto de certificados por hash de la + clave pública (SubjectPublicKeyInfo del certificado X.509). De este modo, + una cadena de certificados solo es válida si contiene al menos una de + las claves públicas fijadas. +
+ ++ Ten en cuenta que, cuando uses la fijación de certificados, siempre debes incluir una clave + de respaldo para que, si te ves obligado a cambiar a claves nuevas o a cambiar de CA (cuando + fijas un certificado de CA o un intermediario de esa CA), la conectividad + de la aplicación no se vea afectada. Si no, deberás actualizar + la aplicación para recuperar la conectividad. +
+ ++ Además, se puede configurar un tiempo de expiración para las fijaciones, + luego del cual las fijaciones dejan de realizarse. Esto ayuda a evitar los problemas de conectividad + en aplicaciones que no se han actualizado. Sin embargo, configurar un tiempo de expiración + para las fijaciones puede habilitar la omisión de fijaciones. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ Los valores que no se establecen en una configuración específica se heredan. Este comportamiento permite configuraciones + más complejas y un archivo de configuración de fácil lectura. +
+ ++ Si no se establece un valor en una entrada específica, se usa el valor de + la siguiente entrada más general. Los valores no establecidos en una {@code domain-config} se + toman de la {@code domain-config} primaria, si están anidados, o de la {@code +base-config}, si no están anidados. Los valores no establecidos en la {@code base-config} usan + los valores predeterminados de la plataforma. +
+ ++ Por ejemplo, cuando todas las conexiones a subdominios de {@code +example.com} deben usar un conjunto personalizado de CA. Además, el tráfico de Cleartext a + estos dominios se permite excepto con las conexiones a {@code + secure.example.com}. Anidando la configuración para {@code +secure.example.com} dentro de la configuración para {@code example.com}, + {@code trust-anchors} no necesita duplicación. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ La función de configuración de seguridad de la red usa un formato de archivo XML. + La estructura general del archivo se muestra en el siguiente ejemplo de código: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ Las siguientes secciones describen la sintaxis y otros detalles del formato + de archivo. +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
.
+
++ Los valores que no están configurados usan los valores predeterminados de la plataforma. La configuración predeterminada + para aplicaciones con API nivel 24 o superior es: +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++La configuración predeterminada para aplicaciones con API nivel 23 o inferior es: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
anidadasTen en cuenta que, si múltiples elementos de {@code domain-config} cubren un destino, la configuración con la regla de coincidencia de dominio más específica (más larga) + es la que se usa.
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ Especifica si las CA de esta fuente omiten la fijación de certificados. Si es {@code +"true"}, las cadenas de certificados se encadenan mediante una de estas CA + desde esta fuente, y la fijación no se lleva a cabo. Esto puede ser útil para CA de depuración + o para poder permitirle al usuario hacer un ataque MiTM al tráfico seguro de la aplicación. +
+ ++ Es {@code "false"} de forma predeterminada, a menos que se especifique en un elemento de {@code debug-overrides} +, en cuyo caso, es {@code "true"} de forma predeterminada. +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
para el formato de las fijaciones.
+ + La expiración ayuda a evitar problemas de conectividad en aplicaciones + que no reciben actualizaciones para el conjunto de fijaciones, por ejemplo, +porque el usuario deshabilitó las actualizaciones de la aplicación. +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
Los servicios de entrada de TV le permiten al usuario pausar y reiniciar la reproducción de canales +mediante API de time-shifting. Android N expande la función de time-shifting + permitiéndoles a los usuarios guardar múltiples sesiones grabadas.
+ +Los usuarios pueden programar las grabaciones por adelantado o comenzar a grabar a la vez +que miran un programa. Una vez que el sistema haya guardado una grabación, el usuario puede explorar, gestionar +y reproducir las grabaciones usando la aplicación del sistema de TV.
+ +Si deseas brindar funcionalidades de grabación a tu servicio de entrada de TV, +debes indicarle al sistema que tu aplicación permite la grabación, implementar +la habilidad para grabar programas, gestionar y comunicar los errores que ocurren +durante la grabación y gestionar las sesiones grabadas.
+ +Para comunicarle al sistema que tu servicio de entrada de TV permite la grabación, debes seguir +estos pasos:
+ +TvInputService.onCreate()
, crea un nuevo
+objeto TvInputInfo
usando la clase TvInputInfo.Builder
.
+TvInputInfo
, llama a
+setCanRecord(true)
antes de llamar a build()
para
+indicar que tu servicio permite la grabación.TvInputInfo
con el sistema llamando a
+TvInputService.updateTvInputInfo()
.Luego de que el servicio de entrada de TV registra la compatibilidad
+con la funcionalidad de grabación, el sistema llama a tu
+TvInputService.onCreateRecordingSession()
cuando necesita acceder
+a la implementación de grabación de tu aplicación. Implementa tu propia subclase
+TvInputService.RecordingSession
y devuélvela
+cuando el callback de onCreateRecordingSession()
+se dispare. Esta subclase es responsable de cambiar a los datos del canal correcto,
+de grabar los datos solicitados y de comunicar el estado y los errores de grabación al
+sistema.
Cuando el sistema llama a RecordingSession.onTune()
, pasando en un
+URI de canal, sintoniza el canal que el URI especifica. Notifícale al sistema que tu
+aplicación se ha sintonizado al canal deseado llamando a notifyTuned()
+o, si tu aplicación no pudo sintonizarse al canal correcto, llama a
+notifyError()
.
El sistema invoca, a continuación, el callback RecordingSession.onStartRecording()
.
+ Tu aplicación debe comenzar a grabar inmediatamente. Cuando el sistema invoca
+este callback, puede brindar un URI que contiene información sobre el programa
+que se está por grabar. Cuando finaliza la grabación, debes copiar estos
+datos a la tabla de datos RecordedPrograms
.
Finalmente, el sistema llama a RecordingSession.onStopRecording()
.
+En este momento, tu aplicación debe dejar de grabar inmediatamente. También debes crear
+una entrada en la tabla RecordedPrograms
. Esta entrada debe
+incluir el URI de datos de la sesión grabada en la columna
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
y cualquier información
+del programa que el sistema haya brindado en la llamada inicial a
+onStartRecording()
.
Para obtener más información sobre cómo acceder a la tabla RecordedPrograms
+, consulta Gestionar las sesiones grabadas.
Si ocurre un error durante la grabación que hace que los datos grabados no se puedan usar,
+notifica al sistema llamando aRecordingSession.notifyError()
.
+De forma similar, puedes llamar a notifyError()
después de que se cree una sesión de grabación
+para que el sistema sepa que la aplicación ya no puede grabar sesiones.
Si ocurre un error durante la grabación, pero deseas brindarle al usuario una grabación
+parcial usable para su reproducción, llama a
+RecordingSession.notifyRecordingStopped()
para permitir que el sistema
+use la sesión parcial.
El sistema mantiene información de todas las sesiones grabadas de todas
+las aplicaciones de canal con funcionalidad de grabación en la tabla de proveedor de contenido TvContract.RecordedPrograms
+. Esta información se accede mediante el URI de contenido
+RecordedPrograms.Uri
. Usa API de proveedor de contenido para
+leer, agregar y eliminar entradas de esta tabla.
Para obtener más información sobre cómo trabajar con datos del proveedor de contenido, consulta + +Conceptos básicos sobre el proveedor de contenido.
+ +Los dispositivos de TV tienen un almacenamiento limitado, de modo que debes ser cuidadoso a la hora
+de asignar el almacenamiento para guardar las sesiones grabadas. Usa
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
cuando
+no haya espacio suficiente para guardar una sesión grabada.
Cuando el usuario inicie la grabación, el registro de datos debe comenzar
+lo antes posible. Para facilitar este proceso, completa cualquier tarea anterior demandante,
+como acceder al espacio de almacenamiento y asignarlo, cuando el sistema invoque el
+callback onCreateRecordingSession()
. Hacerlo te permite comenzar
+a grabar inmediatamente cuando el callback onStartRecording()
+se dispare.
En Android N se ofrece compatibilidad con funciones del idioma Java 8 + que puedes usar al desarrollar aplicaciones orientadas a Android N. + En esta página se describen las funciones de idioma compatibles con la Android N + Preview, también la manera adecuada de configurar tu proyecto para usarlas y muchos problemas + conocidos que puedes experimentar. +
+ +Para comenzar a usar estas funciones, debes descargar y configurar Android +Studio 2.1 (muestra) y el Android N Preview SDK, en el que se incluyen el conjunto de herramientas +Jack y el complemento de Android para Gradle. Si aún no instalaste +el Android N Preview SDK, consulta Configuración para desarrollar con Android N.
+ + + ++ Nota: No es obligatorio usar las nuevas funciones del lenguaje Java 8 + para desarrollar aplicaciones orientadas a la plataforma de Android N. Si no + deseas escribir código con funciones del lenguaje Java 8, puedes mantener los valores de compatibilidad + de origen y destino de tu proyecto en Java 7, pero + debes usar JDK 8 para crear la compilación en función de la plataforma de Android N. +
+ ++ Actualmente, Android no admite todas las funciones del lenguaje Java 8. Sin embargo, las + siguientes características ahora se encuentran disponibles para el desarrollo de aplicaciones orientadas a la + Android N Preview: +
+ ++ A su vez, las siguientes API de funciones del lenguaje Java 8 ahora se encuentran disponibles: +
+ ++ Nota: la implementación de expresiones Lambda + de Android N se basa en clases anónimas. Este enfoque permite que + tengan compatibilidad con versiones anteriores y puedan ejecutarse en versiones anteriores de Android. Para probar + expresiones Lambda en versiones anteriores, recuerda acceder a tu archivo {@code + build.gradle} y fijar {@code compileSdkVersion} y {@code + targetSdkVersion} en 23 o un valor inferior. +
+ ++ Para usar las nuevas funciones del lenguaje Java 8, también debes usar el + nueva conjunto de herramientas Jack. Este nueva + conjunto de herramientas de Android permite compilar fuentes del lenguaje Java en código de bytes dex legible a través de + Android, también tiene su propio formato de biblioteca {@code .jack} y proporciona la mayoría de las funciones de conjunto de + herramientas como parte de una única herramienta: reempaquetado, reducción, alteración y + MultiDex. +
+ +A continuación, se muestra una comparación de los conjuntos de herramientas empleadas para generar archivos DEX de Android:
++ Si deseas habilitar las funciones del lenguaje Java 8 y de Jack para tu proyecto, escribe lo + siguiente en tu archivo específico de módulo {@code build.gradle}: +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Instant Run, presentado en Android Studio 2.0 (beta), actualmente no funciona + con Jack y permanecerá deshabilitado cuando se use el nuevo conjunto de herramientas. +
+ +Debido a que Jack no genera archivos de clase intermedia al compilar una +aplicación, las herramientas que dependen de estos archivos actualmente no funcionan con Jack. Algunos +ejemplos de estas herramientas:
+ +Si experimentas otros problemas al usar Jack, informa los errores.
\ No newline at end of file diff --git a/docs/html-intl/intl/es/preview/overview.jd b/docs/html-intl/intl/es/preview/overview.jd new file mode 100644 index 000000000000..6cd026a6c347 --- /dev/null +++ b/docs/html-intl/intl/es/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=Información general del programa +page.metaDescription=Prepara tus aplicaciones para la próxima versión de Android. +page.image=images/cards/card-n-overview_2x.png +meta.tags=“preview”, “desarrollador”, “Android” +page.tags="preview", "developer", "android" + +@jd:body + + ++ Bienvenido al plan de la Android N Developer Preview, un programa en el que + se ofrece todo lo que necesitas a fin de probar y optimizar tus aplicaciones para la próxima + versión de Android. Es gratis y puedes dar tus primeros pasos + descargando las herramientas de la N Developer Preview. +
+ + + + + + + ++ Ejecuta y prueba tus aplicaciones en varios dispositivos o en un emulador. + +
++ Durante la Preview, ofreceremos varias actualizaciones mensuales. De esta manera, realizarás tus pruebas con los últimos cambios de la plataforma. +
++ Durante las primeras semanas, daremos prioridad a los problemas informados por los desarrolladores; + por lo tanto, debes realizar las pruebas y enviar tus comentarios lo antes posible. +
++ Comienza a trabajar temprano para admitir los comportamientos de la nueva plataforma y realizar desarrollos con nuevas funciones. +
++ Actualizaciones inalámbricas sin inconvenientes para dispositivos admitidos a través del + Programa de Android beta. No se requieren actualizaciones. +
++ Informa los problemas y envíanos comentarios a través de nuestro + sistema de seguimiento de problemas. Conéctate con otros desarrolladores + en la + comunidad de desarrolladores de Android N. +
++ La N Developer Preview rige desde el 9 de marzo de 2016 hasta el lanzamiento público de Android N + para AOSP y OEM, previsto para el tercer trimestre de 2016. +
+ ++ En momentos claves del desarrollo, ofreceremos actualizaciones para tu entorno de desarrollo y + prueba. En general, podrás contar con una actualización por mes (intervalo de 4 a 6 + semanas). A continuación, se mencionan las versiones milestone: +
+ ++ En cada actualización se incluyen herramientas de SDK, imágenes de sistema de la muestra, emuladores, documentación de + referencia y diferencias de API. +
+ ++ En las primeras tres milestone de la muestra se proporciona un entorno + de prueba y desarrollo tempranos que te permitirá identificar + problemas de compatibilidad en tus aplicaciones actuales y planificar tareas relacionadas con la migración o las funciones + que se necesitan para orientar la nueva plataforma. Este será el período de prioridad en el cual nos + enviarás tus comentarios sobre funciones y problemas de compatibilidad de API y archivos; + para hacerlo, usa el sistema se seguimiento de + problemas. Podrás contar con cambios en las API en estas actualizaciones. +
+ ++ Entre las Preview 4 y 5, tendrás acceso a las API + y al SDK finales de Android N para tareas de desarrollo, y también a imágenes de sistema casi definitivas + para poner a prueba comportamientos y funciones del sistema. Durante este período, Android N ofrecerá un nivel de API + estándar. Puedes iniciar la prueba de compatibilidad de tus aplicaciones + heredadas y optimizar el código nuevo en el que se usen las API o funciones de Android N. +
+ ++ A su vez, a partir de la Preview 4, podrás publicar aplicaciones en + dispositivos con Android N cuyo nivel de API sea el oficial (por ejemplo, + dispositivos de consumidores inscritos en el Programa de Android beta). Puedes + realizar primero publicaciones en los canales alpha y beta de Google Play, a fin de probar + tus aplicaciones con consumidores de Android beta antes de proceder con la distribución a gran escala en la + tienda. +
+ ++ A medida que pruebes Android N y lo uses para tus desarrollos, te recomendamos enfáticamente mantener + actualizado tu entorno de desarrollo conforme se lancen actualizaciones de la + muestra. Para facilitar el proceso, puedes registrar tus dispositivos de prueba en el + Programa de Android Beta y obtener actualizaciones inalámbricas (OTA) en + cada versión milestone. Como alternativa, habrá disponibles imágenes de preview actualizadas que puedes + descargar y actualizar de manera manual. +
+ ++ Cuando haya disponibles las actualizaciones de la muestra, te informaremos a través del blog para desarrolladores de Android, de + este sitio y de la Comunidad de desarrolladores + de Android N. +
+ + ++ En la N Developer Preview se incluye todo lo que necesitas para probar tus aplicaciones + existentes con diferentes tamaños de pantalla, tecnologías de red, chipsets de CPU y GPU, + y arquitecturas de hardware. +
+ +Puedes descargar todos estos componentes a través de SDK Manager en Android Studio:
+ ++ Ofreceremos actualizaciones para estas herramientas de desarrollo en cada versión milestone según sea necesario. +
+ ++ En la N Developer Preview se incluyen, entre otras, imágenes de sistema del hardware de Nexus que puedes usar al + realizar pruebas y desarrollos en dispositivos físicos. Consulta la sección de imágenes de sistema para encontrar la lista completa + de imágenes de hardware. +
+ ++ Ofreceremos imágenes de sistema actualizadas para estos dispositivos en cada versión milestone. Puedes + descargar y actualizar manualmente las imágenes de sistema renovadas en tus dispositivos de prueba + con la frecuencia que desees. Esto resulta particularmente útil para entornos + de prueba automatizados en los cuales probablemente debas volver a actualizar tu dispositivo varias + veces. +
+ +Nota: + Los dispositivos actualizados de manera manual no recibirán actualizaciones OTA, como en la + muestra del año pasado. Este año, podrás recibir OTA registrando dispositivos en el + Programa de Android Beta. Consulta la sección siguiente para obtener información detallada. +
+ ++ Como novedad en Android N, se ofrece un programa de actualización inalámbrica (OTA) que + proporciona las últimas actualizaciones de las muestras de Android N directamente para dispositivos registrados + en él. Es gratuito y está pensado para quienes tengan dispositivos + compatibles registrados en sus cuentas de Google. +
+ ++ Para el registro, visita el sitio del Programa de Android + beta. En él, verás + todos los dispositivos registrados en tu cuenta que cumplen con los requisitos para registrarse en + el programa. +
+ ++ Una vez que realices el registro, tu dispositivo recibirá pronto una actualización. En la mayoría de los casos, + no necesitarás restablecer por completo tus datos para la migración a Android N, pero + te recomendamos hacer una copia de respaldo de los datos que no desees perder antes de + registrar el dispositivo. +
+ ++ A medida que tu dispositivo reciba actualizaciones, te recomendamos descargarlas e + instalarlas lo más pronto posible. Te convendrá mantenerte actualizado respecto de + las últimas modificaciones en la IU, el comportamiento, las API y las funciones del sistema. +
+ ++ Al finalizar la Developer Preview, tus dispositivos registrados + recibirán una actualización a la versión oficial de Android N. +
+ ++ Puedes dar de baja tus dispositivos del Programa de Android beta en cualquier momento desde el + sitio de Android beta. Antes de hacerlo, asegúrate de realizar una copia de respaldo de los datos de tu + dispositivo. +
+ +Nota: + Cuando des de baja tu dispositivo, este se someterá a un restablecimiento de fábrica + a través del cual se cargará la última versión + de Android 6.0 Marshmallow (no necesariamente la versión + instalada antes del registro). Para garantizar que la instalación sea nueva, + se borrarán tus datos del dispositivo; entre otros, los contactos, los mensajes y + las fotos. +
+ ++ Los siguientes recursos de documentación se encuentran disponibles en el sitio Developer Preview y con ellos + podrás obtener información sobre Android N: +
+ ++ Durante las actualizaciones de la muestra, puedes descargar la + Referencia de la API + más reciente para la plataforma de Android N como un archivo .zip separado. En esta descarga + también se incluye un informe de diferencias que te permite identificar cambios en la API + en comparación con la API 23 y la actualización anterior. +
+ ++ Cuando las API de Android N sean definitivas y se asigne el nivel de API oficial, + te proporcionaremos la referencia de la API en línea en https://developer.android.com. +
+ ++ A medida que realices pruebas y desarrollos con la N Developer Preview, recurre a los siguientes canales + para informar problemas y enviar comentarios. +
+ +
+ En la N Developer Preview se proporciona un sistema exclusivo para desarrollo y una biblioteca
+ de Android cuyo nivel de API no es estándar. Si deseas
+ no incluir comportamientos de compatibilidad para probar tu aplicación (muy
+ recomendado), puedes orientar la versión preview de Android N fijando el valor de
+ targetSdkVersion
+ de tu aplicación en “N”
.
+
+ La Android N Developer Preview ofrece las API de preview; + estas no serán oficiales hasta el lanzamiento de la versión definitiva del SDK, + actualmente previsto para el tercer trimestre de 2016. Esto significa que podrás + contar con cambios menores en las API conforme pase el tiempo, en especial durante + las primeras semanas del programa. Te proporcionaremos un resumen de cambios con + cada actualización de la Android N Developer Preview. +
+ ++ Nota: Aunque las API de la muestra pueden modificarse, los comportamientos del sistema + subyacente permanecen estables y disponibles para cualquier prueba + inmediata. +
+ ++ Google Play evita la publicación de aplicaciones orientadas a la N Developer + Preview. Cuando esté disponible el SDK definitivo de Android N, podrás + apuntar hacia el nivel de API oficial de Android N y publicar tu aplicación en Google + Play a través de los canales para versiones alpha y beta. Mientras tanto, si deseas + distribuir una aplicación orientada a Android N para testers, puedes hacerlo por correo electrónico o + mediante descarga directa desde tu sitio. +
+ ++ Cuando se lance la versión completa de Android N para AOSP y OEM, evento previsto para el tercer trimestre de 2016, + podrás publicar tus aplicaciones orientadas a Android N en el canal de lanzamientos + públicos de Google Play. +
+ + ++ Para comenzar a probar tu aplicación con Android N: +
+ ++ ¡Te agradecemos por participar de la Android N Developer Preview! +
diff --git a/docs/html-intl/intl/es/preview/samples.jd b/docs/html-intl/intl/es/preview/samples.jd new file mode 100644 index 000000000000..0c271f6fd650 --- /dev/null +++ b/docs/html-intl/intl/es/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=Ejemplos +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ Los siguientes ejemplos de código se proporcionan para Android N. Para + descargarlos en Android Studio, selecciona la opción de menú File > Import + Samples. +
+ ++ Nota: Estos proyectos descargables están diseñados + para usarse con Gradle y Android Studio. +
+ + ++ En este ejemplo se muestra la manera de aprovechar interfaces de usuario + de ventanas múltiples con tu aplicación. +
+ + + ++ Este es un ejemplo preexistente en el cual se muestra un servicio simple que envía + notificaciones con NotificationCompat. Cada conversación no leída + se envía como una notificación diferente. +
++ Este ejemplo se actualizó para aprovechar nuevas funciones de notificación + disponibles en Android N. +
+ + + ++ Este es un ejemplo preexistente en el que se demuestra la manera de usar + NotificationManager para indicar la cantidad de notificaciones que se aparecen actualmente en una + aplicación. +
++ Este ejemplo se actualizó para aprovechar nuevas funciones de notificación + disponibles en Android N. +
+ + + ++ En este ejemplo se demuestra la manera de almacenar datos, y de acceder a ellos, en un medio de almacenamiento cifrado por + dispositivo que esté siempre disponible mientras el dispositivo se haya iniciado. +
+ + + ++ En este ejemplo se demuestra la manera de leer y escribir datos de + directorios específicos y, al mismo tiempo, evitar más permisos. +
+ \ No newline at end of file diff --git a/docs/html-intl/intl/es/preview/setup-sdk.jd b/docs/html-intl/intl/es/preview/setup-sdk.jd new file mode 100644 index 000000000000..4ccc4f814b7f --- /dev/null +++ b/docs/html-intl/intl/es/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=Configuración de la Preview +meta.keywords=“preview”, “Android” +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +A fin de desarrollar aplicaciones para la Android N Preview, debes aplicar algunas actualizaciones +a tu entorno de desarrollo, como se describe en esta página.
+ +Para solo probar la compatibilidad de tu aplicación en la +imagen de sistema de Android N, sigue la guía de Prueba en un dispositivo Android N.
+ + + + +La plataforma de Android N agrega compatibilidad para funciones de lenguaje de Java 8, +que requieren un nuevo compilador llamado Jack. La última versión de Jack +actualmente solo es compatible con Android Studio 2.1. Por lo tanto, si deseas +usar funciones de lenguaje de Java 8, debes usar Android Studio 2.1 para +crear tu aplicación. De lo contrario, no necesitarás el compilador Jack, pero +deberás aplicar una actualización a JDK 8 para compilar tu proyecto en función a la plataforma de Android N, +según lo descrito a continuación. +
+ + + +Android Studio 2.1 actualmente se encuentra disponible como muestra en el canal de +versiones Canary. Si ya +cuentas con Android Studio y no deseas realizar la actualización al canal Canary, puedes +descargar Android Studio 2.1 como una instalación independiente, usarlo +para desarrollar aplicaciones con Android N y así dejar el entorno Android Studio +inalterado.
+ +Para descargar Android Studio 2.1 como una instalación independiente, sigue estos +pasos (si deseas recibir Android Studio 2.1 como una actualización a tu +instalación existente, omite el paso 4):
+ +Mantén esta ventana de configuración abierta para el paso siguiente.
+ + +Para comenzar a desarrollar proyectos con las API de Android N, debes instalar el +Android N Preview SDK en Android Studio de la siguiente manera:
+ ++ En la documentación de referencia de la Android N Preview, se encuentra disponible información + detallada acerca de las API de Android N. Puedes descargar la documentación de la tabla siguiente. + Este paquete contiene una versión abreviada y de uso sin conexión del sitio web para desarrolladores + de Android, y en ella se incluyen una referencia de API actualizada para las API de Android N y un + informe de diferencia de API. +
+ +Documentación | +Sumas de comprobación | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
Perangkat | +Unduhan / Checksum | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ Jika Anda ingin menghapus instalasi Preview dari perangkat, Anda bisa melakukannya dengan salah satu cara + ini:
++ Perangkat akan menerima pembaruan OTA ke versi + produksi terbaru Android yang tersedia untuk perangkat itu (misalnya, Android 6.0 Marshmallow). + Pembaruan mengharuskan pengaturan ulang perangkat secara penuh, jadi data pengguna pada perangkat itu + akan dihapus. Pastikan mencadangkan data penting sebelum + membatalkan pendaftaran perangkat. +
+Catatan: + Menghapus instalasi citra sistem Developer Preview sebelum + program berakhir akan mengharuskan perangkat diatur ulang secara penuh dan menghapus semua data pengguna + pada perangkat. +
+ + +Untuk menggunakan Android Emulator guna menjalankan Android N Preview, Anda perlu +mengunduh Android N Preview SDK dan membuat perangkat maya untuk +emulator.
+ +Pertama, unduh Android N Preview SDK sebagai berikut (jika +Anda sudah memperolehnya saat menyiapkan +pengembangan Android N, Anda bisa melewatkan bagian ini): + +
Sekarang Anda seharusnya telah memiliki Android SDK Built-Tools 24.0 0 rc1, +Platform-Tools 24.0.0 rc1, dan SDK Tools +25.0.9. Jika Anda tidak memperbarui SDK Tools ke 25.0.9, maka Anda tidak akan +dapat menjalankan citra sistem x86_64 untuk Android N.
+ + +Sekarang buatlah perangkat maya dengan citra sistem Android N:
+ +Anda sekarang bisa meluncurkan Emulator Android dengan Android N Preview AVD.
+ ++Untuk mendapatkan pengalaman terbaik di Android Emulator, instal +Android Studio 2.1 Preview, yang mendukung Android Emulator 2.0 Beta +dengan kinerja jauh lebih cepat dibandingkan Emulator di +Android Studio 1.5.
+ +Catatan: + Jika Anda saat ini menggunakan Android Studio 2.0 Beta, maka ada masalah yang telah diketahui + yang mencegah Anda membuat AVD dengan citra sistem N Preview, jadi + Anda saat ini perlu menggunakan preview Android Studio 2.1 untuk membuat AVD. +
+ +Untuk informasi selengkapnya tentang membuat perangkat maya, lihat Mengelola Perangkat Maya. +
+ + + + + + + + + + + + + + ++ Proses latar belakang bisa menguras memori dan baterai. Misalnya, sebuah + siaran implisit dapat memulai banyak proses latar belakang yang telah didaftarkan + untuk mendengarkannya, sekalipun proses-proses itu mungkin tidak melakukan banyak pekerjaan. Ini bisa + berdampak besar pada kinerja perangkat dan pengalaman pengguna. +
+ ++ Untuk meminimalkan masalah ini, N Developer Preview menerapkan pembatasan + berikut: +
+ ++ Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan + siaran implisit ini. Misalnya, {@link android.app.job.JobScheduler} + dan + {@code GcmNetworkManager} menyediakan mekanisme yang tangguh untuk menjadwalkan operasi + jaringan bila kondisi yang ditetapkan, seperti koneksi ke jaringan + berbiaya tetap, terpenuhi. Anda sekarang juga bisa menggunakan {@link android.app.job.JobScheduler} + untuk bereaksi terhadap perubahan penyedia konten. Objek {@link android.app.job.JobInfo} + membungkus parameter yang digunakan {@link android.app.job.JobScheduler} + untuk menjadwalkan pekerjaan Anda. Bila syarat-syarat pekerjaan sudah terpenuhi, sistem + akan mengeksekusi pekerjaan ini pada {@link android.app.job.JobService} aplikasi Anda. +
+ ++ Dalam dokumen ini, kita akan mempelajari cara menggunakan metode alternatif, seperti + {@link android.app.job.JobScheduler}, untuk menyesuaikan aplikasi Anda dengan pembatasan + yang baru. +
+ ++ Aplikasi yang menargetkan N Developer Preview tidak menerima siaran {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka + mendaftar untuk menerimanya dalam manifes mereka, dan proses yang bergantung pada siaran + ini tidak akan dimulai. Hal ini bisa menimbulkan masalah bagi aplikasi yang ingin + mendengarkan perubahan jaringan atau melakukan aktivitas jaringan dalam jumlah besar bila perangkat + menghubungkan ke jaringan berbiaya tetap. Beberapa solusi untuk menyiasati pembatasan + ini sudah ada dalam kerangka kerja Android, namun pemilihan solusi + yang tepat bergantung pada apa yang ingin dicapai oleh aplikasi Anda. +
+ ++ Catatan: Sebuah {@link android.content.BroadcastReceiver} yang didaftarkan dengan + {@link android.content.Context#registerReceiver Context.registerReceiver()} + akan terus menerima siaran ini saat aplikasi berada di latar depan. +
+ ++ Saat menggunakan kelas {@link android.app.job.JobInfo.Builder JobInfo.Builder} + untuk membuat objek {@link android.app.job.JobInfo} Anda, terapkan metode {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} dan teruskan {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} sebagai parameter pekerjaan. Contoh kode berikut + menjadwalkan layanan yang akan dijalankan bila perangkat menghubungkan ke jaringan + berbiaya tetap dan saat mengisi baterai: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ Bila syarat untuk pekerjaan Anda terpenuhi, aplikasi Anda akan menerima callback untuk menjalankan + metode {@link android.app.job.JobService#onStartJob onStartJob()} dalam + {@code JobService.class} yang ditetapkan. Untuk melihat contoh selengkapnya mengenai implementasi {@link + android.app.job.JobScheduler}, lihat aplikasi contoh JobScheduler. +
+ ++ Aplikasi yang menggunakan layanan GMSCore, dan menargetkan Android 5.0 (API tingkat 21) + atau lebih rendah, bisa menggunakan + {@code GcmNetworkManager} dan menetapkan {@code Task.NETWORK_STATE_UNMETERED}. +
+ ++ Aplikasi yang berjalan di latar depan tetap bisa mendengarkan {@code + CONNECTIVITY_CHANGE} dengan {@link + android.content.BroadcastReceiver} yang didaftarkan. Akan tetapi, {@link + android.net.ConnectivityManager} API menyediakan metode yang lebih tangguh untuk meminta + callback hanya bila syarat jaringan yang ditetapkan terpenuhi. +
+ ++ Objek {@link android.net.NetworkRequest} mendefinisikan parameter + callback jaringan dari segi {@link android.net.NetworkCapabilities}. Anda + membuat objek {@link android.net.NetworkRequest} dengan kelas {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} + kemudian meneruskan objek {@link android.net.NetworkRequest} ke sistem. Bila + syarat jaringan terpenuhi, aplikasi akan menerima callback untuk mengeksekusi + metode {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} yang didefinisikan dalam kelas {@link + android.net.ConnectivityManager.NetworkCallback}. +
+ ++ Aplikasi akan terus menerima callback hingga aplikasi keluar atau memanggil + {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()}. +
+ ++ Di N Developer Preview, aplikasi tidak dapat mengirim atau menerima siaran {@link + android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link + android.hardware.Camera#ACTION_NEW_VIDEO}. Pembatasan ini membantu + meminimalkan dampak negatif terhadap kinerja dan pengalaman pengguna bila beberapa aplikasi harus + aktif untuk memproses gambar atau video baru. N Developer Preview + menambahkan {@link android.app.job.JobInfo} dan {@link + android.app.job.JobParameters} untuk memberikan solusi alternatif. +
+ ++ Untuk memicu pekerjaan saat perubahan URI konten, N Developer Preview menambahkan + {@link android.app.job.JobInfo} API dengan metode berikut: +
+ ++ Catatan: {@code TriggerContentUri()} tidak bisa digunakan + bersama-sama dengan {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} atau {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()}. Untuk terus memantau perubahan konten, jadwalkan + {@link android.app.job.JobInfo} baru sebelum {@link + android.app.job.JobService} aplikasi selesai menangani callback terbaru. +
+ ++ Kode contoh berikut menjadwalkan pekerjaan yang akan dipicu bila sistem melaporkan + perubahan ke URI konten, {@code MEDIA_URI}: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ Bila sistem melaporkan perubahan dalam URI konten yang ditetapkan, aplikasi Anda + akan menerima callback dan objek {@link android.app.job.JobParameters} + akan diteruskan ke metode {@link android.app.job.JobService#onStartJob onStartJob()} + dalam {@code MediaContentJob.class}. +
+ ++ N Developer Preview juga menambahkan {@link android.app.job.JobParameters} untuk + memungkinkan aplikasi Anda menerima informasi yang berguna tentang otoritas konten + dan URI yang memicu pekerjaan: +
+ ++ Kode contoh berikut mengesampingkan metode {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} dan + mencatat otoritas konten serta URI yang telah memicu pekerjaan: +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ Mengoptimalkan aplikasi Anda untuk berjalan pada perangkat minim memori, atau dalam kondisi + minim memori, bisa meningkatkan kinerja dan pengalaman pengguna. Menghilangkan + dependensi pada layanan latar belakang dan penerima siaran + implisit yang terdaftar secara statis bisa membantu aplikasi Anda berjalan lebih baik pada perangkat demikian. Meskipun + N Developer Preview telah mengambil langkah-langkah untuk mengurangi sebagian masalah ini, Anda disarankan + agar mengoptimalkan aplikasi untuk berjalan tanpa menggunakan + proses latar belakang ini seluruhnya. +
+ ++ N Developer Preview memperkenalkan beberapa tambahan perintah Android Debug Bridge (ADB) yang + bisa Anda gunakan untuk menguji perilaku aplikasi dengan proses latar belakang dinonaktifkan: +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N berjalan dalam mode Direct Boot yang aman +bila perangkat telah dihidupkan namun pengguna tidak membuka +kunci perangkat. Untuk mendukung hal ini, sistem menyediakan dua lokasi penyimpanan untuk data:
+ +Secara default, aplikasi tidak berjalan selama mode Direct Boot. +Jika aplikasi Anda perlu melakukan tindakan selama mode Direct Boot, Anda bisa mendaftarkan +komponen aplikasi yang harus dijalankan selama mode ini. Beberapa kasus penggunaan umum +untuk aplikasi yang perlu dijalankan selama mode Direct Boot antara lain:
+ +Jika aplikasi Anda perlu mengakses data saat dijalankan dalam mode Direct Boot, gunakan +penyimpanan yang dienkripsi dengan perangkat. Penyimpanan yang dienkripsi dengan perangkat berisi data +yang dienkripsi dengan kunci yang hanya tersedia setelah perangkat melakukan +boot yang berhasil diverifikasi.
+ +Untuk data yang harus dienkripsi dengan kunci yang dikaitkan dengan kredensial +pengguna, seperti PIN atau kata sandi, gunakan penyimpanan yang dienkripsi dengan kredensial. +Penyimpanan yang dienkripsi dengan kredensial hanya tersedia setelah pengguna berhasil +membuka kunci perangkat, hingga saat pengguna menghidupkan ulang perangkat lagi. Jika +pengguna mengaktifkan layar kunci setelah membuka kunci perangkat, hal ini tidak akan mengunci +penyimpanan yang dienkripsi dengan kredensial.
+ +Aplikasi harus mendaftarkan komponennya pada sistem agar
+bisa berjalan selama mode Direct Boot atau mengakses
+penyimpanan yang dienkripsi dengan perangkat. Aplikasi mendaftar pada sistem dengan menandai komponen sebagai
+peka enkripsi. Untuk menandai komponen Anda sebagai peka enkripsi, atur atribut
+android:encryptionAware
ke true dalam manifes Anda.
+ +
Komponen yang peka enkripsi bisa mendaftar untuk menerima pesan siaran
+LOCKED_BOOT_COMPLETED
dari
+sistem bila perangkat telah dihidupkan ulang. Pada tahap ini
+penyimpanan yang dienkripsi dengan perangkat akan tersedia, dan komponen Anda bisa mengeksekusi tugas-tugas yang perlu
+dijalankan selama mode Direct Boot, seperti memicu alarm yang terjadwal.
Cuplikan kode berikut adalah contoh cara mendaftarkan
+{@link android.content.BroadcastReceiver} sebagai peka enkripsi, dan menambahkan sebuah
+filter intent untuk LOCKED_BOOT_COMPLETED
, dalam manifes aplikasi:
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
Setelah pengguna membuka kunci perangkat, semua komponen bisa mengakses +penyimpanan yang dienkripsi dengan perangkat serta penyimpanan yang dienkripsi dengan kredensial.
+ +Untuk mengakses penyimpanan yang dienkripsi dengan perangkat, buat instance
+{@link android.content.Context} kedua dengan memanggil
+Context.createDeviceEncryptedStorageContext()
. Semua panggilan
+API penyimpanan yang dibuat menggunakan konteks ini akan mengakses penyimpanan yang dienkripsi dengan perangkat. Contoh
+berikut mengakses penyimpanan yang dienkripsi dengan perangkat dan membuka file data aplikasi
+yang ada:
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
Gunakan penyimpanan yang dienkripsi dengan perangkat hanya untuk +informasi yang harus bisa diakses selama mode Direct Boot. +Jangan gunakan penyimpanan yang dienkripsi dengan perangkat sebagai penyimpanan terenkripsi serba guna. +Untuk informasi pengguna yang bersifat pribadi, atau data terenkripsi yang tidak diperlukan selama +mode Direct Boot, gunakan penyimpanan yang dienkripsi dengan kredensial.
+ +Setelah pengguna membuka kunci perangkat setelah restart, aplikasi Anda bisa beralih untuk +mengakses penyimpanan yang dienkripsi dengan kredensial dan menggunakan layanan sistem biasa yang +bergantung pada kredensial pengguna.
+ +Agar diberi tahu bila pengguna membuka kunci perangkat setelah reboot,
+daftarkan {@link android.content.BroadcastReceiver} dari komponen yang berjalan
+untuk mendengarkan pesan ACTION_USER_UNLOCKED
. Atau, Anda bisa
+menerima pesan {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} yang ada, yang sekarang menunjukkan bahwa perangkat telah dihidupkan dan
+pengguna telah membuka kunci perangkat.
Anda bisa langsung melakukan query apakah pengguna telah membuka kunci perangkat dengan memanggil
+UserManager.isUserUnlocked()
.
Jika pengguna memperbarui perangkat mereka untuk menggunakan mode Direct Boot,
+data Anda yang ada mungkin perlu dipindahkan ke penyimpanan yang dienkripsi dengan perangkat. Gunakan
+Context.migrateSharedPreferencesFrom()
dan
+Context.migrateDatabaseFrom()
untuk memindahkan data preferensi dan
+database antara penyimpanan yang dienkripsi dengan kredensial dan penyimpanan yang dienkripsi dengan perangkat.
Pertimbangkan dengan baik saat memutuskan data apa yang akan dipindahkan dari +penyimpanan yang dienkripsi dengan kredensial ke penyimpanan yang dienkripsi dengan perangkat. Anda sebaiknya tidak memindahkan +informasi pengguna yang bersifat rahasia, seperti kata sandi atau token otorisasi, ke +penyimpanan yang dienkripsi dengan perangkat. Dalam beberapa skenario, Anda mungkin perlu mengelola +set data terpisah pada dua tempat penyimpanan yang dienkripsi.
+ +Uji aplikasi peka enkripsi Anda menggunakan mode Direct Boot baru. Ada +dua cara untuk mengaktifkan Direct Boot.
+ +Perhatian: Mengaktifkan Direct Boot +akan menghapus semua data pengguna pada perangkat.
+ +Pada perangkat yang didukung dengan Android N terinstal, aktifkan +Direct Boot dengan melakukan salah satu hal berikut:
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
Mode emulasi Direct Boot juga tersedia, jika Anda perlu mengganti +mode pada perangkat pengujian. Mode emulasi sebaiknya hanya digunakan selama +pengembangan dan bisa menyebabkan kehilangan data. Untuk mengaktifkan mode emulasi Direct Boot, +atur pola kunci pada perangkat, pilih "No thanks" jika ditanya mengenai +layar start-up aman saat menetapkan pola kunci, kemudian gunakan +perintah shell adb berikut:
+ ++$ adb shell sm set-emulate-fbe true ++ +
Untuk menonaktifkan mode emulasi Direct Boot, gunakan perintah berikut:
+ ++$ adb shell sm set-emulate-fbe false ++ +
Menggunakan perintah ini akan menyebabkan perangkat melakukan reboot.
diff --git a/docs/html-intl/intl/in/preview/features/icu4j-framework.jd b/docs/html-intl/intl/in/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..5b7547f83712 --- /dev/null +++ b/docs/html-intl/intl/in/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=ICU4J Android Framework API + +@jd:body + ++ ICU4J merupakan serangkaian pustaka Java sumber terbuka yang banyak digunakan dan menyediakan Unicode + serta dukungan globalisasi untuk aplikasi perangkat lunak. Android N + mengekspos subset ICU4J API dalam kerangka kerja Android bagi pengembang aplikasi + untuk digunakan pada paket {@code android.icu}. API ini menggunakan + data pelokalan yang ada pada perangkat. Hasilnya, Anda bisa mengurangi footprint + APK dengan tidak mengompilasi pustaka ICU4J ke APK Anda; sebagai gantinya, + cukup memanggilnya dalam kerangka kerja. (Dalam hal ini, Anda mungkin perlu menyediakan + beberapa versi + APK Anda, sehingga pengguna yang menjalankan versi Android lebih rendah dari Android N + bisa mengunduh versi aplikasi yang berisi pustaka ICU4J.) +
+ ++ Dokumen ini diawali dengan menyediakan beberapa informasi dasar tentang level API Android + minimum yang diperlukan untuk mendukung pustaka-pustaka ini. Kemudian dijelaskan tentang apa + yang perlu Anda ketahui tentang implementasi ICU4J spesifik Android. Terakhir, + Anda akan diberi tahu cara menggunakan ICU4J API dalam kerangka kerja Android. +
+ +
+ Android N mengekspos subset ICU4J API lewat
+ paket android.icu
, bukannya com.ibm.icu
. Kerangka kerja
+ Android dapat memilih untuk tidak
+ mengekspos ICU4J API karena berbagai alasan; misalnya, Android N tidak mengekspos
+ beberapa API yang tidak digunakan lagi atau yang dinyatakan belum
+ stabil oleh tim ICU. Karena tim ICU tidak lagi menggunakan API di masa mendatang, Android juga akan menandainya
+ sebagai tidak digunakan lagi namun akan terus menyertakannya.
+
Level API Android | +Versi ICU | +Versi CLDR | +
---|---|---|
Android N | +56 | +28 | +
Inilah beberapa hal penting yang harus diperhatikan:
+ +
+ Jika Anda sudah menggunakan ICU4J API dalam aplikasi, dan
+ android.icu
API memenuhi persyaratan Anda, maka migrasi ke
+ API kerangka kerja mengharuskan Anda untuk mengubah impor Java
+ dari com.ibm.icu
ke android.icu
. Kemudian Anda bisa
+ menghapus salinan file ICU4J dari APK.
+
+ Catatan: API kerangka kerja ICU4J menggunakan namespace {@code android.icu} + sebagai ganti {@code com.ibm.icu}. Hal ini untuk menghindari konflik + namespace di APK yang berisi pustaka {@code com.ibm.icu} sendiri. +
+ +
+ Beberapa kelas dalam paket java
dan android
memiliki
+ padanannya dengan yang ditemukan di ICU4J. Akan tetapi, ICU4J seringkali menyediakan dukungan
+ yang lebih luas untuk standar dan bahasa.
+
Inilah beberapa contoh untuk membantu Anda memulai:
+Kelas | +Alternatif | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J dirilis dengan lisensi ICU. Untuk detailnya, lihat Panduan Pengguna + ICU. +
diff --git a/docs/html-intl/intl/in/preview/features/multi-window.jd b/docs/html-intl/intl/in/preview/features/multi-window.jd new file mode 100644 index 000000000000..f879dc5ad0ac --- /dev/null +++ b/docs/html-intl/intl/in/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=Dukungan Multi-Jendela +page.metaDescription=Dukungan baru di Android N untuk menampilkan lebih dari satu aplikasi sekaligus. +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N menambahkan dukungan untuk menampilkan lebih dari satu aplikasi + sekaligus. Pada perangkat genggam, dua aplikasi bisa berjalan berdampingan atau + atas-bawah dalam mode layar terbagi. Pada perangkat TV, aplikasi bisa + menggunakan mode gambar-dalam-gambar untuk melanjutkan pemutaran video selagi pengguna + berinteraksi dengan aplikasi lain. +
+ ++ Jika Anda membangun aplikasi Anda dengan N Preview SDK, Anda bisa mengonfigurasi cara aplikasi + menangani tampilan multi-jendela. Misalnya, Anda bisa menetapkan dimensi + minimum yang diizinkan aktivitas Anda. Anda juga bisa menonaktifkan tampilan multi-jendela untuk + aplikasi, sehingga memastikan sistem hanya menampilkan aplikasi Anda dalam mode + layar penuh. +
+ ++ Android N memungkinkan beberapa aplikasi berbagi layar sekaligus. Misalnya, + pengguna bisa membagi layar, melihat halaman web di sisi kiri + sambil menulis email di sisi kanan. Pengalaman pengguna bergantung pada + perangkat: +
+ ++ Pengguna bisa beralih ke mode multi-jendela dengan cara berikut: +
+ ++ Pengguna bisa menyeret dan + meletakkan data dari aktivitas satu ke aktivitas lain sewaktu aktivitas berbagi + layar. (Sebelumnya, pengguna hanya bisa menyeret dan meletakkan data dalam aktivitas + tunggal.) +
+ ++ Mode multi-jendela tidak mengubah daur hidup + aktivitas. +
+ ++ Dalam mode multi-jendela, hanya aktivitas yang paling sering digunakan pengguna + yang akan aktif pada waktu tertentu. Aktivitas ini dianggap teratas. + Semua aktivitas lainnya dalam keadaan berhenti sementara, sekalipun terlihat. + Akan tetapi, sistem memberikan aktivitas, yang berhenti-sementara-namun-terlihat ini, prioritas lebih tinggi + daripada aktivitas yang tidak terlihat. Jika pengguna berinteraksi dengan salah satu + aktivitas yang berhenti sementara, aktivitas tersebut akan dilanjutkan kembali, dan aktivitas + teratas sebelumnya akan dihentikan sementara. +
+ ++ Catatan: Dalam mode multi-jendela, aplikasi bisa berada dalam keadaan berhenti sementara + dan masih terlihat oleh pengguna. Sebuah aplikasi mungkin perlu melanjutkan aktivitasnya + bahkan saat berhenti sementara. Misalnya, aplikasi pemutar video yang ada dalam + mode berhenti sementara namun terlihat harus tetap menampilkan videonya. Karena alasan + ini, kami menyarankan aktivitas yang memutar videotidak menghentikan sementara video + dalam handler {@link android.app.Activity#onPause onPause()} mereka. + Sebagai gantinya, aktivitas itu harus menghentikan sementara video di {@link android.app.Activity#onStop + onStop()}, dan melanjutkan pemutaran di {@link android.app.Activity#onStart + onStart()}. +
+ ++ Bila pengguna menempatkan aplikasi dalam mode multi-jendela, sistem akan memberi tahu + aktivitas tersebut mengenai perubahan konfigurasi, sebagaimana ditetapkan dalam Menangani Perubahan + Runtime. Pada dasarnya, perubahan ini memiliki implikasi siklus hidup aktivitas yang sama + seperti saat sistem memberi tahu aplikasi bahwa perangkat telah beralih + dari mode potret ke mode lanskap, kecuali dimensi perangkat + telah berubah sebagai ganti bertukar posisi. Seperti yang dibahas di Menangani Perubahan + Runtime, aktivitas Anda bisa menangani perubahan konfigurasi itu sendiri, atau + mengizinkan sistem memusnahkan aktivitas dan membuatnya kembali dengan dimensi + baru. +
+ +
+ Jika pengguna mengubah ukuran jendela dan membuat dimensinya jadi lebih besar, sistem
+ akan mengubah ukuran aktivitas untuk menyesuaikan dengan tindakan pengguna dan mengeluarkan perubahan runtime
+ sebagaimana diperlukan. Jika aplikasi tertinggal dari gambar di bidang yang baru saja diekspos,
+ sistem untuk sementara akan mengisi bidang tersebut dengan warna yang ditetapkan oleh atribut {@link
+ android.R.attr#windowBackground windowBackground} atau dengan atribut gaya
+ windowBackgroundFallback
secara default.
+
+ Jika aplikasi Anda menargetkan Android N, Anda bisa mengonfigurasi bagaimana dan + apakah aktivitas aplikasi Anda mendukung tampilan multi-jendela. Anda bisa mengatur + atribut dalam manifes untuk mengontrol ukuran dan layoutnya. + Pengaturan atribut aktivitas root berlaku untuk semua aktivitas + dalam tumpukan tugasnya. +
+ ++ Catatan: Jika Anda membangun aplikasi multi-orientasi dengan versi + SDK lebih rendah dari Android N, dan pengguna menggunakan aplikasi + dalam mode multi-jendela, sistem akan mengubah ukuran aplikasi secara paksa. Sistem akan menampilkan kotak + dialog yang memperingatkan pengguna bahwa aplikasi mungkin berperilaku tidak terduga. Sistem + tidak mengubah ukuran aplikasi yang berorientasi tetap; jika + pengguna berusaha membuka aplikasi berorientasi tetap saat mode multi-jendela, + aplikasi akan menggunakan seluruh layar. +
+ +
+ Atur atribut ini dalam manifes <activity>
Anda atau simpul
+ <application>
untuk mengaktifkan atau menonaktifkan tampilan
+ multi-jendela:
+
+android:resizeableActivity=["true" | "false"] ++ +
+ Jika atribut ini diatur ke true, aktivitas bisa dijalankan di + mode layar terbagi dan mode bentuk bebas. Jika atribut ini diatur ke false, aktivitas + tidak akan mendukung mode multi-jendela. Jika nilai ini false, dan pengguna + berusaha memulai aktivitas dalam mode multi-jendela, aktivitas akan menggunakan + layar penuh. +
+ ++ Jika aplikasi Anda menargetkan Android N, namun Anda tidak menetapkan nilai + untuk atribut ini, nilai atribut default adalah true. +
+ +
+ Atur atribut ini dalam simpul <activity>
manifes Anda untuk
+ menunjukkan apakah aktivitas mendukung tampilan gambar-dalam-gambar. Atribut ini
+ diabaikan jika android:resizeableActivity
bernilai false.
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ Dengan Android N, elemen manifes <layout>
+ mendukung beberapa atribut yang memengaruhi cara aktivitas berperilaku dalam
+ mode multi-jendela:
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + Misalnya, kode berikut menampilkan cara menetapkan ukuran dan lokasi default + aktivitas, dan ukuran minimumnya, bila aktivitas ditampilkan dalam + mode bentuk bebas: +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N menawarkan fungsionalitas baru untuk mendukung aplikasi yang bisa berjalan + dalam mode multi-jendela. +
+ ++ Fitur tertentu akan dinonaktifkan atau diabaikan bila perangkat berada dalam mode + multi-jendela, karena dianggap tidak logis bagi suatu aktivitas yang mungkin berbagi + layar perangkat dengan aktivitas atau aplikasi lainnya. Fitur tersebut meliputi: + +
android:screenOrientation
.
+ + Metode baru berikut telah ditambahkan ke kelas {@link android.app.Activity} + untuk mendukung tampilan multi-jendela. Untuk mengetahui detail tentang setiap metode, lihat + Referensi N Preview SDK. +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ Catatan: Mode gambar-dalam-gambar adalah kasus khusus pada
+ mode multi-jendela. Jika myActivity.inPictureInPicture()
+ mengembalikan nilai true, maka myActivity.inMultiWindow()
juga mengembalikan nilai
+ true.
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ Ada juga versi {@link android.app.Fragment} untuk setiap
+ metode ini, misalnya Fragment.inMultiWindow()
.
+
+ Untuk menempatkan aktivitas dalam mode gambar-dalam-gambar, panggil metode baru
+ Activity.enterPictureInPicture()
. Metode ini tidak berpengaruh jika
+ perangkat tidak mendukung mode gambar-dalam-gambar. Untuk informasi selengkapnya,
+ lihat dokumentasi Gambar-dalam-Gambar.
+
+ Bila meluncurkan aktivitas baru, Anda bisa memberi petunjuk pada sistem bahwa aktivitas
+ baru harus ditampilkan bersebelahan dengan aktivitas yang sedang aktif, jika memungkinkan. Caranya,
+ gunakan flag
+ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
. Meneruskan
+ flag ini akan meminta perilaku berikut:
+
+ Jika perangkat berada dalam mode bentuk bebas dan Anda meluncurkan aktivitas baru, Anda bisa
+ menetapkan dimensi dan lokasi layar aktivitas baru dengan memanggil
+ ActivityOptions.setLaunchBounds()
. Metode ini tidak berpengaruh jika
+ perangkat tidak berada dalam mode multi-jendela.
+
+ Catatan: Jika Anda meluncurkan aktivitas dalam tumpukan tugas, aktivitas + tersebut akan menggantikan aktivitas pada layar, dengan mewarisi semua + properti multi-jendelanya. Jika Anda ingin meluncurkan aktivitas baru sebagai jendela + terpisah dalam mode multi-jendela, Anda harus meluncurkannya dalam tumpukan tugas baru. +
+ ++ Pengguna bisa menyeret dan + meletakkan data dari satu aktivitas ke aktivitas yang lain selagi kedua aktivitas + berbagi layar. (Sebelumnya, pengguna hanya bisa menyeret dan meletakkan data dalam + aktivitas tunggal.) Karena alasan ini, Anda mungkin perlu menambahkan fungsionalitas + seret dan letakkan ke aplikasi Anda jika aplikasi Anda saat ini belum mendukungnya. +
+ +
+ N Preview SDK menambahkan paket android.view
+ untuk mendukung seret dan letakkan lintas-aplikasi. Untuk mengetahui detail tentang kelas dan metode
+ berikut, lihat Referensi N
+ Preview SDK.
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
. Jika Anda perlu memberikan izin URI ke
+ aktivitas penerima, teruskan flag baru,
+ View.DRAG_FLAG_GLOBAL_URI_READ
atau
+ View.DRAG_FLAG_GLOBAL_URI_WRITE
, sebagaimana mestinya.
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + Baik Anda memperbarui aplikasi untuk Android N maupun tidak, Anda harus + memverifikasi caranya bertindak dalam mode multi-jendela jika pengguna mencoba meluncurkannya + dalam mode multi-jendela pada perangkat yang menjalankan Android N. +
+ ++ Jika Anda menginstal Android N pada perangkat, mode + layar terbagi secara otomatis didukung. +
+ ++ Jika Anda tidak membangun aplikasi dengan N Preview SDK dan pengguna berupaya menggunakan + aplikasi dalam mode multi-jendela, sistem secara paksa akan mengubah ukuran aplikasi kecuali jika aplikasi + mendeklarasikan orientasi tetap. +
+ ++ Jika aplikasi Anda tidak mendeklarasikan orientasi tetap, Anda harus meluncurkan aplikasi + pada perangkat yang menjalankan Android N dan berupaya menempatkan aplikasi tersebut dalam + mode layar terbagi. Pastikan pengalaman pengguna + bisa diterima bila aplikasi secara paksa diubah ukurannya. +
+ ++ Jika aplikasi mendeklarasikan orientasi tetap, Anda harus berupaya menempatkan aplikasi dalam + mode multi-jendela. Periksa apakah Anda melakukannya, aplikasi tetap berada dalam + mode layar penuh. +
+ ++ Jika Anda membuat aplikasi Anda dengan N Preview SDK dan belum menonaktifkan + dukungan multi-jendela, periksa perilaku berikut dalam mode layar terbagi + dan mode bentuk bebas. +
+ ++ Untuk memeriksa kinerja aplikasi Anda dalam mode multi-jendela, cobalah operasi + berikut. Anda harus mencoba semua operasi ini dalam mode layar terbagi dan + dan mode multi-jendela, kecuali jika dinyatakan berbeda. +
+ +
+ Jika Anda menonaktifkan dukungan multi-jendela dengan mengatur
+ android:resizableActivity="false"
, Anda harus menjalankan aplikasi pada
+ perangkat yang menjalankan Android N dan berusaha menempatkan aplikasi dalam
+ mode bentuk bebas dan mode layar terbagi. Periksa apakah Anda melakukannya, aplikasi tetap berada dalam
+ mode layar penuh.
+
Android N memberikan dukungan yang disempurnakan untuk pengguna multibahasa, +yang memungkinkan mereka memilih beberapa lokal dalam pengaturan. Android N +menyediakan kemampuan ini dengan memperbanyak jumlah lokal yang didukung +dan mengubah cara sistem mengatasi masalah sumber daya. Metode baru mengatasi +masalah sumber daya ini lebih tangguh dan didesain agar kompatibel dengan APK yang ada, namun +Anda harus ekstra hati-hati terhadap perilaku tak terduga. Misalnya, Anda +harus menguji untuk memastikan aplikasi Anda secara default diatur ke bahasa yang diinginkan. Juga, +jika aplikasi Anda mendukung beberapa bahasa, Anda harus memastikan dukungan ini berfungsi +sebagaimana diinginkan. Terakhir, Anda harus mencoba memastikan aplikasi Anda dengan lancar menangani +bahasa yang tidak secara eksplisit Anda dukung dalam desain.
+ +Dokumen ini diawali dengan menjelaskan strategi resolusi sumber daya sebelum +Android N. Berikutnya, akan dijelaskan strategi +resolusi sumber daya Android N yang telah ditingkatkan. Terakhir, akan djelaskan cara memanfaatkan +jumlah lokal yang telah diperbanyak untuk mendukung lebih banyak pengguna multibahasa.
+ +Sebelum Android N, Android tidak selalu + berhasil mencocokkan lokal aplikasi dan lokal sistem. Misalnya, anggaplah bahasa default aplikasi Anda + adalah US English, namun aplikasi itu juga berisi string bahasa Spanyol yang dilokalkan di file sumber daya {@code es_ES}. +.
+Bila kode Java Anda mengacu ke string, itu akan mengatasi masalah bahasa string sebagai +berikut:
+Masalah resolusi ini muncul karena sistem menghilangkan kode negara +dari lokal jika tidak bisa menemukan yang sama persis. Misalnya:
+ +Pengaturan Pengguna | +Sumber Daya Aplikasi | +Resolusi Sumber Daya | +
---|---|---|
fr_CH | +
+default (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Coba fr_CH => Gagal +Coba fr => Gagal +Gunakan default (en) + |
+
Dalam contoh ini, sistem menampilkan string bahasa Inggris +tanpa mengetahui apakah pengguna memahami bahasa Inggris. Perilaku ini sudah sangat umum +sekarang. Android N harus mengurangi frekuensi +hasil seperti ini secara substansial.
+ +Android N menghadirkan resolusi sumber daya yang lebih handal, dan
+secara otomatis menemukan solusi yang lebih baik. Akan tetapi, untuk mempercepat resolusi dan meningkatkan
+kemudahan pemeliharaan, Anda harus menyimpan sumber daya dalam dialek induk yang paling umum.
+ Misalnya, jika sebelumnya Anda telah menyimpan sumber daya bahasa Spanyol di direktori {@code es-US}
+, pindahkan ke direktori {@code es-419}, yang berisi bahasa Spanyol Amerika Latin.
+ Demikian pula, jika Anda memiliki string sumber daya dalam folder bernama {@code en-GB}, ganti nama
+ folder itu menjadi {@code en-001} (bahasa Inggris internasional), karena induk yang paling umum
+ untuk string en-GB
adalah {@code en-001}.
+ Contoh berikut menjelaskan mengapa praktik-praktik ini meningkatkan kinerja dan
+reliabilitas resolusi sumber daya.
Dengan Android N, kasus yang dijelaskan dalam Tabel 1 diatasi +secara berbeda:
+ + +Pengaturan Pengguna | +Sumber Daya Aplikasi | +Resolusi Sumber Daya | +
---|---|---|
|
+
+default (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Coba fr_CH => Gagal +Coba fr => Gagal +Coba anak dari fr => fr_FR +Gunakan fr_FR + |
+
Sekarang pengguna mendapatkan sumber daya bahasa Prancis sebagai ganti bahasa Inggris. Contoh ini juga menunjukkan + mengapa Anda harus menyimpan string bahasa Prancis dalam {@code fr} bukan dalam {@code fr_FR} + untuk Android N. Tindakan di sini adalah untuk mencocokkan dengan induk dialek terdekat, + yang membuat resolusi menjadi lebih cepat dan lebih bisa diprediksi.
+ +Selain logika resolusi yang diperbaiki ini, Android sekarang menawarkan lebih banyak +pilihan bahasa untuk pengguna. Mari kita coba lagi contoh di atas dengan menetapkan bahasa Italia + sebagai bahasa pengguna tambahan, tetapi tanpa dukungan aplikasi untuk bahasa Prancis.
+ + +Pengaturan Pengguna | +Sumber Daya Aplikasi | +Resolusi Sumber Daya | + +
---|---|---|
|
+
+default (en) +de_DE +es_ES +it_IT + |
+
+Coba fr_CH => Gagal +Coba fr => Gagal +Coba anak dari fr => Gagal +Coba it_CH => Gagal +Coba it => Gagal +Coba anak dari it => it_IT +Gunakan it_IT + |
+
+
Pengguna tetap mendapatkan bahasa yang mereka pahami, meskipun aplikasi tidak +mendukung bahasa Prancis.
+ + +Android N menambahkan API baru {@code LocaleList.GetDefault()} +yang memungkinkan aplikasi langsung melakukan query daftar bahasa yang telah ditetapkan pengguna. API ini +memungkinkan Anda untuk membuat + perilaku aplikasi yang lebih canggih dan tampilan konten yang lebih optimal. Misalnya, Pencarian + bisa menampilkan hasil dalam beberapa bahasa berdasarkan pengaturan pengguna. Aplikasi browser + bisa menghindari penawaran menerjemahkan halaman dalam bahasa yang sudah diketahui pengguna, + dan aplikasi keyboard bisa mengaktifkan otomatis semua layout yang sesuai.
+ +Hingga Android 6.0 (API level 23), Android hanya mendukung satu atau dua lokal + untuk banyak bahasa umum +(en, es, ar, fr, ru). Karena hanya ada beberapa varian dari setiap bahasa, +aplikasi bisa menghindar dengan menyimpan beberapa nomor dan tanggal sebagai string hard-code +dalam file sumber daya. Akan tetapi, dengan perluasan set lokal yang didukung Android, +maka akan ada +perbedaan format yang signifikan untuk tanggal, waktu, mata uang, dan informasi +serupa bahkan dalam lokal tunggal. Menjadikan format Anda sebagai hard-code bisa menghasilkan +pengalaman yang membingungkan bagi pengguna akhir. Karena itu, saat mengembangkan untuk Android N +pastikan menggunakan formatter sebagai ganti menjadikan string angka dan tanggal sebagai hard-code.
+ +Contoh terbaik adalah bahasa Arab, yang mendukung Android N berkembang dari +satu {@code ar_EG} menjadi 27 lokal bahasa Arab. Bahasa lokal ini bisa berbagi hampir semua sumber daya, +namun sebagian lebih memilih digit ASCII, sementara yang lain memilih digit asli. Misalnya, +bila Anda ingin membuat kalimat dengan variabel digit, seperti +"Pilih PIN 4 digit", gunakan formatter seperti yang ditampilkan di bawah ini:
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/in/preview/features/notification-updates.jd b/docs/html-intl/intl/in/preview/features/notification-updates.jd new file mode 100644 index 000000000000..6154e832c818 --- /dev/null +++ b/docs/html-intl/intl/in/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=Pemberitahuan +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + +
Android N memperkenalkan beberapa API baru yang memungkinkan aplikasi memposting +pemberitahuan yang sangat terlihat dan interaktif.
+ +Android N menambahkan API pemberitahuan{@link android.support.v4.app.RemoteInput} +yang ada untuk mendukung balasan inline pada handset. Fitur ini memungkinkan pengguna + merespons dengan cepat dari bayangan pemberitahuan tanpa mengunjungi aplikasi Anda.
+ ++ Android N juga memungkinkan Anda menggabungkan pemberitahuan yang serupa agar + muncul sebagai satu pemberitahuan. Untuk memungkinkan hal ini, Android N menggunakan metode {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} yang sudah ada. Pengguna bisa memperluas setiap + pemberitahuan, dan melakukan tindakan seperti membalas dan menutup setiap + pemberitahuan, satu per satu dari bayangan pemberitahuan. +
+ +Terakhir, Android N juga menambahkan API baru yang memungkinkan Anda untuk memanfaatkan dekorasi +sistem dalam tampilan pemberitahuan yang disesuaikan untuk aplikasi Anda. API ini membantu +memastikan semua tampilan pemberitahuan sama-sama menggunakan penyajian yang konsisten dengan +template standar.
+ +Dokumen ini menyoroti beberapa perubahan penting yang harus Anda + perhitungkan saat menggunakan fitur pemberitahuan baru dalam aplikasi Anda.
+ +Dengan fitur Balasan Langsung di Android N, pengguna bisa dengan cepat +merespons pesan teks atau memperbarui daftar tugas secara langsung dalam antarmuka +pemberitahuan. Pada perangkat genggam, tindakan balasan inline muncul sebagai tombol tambahan + yang dilampirkan pada pemberitahuan. Bila pengguna membalas lewat keyboard, sistem akan melampirkan + respons teks ke intent + yang telah Anda tetapkan untuk tindakan pemberitahuan dan mengirimkan intent ke + aplikasi perangkat genggam Anda. + + + +
+ +Untuk membuat tindakan pemberitahuan yang mendukung balasan langsung: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
.
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
Sistem akan meminta pengguna memasukkan respons bila mereka memicu +tindakan pemberitahuan.
+ + + + +Untuk menerima input pengguna dari antarmuka pemberitahuan untuk aktivitas yang Anda +deklarasikan dalam intent tindakan balasan:
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
Cuplikan kode berikut mengilustrasikan cara metode mengambil teks input +dari bundel:
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
Aplikasi bisa menerapkan logika untuk memutuskan tindakan apa yang harus diambil pada teks +yang telah diambil. +Untuk aplikasi interaktif (seperti chat), memberikan lebih banyak konteks dalam pemberitahuan itu sendiri + (misalnya, beberapa baris riwayat obrolan, termasuk pesan pengguna pribadi) + sehingga pengguna bisa merespons dengan tepat. +Bila pengguna merespons melalui{@link android.support.v4.app.RemoteInput}, + sertakan teks dalam riwayat balasan dengan metode {@code setRemoteInputHistory()} +.
+ +Android N membekali pengembang dengan sebuah cara baru untuk menyatakan + antrean pemberitahuan: bundel pemberitahuan. Ini mirip dengan fitur + Tumpukan + Pemberitahuan dalam Android Wear. Misalnya, jika aplikasi Anda membuat pemberitahuan + untuk pesan yang diterima, bila lebih dari satu pesan diterima, pemberitahuan tersebut akan + dibundel sebagai satu grup. Anda bisa + menggunakan metode {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} yang ada untuk membundel pemberitahuan yang sama.
+ ++ Grup pemberitahuan menerapkan hierarki pada pemberitahuan yang ada di dalamnya. + Di bagian teratas hierarki adalah pemberitahuan induk yang menampilkan informasi + rangkuman untuk grup tersebut. Pengguna secara bertahap bisa + memperbesar grup pemberitahuan, dan sistem akan menampilkan informasi lebih banyak saat + pengguna menggali lebih dalam. Bila pengguna memperbesar bundel, sistem akan memperlihatkan informasi lebih + banyak untuk semua pemberitahuan anak; bila pengguna + memperbesar salah satu pemberitahuan tersebut, sistem akan memperlihatkan seluruh isinya. +
+ + + + +Untuk mengetahui cara menambahkan pemberitahuan ke grup, lihat +Menambahkan +Setiap Pemberitahuan ke Grup.
+ + +Bagian ini memberikan panduan tentang kapan menggunakan grup pemberitahuan sebagai ganti +pemberitahuan {@link android.app.Notification.InboxStyle InboxStyle} +yang telah tersedia di +platform Android versi sebelumnya.
+ +Anda harus menggunakan grup pemberitahuan hanya jika semua kondisi berikut ini +bernilai benar untuk kasus penggunaan Anda:
+ +Contoh kasus penggunaan yang baik untuk grup pemberitahuan antara lain: aplikasi pertukaran pesan +yang menampilkan daftar pesan yang masuk, atau aplikasi email yang menampilkan daftar email +yang diterima.
+ ++Contoh kasus di mana pemberitahuan tunggal lebih disukai + antara lain pesan individual dari satu orang, atau representasi daftar + item teks satu-baris. Anda bisa menggunakan +({@link android.app.Notification.InboxStyle InboxStyle} atau +{@link android.app.Notification.BigTextStyle BigTextStyle}) untuk mencapai +hal ini. +
+ ++ Aplikasi ini harus selalu memposting rangkuman grup, sekalipun grup hanya berisi + satu anak. Sistem akan menyembunyikan rangkuman dan langsung menampilkan + pemberitahuan anak jika hanya berisi pemberitahuan tunggal. Hal ini akan memastikan + sistem bisa memberikan pengalaman yang konsisten saat pengguna menggeser + anak grup. +
+ ++ Catatan: Versi Android N ini tidak menyembunyikan + rangkuman untuk grup pemberitahuan yang berisi satu anak. Fungsionalitas + ini akan ditambahkan dalam Android N versi berikutnya. +
+ +Walaupun sistem biasanya menampilkan pemberitahuan anak sebagai sebuah grup, Anda bisa mengaturnya + agar muncul untuk sementara muncul sebagai + + pemberitahuan pendahuluan. Fitur ini khususnya berguna karena memungkinkan + akses langsung ke pemberitahuan anak terbaru dan tindakan yang dikaitkan dengannya. +
+ + ++ Baik grup pemberitahuan maupun input jauh telah menjadi bagian dari {@link + android.app.Notification} API sejak Android 5.0 (API level 21) untuk mendukung + perangkat Android Wear. Jika Anda sudah membuat pemberitahuan dengan API ini, + satu-satunya tindakan yang harus Anda ambil adalah memeriksa apakah perilaku aplikasi sesuai dengan panduan yang + dijelaskan di atas, dan mempertimbangkan implementasi {@code + setRemoteInputHistory()}. +
+ ++ Untuk mendukung kompatibilitas mundur, tersedia API yang sama bersama + kelas {@link android.support.v4.app.NotificationCompat} + pustaka dukungan, yang memungkinkan Anda untuk membuat pemberitahuan yang bekerja pada versi Android + sebelumnya. Pada perangkat genggam dan tablet, pengguna hanya melihat pemberitahuan rangkuman, + sehingga aplikasi tetap memiliki gaya kotak masuk atau representasi pemberitahuan yang sama + untuk seluruh konten informasi grup. Karena perangkat Android + Wear memungkinkan pengguna melihat semua pemberitahuan anak bahkan pada level platform + yang lebih lama, maka Anda harus membuat pemberitahuan anak dengan mengabaikan level + API. +
+ +Mulai dari Android N, Anda bisa menyesuaikan tampilan pemberitahuan dan +tetap mendapatkan dekorasi sistem seperti header pemberitahuan, tindakan, dan +layout yang bisa diperluas.
+ +Untuk mengaktifkan kemampuan ini, Android N menambahkan API berikut untuk menata gaya + tampilan custom Anda:
+ +Untuk menggunakan API baru ini, panggil metode {@code setStyle()}, dengan meneruskan +gaya tampilan custom yang diinginkan padanya.
+ +Cuplikan ini menampilkan cara membuat objek pemberitahuan custom dengan metode +{@code DecoratedCustomViewStyle()}.
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/in/preview/features/picture-in-picture.jd b/docs/html-intl/intl/in/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..883b17a2d6e1 --- /dev/null +++ b/docs/html-intl/intl/in/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=Gambar-dalam-gambar +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
Di Android N, pengguna Android TV sekarang bisa menonton video +dalam jendela yang disematkan di sudut layar saat menyusuri +aplikasi. Mode gambar-dalam-gambar (PIP) memungkinkan aplikasi menjalankan aktivitas +video dalam jendela yang disematkan selagi aktivitas lain tetap berjalan di +latar belakang. Jendela PIP memungkinkan pengguna melakukan multitasking saat menggunakan aplikasi Anda, yang +membantu pengguna menjadi lebih produktif.
+ +Aplikasi Anda bisa memutuskan kapan memicu mode PIP. Inilah beberapa contoh +kapan memasuki mode PIP:
+ +Jendela PIP memiliki luas 240x135 dp dan ditampilkan di layer paling atas pada salah satu +dari empat sudut layar, yang dipilih oleh sistem. Pengguna bisa memunculkan +menu PIP yang memungkinkan mereka untuk beralih mode dari jendela PIP ke layar penuh, atau menutup jendela +PIP, dengan menekan dan menahan tombol Beranda pada remote. Jika video +lain mulai diputar pada layar utama, jendela PIP secara otomatis +ditutup. Pengguna juga bisa menutup jendela PIP melalui Recents.
+ + + + +PIP memanfaatkan API multi-jendela yang tersedia di Android N untuk +menyediakan jendela overlay video yang disematkan. Untuk menambahkan PIP ke aplikasi, Anda harus +mendaftarkan aktivitas yang mendukung PIP, mengalihkan aktivitas Anda ke mode PIP bila +diperlukan, serta memastikan elemen UI disembunyikan dan pemutaran video berlanjut bila +aktivitas dalam mode PIP.
+ +Secara default, sistem tidak secara otomatis mendukung PIP untuk aplikasi.
+Jika Anda ingin mendukung PIP dalam aplikasi, daftarkan aktivitas
+video Anda dalam manifes dengan mengatur
+android:supportsPictureInPicture
dan
+android:resizeableActivity
ke true
. Juga, tetapkan
+bahwa aktivitas Anda menangani perubahan konfigurasi layout sehingga aktivitas
+Anda tidak diluncurkan ulang saat terjadi perubahan layout selama transisi mode PIP.
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
Saat mendaftarkan aktivitas Anda, ingatlah bahwa dalam mode PIP aktivitas +Anda akan ditampilkan pada jendela overlay kecil pada layar TV. Aktivitas +pemutaran video dengan UI minimal akan memberikan pengalaman pengguna terbaik. Aktivitas yang +berisi elemen UI kecil mungkin tidak memberikan pengalaman pengguna yang baik +bila beralih ke mode PIP, karena pengguna tidak bisa melihat elemen UI secara detail +di jendela PIP.
+ +Activity.enterPictureInPicture()
. Contoh berikut mengalihkan
+ke mode PIP bila pengguna memilih tombol PIP khusus pada baris
+kontrol media:
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
Menambahkan tombol PIP ke baris kontrol media Anda akan memungkinkan pengguna dengan mudah beralih +ke mode PIP selagi mengontrol pemutaran video.
+ + + + +Android N menyertakan kelas
+PlaybackControlsRow.PictureInPictureAction
baru yang mendefinisikan
+tindakan PIP baris kontrol dan menggunakan ikon PIP.
Bila aktivitas Anda memasuki mode PIP, aktivitas Anda seharusnya hanya menampilkan pemutaran
+video. Hilangkan elemen UI sebelum aktivitas Anda memasuki PIP,
+dan pulihkan elemen ini bila aktivitas Anda beralih ke layar penuh lagi.
+Kesampingkan Activity.onPictureInPictureChanged()
atau
+Fragment.onPictureInPictureChanged()
dan aktifkan atau
+nonaktifkan elemen UI saat diperlukan, misalnya:
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
Bila aktivitas Anda beralih ke PIP, sistem akan menganggap aktivitas tersebut berada dalam
+keadaan berhenti sementara, dan akan memanggil metode onPause()
aktivitas Anda. Pemutaran
+video tidak boleh berhenti sementara dan harus terus diputar jika aktivitas tersebut
+berhenti sementara karena mode PIP. Periksa PIP dalam metode
+onPause()
aktivitas Anda dan tangani pemutaran dengan tepat,
+misalnya:
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
Bila aktivitas Anda meninggalkan mode PIP dan kembali ke mode layar penuh, sistem
+akan melanjutkan aktivitas Anda dan memanggil metode onResume()
Anda.
PIP ditujukan untuk aktivitas yang memutar video layar penuh. Saat mengalihkan +aktivitas Anda ke mode PIP, hindari menampilkan apa pun selain konten video. +Pantau saat aktivitas Anda memasuki mode PIP dan sembunyikan elemen UI, seperti dijelaskan +dalam Menangani UI Selama Gambar-dalam-gambar.
+ +Karena jendela PIP ditampilkan sebagai jendela mengambang di sudut +layar, Anda harus menghindari menampilkan informasi penting di layar utama +di area mana saja yang bisa terhalang oleh jendela PIP.
+ +Bila aktivitas ada berada dalam mode PIP, secara default aktivitas itu tidak mendapatkan fokus input. Untuk
+menerima kejadian input saat dalam mode PIP, gunakan
+MediaSession.setMediaButtonReceiver()
.
Aplikasi seperti aplikasi foto biasanya hanya memerlukan akses ke direktori tertentu dalam
+penyimpanan eksternal, seperti direktori Pictures
. Pendekatan
+yang ada untuk mengakses penyimpanan eksternal tidak didesain untuk memberikan
+akses direktori target dengan mudah untuk tipe aplikasi ini. Misalnya:
Android N menyediakan API baru yang disederhanakan untuk mengakses +direktori penyimpanan eksternal umum.
+ +Gunakan kelas StorageManager
untuk mendapatkan instance
+StorageVolume
yang tepat. Kemudian, buat intent dengan memanggil metode
+StorageVolume.createAccessIntent()
dari instance itu.
+Gunakan intent ini untuk mengakses direktori penyimpanan eksternal. Untuk mendapatkan daftar
+semua isi yang tersedia, termasuk isi media lepas-pasang, gunakan
+StorageManager.getVolumesList()
.
Cuplikan kode berikut adalah contoh cara membuka direktori
+Pictures
dalam penyimpanan bersama utama:
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Sistem ini mencoba untuk memberikan akses ke direktori eksternal, dan jika +diperlukan mengonfirmasi akses dengan pengguna menggunakan UI yang disederhanakan:
+ + + + +Jika pengguna memberi akses, sistem akan memanggil pengesampingan
+onActivityResult()
Anda dengan kode hasil
+Activity.RESULT_OK
, dan data intent yang berisi URI. Gunakan
+URI yang disediakan untuk mengakses informasi direktori, serupa dengan menggunakan URI
+yang dikembalikan oleh
+Storage
+Access Framework.
Jika pengguna tidak memberi akses, sistem akan memanggil pengesampingan
+onActivityResult()
Anda dengan kode hasil
+Activity.RESULT_CANCELED
, dan data intent nol.
Catatan: Mendapatkan akses ke direktori eksternal tertentu +juga akan memperoleh akses ke subdirektori dalam direktori tersebut.
+ +Untuk menggunakan Scoped Directory Access guna mengakses direktori pada media lepas-pasang, +pertama tambahkan {@link android.content.BroadcastReceiver} yang akan mendengarkan pemberitahuan +{@link android.os.Environment#MEDIA_MOUNTED}, misalnya:
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
Bila pengguna memasang media lepas-pasang, seperti kartu SD, sistem akan mengirimkan pemberitahuan
+{@link android.os.Environment#MEDIA_MOUNTED}. Pemberitahuan ini
+memberikan sebuah objek StorageVolume
dalam data intent yang bisa
+Anda gunakan untuk mengakses direktori pada media lepas-pasang. Contoh berikut
+mengakses direktori Pictures
pada media lepas-pasang:
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Bila memungkinkan, pertahankan URI akses direktori eksternal sehingga Anda tidak perlu
+berulang kali meminta akses ke pengguna. Setelah pengguna memberikan akses, panggil
+getContentResolver().takePersistableUriPermssion()
bersama
+URI akses direktori. Sistem akan mempertahankan URI dan permintaan
+akses berikutnya akan mengembalikan RESULT_OK
dan tidak menampilkan UI konfirmasi kepada
+pengguna.
Jika pengguna menolak akses ke direktori eksternal, jangan langsung +meminta akses lagi. Berulang kali meminta akses akan menghasilkan pengalaman +pengguna yang buruk.
diff --git a/docs/html-intl/intl/in/preview/features/security-config.jd b/docs/html-intl/intl/in/preview/features/security-config.jd new file mode 100644 index 000000000000..2eb45d4f375e --- /dev/null +++ b/docs/html-intl/intl/in/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=Network Security Configuration +page.keywords=preview,security,network + +@jd:body + ++ Android N menyertakan fitur + Network Security Configuration yang memungkinkan aplikasi menyesuaikan pengaturan keamanan jaringan mereka dalam + file konfigurasi deklaratif yang aman tanpa memodifikasi kode aplikasi. Pengaturan ini bisa + dikonfigurasi untuk domain dan aplikasi tertentu. Kemampuan + utama fitur ini adalah sebagai berikut: +
+ ++ Fitur Network Security Configuration menggunakan file XML tempat Anda menetapkan + pengaturan untuk aplikasi. Anda harus menyertakan sebuah entri dalam manifes aplikasi + untuk menunjuk ke file ini. Kutipan kode berikut dari sebuah manifes + yang memperagakan cara membuat entri ini: +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ Aplikasi mungkin perlu mempercayai set CA custom sebagai ganti default + platform. Alasannya yang paling umum adalah: +
+ ++ Secara default koneksi (misalnya TLS, HTTPS) aman dari semua aplikasi mempercayai + CA yang telah diinstal oleh sistem, dan aplikasi yang menargetkan API level 23 + (Android M) ke bawah, juga mempercayai penyimpanan CA yang ditambahkan pengguna secara default. Aplikasi + bisa menyesuaikan koneksinya sendiri menggunakan {@code base-config} (untuk + penyesuaian di tingkat aplikasi) atau {@code domain-config} (untuk penyesuaian + per-domain). +
+ + ++ Anggaplah Anda ingin menghubungkan ke host Anda yang menggunakan sertifikat + SSL yang ditandatangani sendiri atau ke host yang sertifikat SSL-nya dikeluarkan oleh CA non-publik + yang Anda percaya, seperti CA internal perusahaan Anda. +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Menambahkan sertifikat CA yang ditandatangani sendiri atau sertifikat CA non-publik, dalam format PEM atau DER, ke + {@code res/raw/my_ca}. +
+ + ++ Aplikasi yang tidak ingin mempercayai semua CA yang dipercaya oleh sistem + sebagai gantinya bisa menetapkan set CA sendiri yang telah dikurangi untuk dipercaya. Ini akan melindungi + aplikasi dari sertifikat palsu yang dikeluarkan oleh selain CA. +
+ ++ Konfigurasi untuk membatasi set CA tepercaya mirip dengan mempercayai CA custom untuk domain tertentu selain + beberapa CA disediakan dalam sumber daya. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Menambahkan CA tepercaya, dalam format PEM atau DER, ke {@code res/raw/trusted_roots}.
+ Perhatikan, jika menggunakan format PEM, file hanya boleh berisi data PEM
+ dan tidak ada teks tambahan. Anda juga bisa menyediakan beberapa elemen
+ <certificates>
+sebagai ganti satu elemen.
+
+ Sebuah aplikasi mungkin perlu mempercayai CA tambahan yang tidak dipercaya oleh sistem, + hal ini bisa disebabkan karena sistem belum menyertakan CA atau CA tidak + memenuhi persyaratan untuk memasukkan ke dalam sistem Android. Aplikasi + bisa melakukannya dengan menetapkan beberapa sumber sertifikat untuk + konfigurasi. +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ Saat merunut aplikasi yang terhubung melalui HTTPS, Anda mungkin perlu + menghubungkan ke server pengembangan lokal, yang tidak memiliki sertifikat + SSL untuk server produksi Anda. Untuk mendukungnya tanpa + memodifikasi kode aplikasi, Anda bisa menetapkan CA hanya-runut + yang hanya dipercaya bila +android:debuggable + adalah {@code true} dengan menggunakan {@code debug-overrides}. Biasanya IDE dan alat + build mengatur flag ini secara otomatis untuk build non-rilis. +
+ ++ Ini lebih aman daripada kode kondisional biasa karena, sebagai tindakan + pencegahan keamanan, toko aplikasi tidak menerima aplikasi yang ditandai + bisa-dirunut. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ Aplikasi yang bermaksud menghubungkan ke tujuan dengan hanya menggunakan koneksi + aman bisa berhenti mendukung cleartext (menggunakan protokol + HTTP yang tidak dienkripsi sebagai ganti HTTPS) ke tujuan tersebut. Opsi ini akan membantu mencegah + regresi tidak disengaja dalam aplikasi karena perubahan dalam URL yang disediakan oleh sumber-sumber + eksternal seperti server backend. + Lihat {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()} untuk detail selengkapnya. +
+ ++ Misalnya, aplikasi mungkin ingin memastikan semua koneksi ke {@code + secure.example.com} selalu dilakukan melalui HTTPS untuk melindungi lalu lintas sensitif + dari jaringan yang berbahaya. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ Biasanya aplikasi mempercayai semua CA yang telah terinstal. Jika salah satu dari CA ini + mengeluarkan sertifikat palsu, aplikasi akan berisiko terkena serangan + MiTM. Beberapa aplikasi memilih untuk membatasi set sertifikat yang mereka terima + baik dengan membatasi set CA yang mereka percaya atau dengan menyematkan sertifikat. +
+ ++ Penyematan sertifikat dilakukan dengan memberikan seperangkat sertifikat dengan hash + kunci publik (SubjectPublicKeyInfo pada sertifikat X.509). Rantai + sertifikat nanti hanya berlaku jika rantai sertifikat berisi setidaknya salah satu + dari kunci publik yang disematkan. +
+ ++ Perhatikan, saat menggunakan penyematan sertifikat, Anda harus selalu menyertakan kunci + cadangan sehingga jika Anda terpaksa beralih ke kunci baru, atau mengubah CA (saat + menyematkan ke sertifikat CA atau perantara CA tersebut), konektivitas + aplikasi Anda tidak terpengaruh. Jika tidak, Anda harus mendorong + pembaruan ke aplikasi tersebut untuk memulihkan konektivitas. +
+ ++ Selain itu bisa juga mengatur waktu kedaluwarsa untuk pin yang setelah + itu penyematan tidak dilakukan. Hal ini membantu mencegah masalah konektivitas dalam + aplikasi yang belum diperbarui. Akan tetapi, mengatur waktu kedaluwarsa + pada pin mungkin akan membuat penyematan bisa diabaikan. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ Nilai yang tidak diatur dalam konfigurasi tertentu akan diwariskan. Perilaku ini memungkinkan konfigurasi + yang lebih kompleks sambil menjaga file konfigurasi tetap terbaca. +
+ ++ Jika nilai tidak diatur dalam entri tertentu maka nilai dari entri berikutnya yang lebih + umum akan digunakan. Nilai yang tidak diatur dalam {@code domain-config} akan + diambil dari {@code domain-config} induk, jika tersarang, atau dari {@code + base-config} jika tidak. Nilai yang tidak diatur dalam {@code base-config} akan menggunakan + nilai default platform. +
+ ++ Misalnya pertimbangkan, bila semua koneksi ke subdomain {@code + example.com} harus menggunakan set CA custom. Selain itu, lalu lintas cleartext ke + domain ini diizinkan kecuali saat menghubungkan ke {@code + secure.example.com}. Dengan menyarangkan konfigurasi untuk {@code + secure.example.com} dalam konfigurasi untuk {@code example.com}, + {@code trust-anchors} tidak perlu digandakan. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ Fitur Network Security Configuration menggunakan format file XML. + Struktur keseluruhan file ditampilkan dalam contoh kode berikut: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ Bagian berikut menjelaskan sintaks dan detail lainnya dari format + file. +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
.
+
++ Nilai yang tidak diatur akan menggunakan nilai default platform. Konfigurasi + default untuk aplikasi yang menargetkan API level 24 ke atas: +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++Konfigurasi default untuk aplikasi yang menargetkan API level 23 ke bawah: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
tersarangPerhatikan, jika beberapa elemen {@code domain-config} mencakup suatu tujuan, konfigurasi dengan aturan domain paling spesifik (terpanjang) yang cocok +akan digunakan.
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ Menetapkan apakah CA dari sumber akan mengabaikan penyematan sertifikat. Jika {@code + "true"} maka rantai sertifikat yang rantainya melalui salah satu CA dari + sumber ini tidak akan disematkan. Hal ini bisa berguna untuk CA + perunutan atau untuk mendukung dengan memungkinkan pengguna melakukan MiTM atas lalu lintas aman aplikasi Anda. +
+ ++ Default-nya adalah {@code "false"} kecuali jika ditetapkan dalam elemen {@code debug-overrides}, + dalam hal demikian default-nya adalah {@code "true"}. +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
untuk mengetahui format pin.
+ + Tanggal kedaluwarsa membantu mencegah masalah konektivitas di aplikasi yang + tidak mendapatkan pembaruan untuk set pin mereka, misalnya karena pengguna + menonaktifkan pembaruan aplikasi. +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
Layanan input TV memungkinkan pengguna menghentikan sementara dan melanjutkan pemutaran saluran melalui +API perekaman atau time-shifting. Android N telah berkembang hingga ke perekaman +dengan memungkinkan pengguna menyimpan beberapa sesi rekaman.
+ +Pengguna bisa menjadwalkan rekaman terlebih dahulu, atau memulai rekaman sambil menonton +suatu acara. Setelah sistem menyimpan rekaman, pengguna bisa melihat-lihat, menata, +dan memutar kembali rekaman tersebut menggunakan aplikasi TV di sistem.
+ +Jika Anda ingin menyediakan fungsionalitas perekaman untuk layanan input TV, +Anda harus menunjukkan pada sistem bahwa aplikasi Anda mendukung perekaman, mengimplementasikan +kemampuan untuk merekam acara, menangani dan memberitahukan setiap kesalahan yang terjadi +selama perekaman, serta mengelola sesi yang telah Anda rekam.
+ +Untuk memberi tahu sistem bahwa layanan input TV Anda mendukung perekaman, ikuti +langkah-langkah ini:
+ +TvInputService.onCreate()
Anda, buat objek
+TvInputInfo
baru menggunakan kelas TvInputInfo.Builder
.
+TvInputInfo
baru, panggil
+setCanRecord(true)
sebelum memanggil build()
untuk
+menunjukkan bahwa layanan Anda mendukung perekaman.TvInputInfo
Anda pada sistem dengan memanggil
+TvInputService.updateTvInputInfo()
.Setelah layanan input TV Anda didaftarkan bahwa ia mendukung fungsionalitas
+perekaman, sistem akan memanggil
+TvInputService.onCreateRecordingSession()
Anda bila perlu mengakses
+implementasi perekaman aplikasi Anda. Implementasikan subkelas
+TvInputService.RecordingSession
Anda sendiri dan kembalikan
+bila callback onCreateRecordingSession()
dipicu.
+ Subkelas ini bertanggung jawab mengalihkan ke saluran data yang benar,
+merekam data yang diminta, dan memberitahukan status perekaman serta kesalahan ke
+sistem.
Bila sistem memanggil RecordingSession.onTune()
, dengan meneruskan
+URI saluran, setel ke saluran yang ditetapkan URI. Beri tahu sistem bahwa
+aplikasi Anda telah disetel ke saluran yang diinginkan dengan memanggil notifyTuned()
,
+atau, jika aplikasi Anda tidak bisa disetel ke saluran yang tepat, panggil
+notifyError()
.
Sistem berikutnya akan memanggil callback RecordingSession.onStartRecording()
.
+ Aplikasi Anda harus segera mulai merekam. Bila sistem memanggil
+callback ini, sistem mungkin akan memberikan URI yang berisi informasi tentang program
+yang akan direkam. Bila perekaman selesai, Anda perlu menyalin data
+ini ke tabel data RecordedPrograms
.
Terakhir, sistem akan memanggil RecordingSession.onStopRecording()
.
+Pada tahap ini, aplikasi Anda harus segera berhenti merekam. Anda juga perlu
+membuat entri dalam tabel RecordedPrograms
. Entri ini harus
+menyertakan URI data sesi yang direkam dalam kolom
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
, dan informasi
+program yang diberikan sistem dalam panggilan awal ke
+onStartRecording()
.
Untuk detail selengkapnya tentang cara mengakses tabel RecordedPrograms
+lihat Mengelola Sesi yang Direkam.
Jika terjadi kesalahan selama perekaman, rendering data yang terekam menjadi tidak bisa digunakan,
+beri tahu sistem dengan memanggil RecordingSession.notifyError()
.
+Begitu pula, Anda bisa memanggil notifyError()
setelah sesi perekaman dibuat
+agar sistem mengetahui bahwa aplikasi Anda tidak bisa lagi merekam sesi.
Jika terjadi kesalahan selama perekaman, namun Anda ingin menyediakan rekaman parsial
+yang bisa digunakan pengguna untuk pemutaran, panggil
+RecordingSession.notifyRecordingStopped()
untuk memungkinkan sistem
+menggunakan sesi parsial.
Sistem menyimpan informasi untuk semua sesi yang direkam dari semua
+aplikasi saluran yang mampu merekam dalam tabel penyedia konten TvContract.RecordedPrograms
.
+ Informasi ini bisa diakses lewat URI konten
+RecordedPrograms.Uri
. Gunakan API konten penyedia untuk
+membaca, menambah, dan menghapus entri dari tabel ini.
Untuk informasi selengkapnya tentang menangani data penyedia konten, lihat + +Dasar-Dasar Penyedia Konten.
+ +Perangkat TV mungkin memiliki penyimpanan terbatas, jadi pertimbangkan sebaik mungkin saat
+mengalokasikan penyimpanan untuk menyimpan sesi rekaman. Gunakan
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
bila
+tidak cukup ruang untuk menyimpan sesi rekaman.
Bila pengguna memulai perekaman, Anda harus memulai perekaman data
+secepatnya. Untuk memfasilitasinya, selesaikan setiap tugas yang memakan waktu di awal,
+seperti mengakses dan mengalokasikan ruang penyimpanan, saat sistem memanggil callback
+onCreateRecordingSession()
. Hal ini akan memungkinkan Anda memulai
+perekaman dengan segera bila callback onStartRecording()
+dipicu.
Android N memperkenalkan dukungan untuk fitur bahasa Java 8 + yang bisa Anda gunakan saat mengembangkan aplikasi yang menargetkan Android N. + Halaman ini menjelaskan fitur bahasa baru yang didukung dalam Android N + Preview, cara menyiapkan proyek Anda dengan benar untuk menggunakannya, dan setiap masalah + yang diketahui yang mungkin Anda temui. +
+ +Untuk mulai menggunakan fitur-fitur ini, Anda perlu mengunduh dan menyiapkan Android +Studio 2.1 (preview) dan Android N Preview SDK, yang menyertakan +Jack toolchain yang diperlukan dan Plugin Android untuk Gradle yang telah diperbarui. Jika Anda belum menginstal +Android N Preview SDK, lihat Menyiapkan Pengembangan untuk Android N.
+ + + ++ Catatan: Menggunakan fitur bahasa Java 8 yang baru bukanlah + persyaratan untuk mengembangkan aplikasi yang menargetkan platform Android N. Jika Anda + tidak ingin menulis kode dengan fitur bahasa Java 8, Anda bisa membiarkan nilai kompatibilitas + sumber dan target proyek Anda diatur ke Java 7, namun Anda tetap harus + mengompilasi dengan JDK 8 untuk membangun pada platform Android N. +
+ ++ Saat ini tidak semua fitur bahasa Java 8 didukung Android. Akan tetapi, + fitur berikut sekarang tersedia saat mengembangkan aplikasi yang menargetkan + Android N Preview: +
+ ++ Selain itu, API fitur bahasa Java 8 berikut ini sekarang tersedia: +
+ ++ Catatan: Android N mendasarkan implementasi ekspresi + lambda pada kelas anonim. Pendekatan ini memungkinkannya kompatibel + mundur dan bisa dieksekusi pada versi Android sebelumnya. Untuk menguji ekspresi + lambda pada versi sebelumnya, jangan lupa masuk ke file {@code + build.gradle} Anda, serta mengatur {@code compileSdkVersion} dan {@code + targetSdkVersion} ke 23 atau yang lebih rendah. +
+ ++ Agar bisa menggunakan fitur bahasa Java 8 yang baru, Anda juga perlu menggunakan + Jack toolchain + yang baru. Android Toolchain yang baru ini mengompilasi sumber bahasa Java menjadi dex + bytecode yang bisa dibaca Android, memiliki format pustaka {@code .jack} sendiri, dan menyediakan sebagian besar fitur + toolchain sebagai bagian dari alat tunggal: pengemasan ulang, penciutan, pengaburan dan + multidex. +
+ +Inilah perbandingan dua toolchain yang digunakan untuk membangun file Android DEX:
++ Untuk mengaktifkan fitur bahasa Java 8 dan Jack untuk proyek Anda, masukkan + yang berikut dalam file {@code build.gradle} yang spesifik untuk modul: +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Instant Run, yang diperkenalkan dalam Android Studio 2.0 (Beta), saat ini tidak berfungsi + dengan Jack dan akan dinonaktifkan saat menggunakan toolchain baru. +
+ +Karena Jack tidak menghasilkan file kelas antara saat mengompilasi sebuah +aplikasi, alat yang bergantung pada file-file ini sekarang tidak berfungsi pada Jack. Beberapa +contoh alat-alat ini adalah:
+ +Jika Anda menemukan masalah lain saat menggunakan Jack, laporkan bug.
\ No newline at end of file diff --git a/docs/html-intl/intl/in/preview/overview.jd b/docs/html-intl/intl/in/preview/overview.jd new file mode 100644 index 000000000000..4b48a220b5c9 --- /dev/null +++ b/docs/html-intl/intl/in/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=Ikhtisar Program +page.metaDescription=Persiapkan aplikasi Anda untuk versi Android berikutnya. +page.image=images/cards/card-n-overview_2x.png +meta.tags="preview", "pengembang", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ Selamat datang di Android N Developer Preview, program yang + akan memberi apa saja yang Anda butuhkan untuk menguji dan mengoptimalkan aplikasi untuk versi + Android berikutnya. Program ini tersedia gratis, dan Anda bisa langsung memulai hanya dengan + mengunduh alat bantu N Developer Preview. +
+ + + + + + + ++ Jalankan dan uji aplikasi Anda pada berbagai perangkat atau pada emulator. + +
++ Kami akan menyediakan pembaruan setiap bulan selama Preview, agar Anda bisa menguji perubahan platform terbaru. +
++ Selama beberapa minggu pertama, kami akan memberikan prioritas pada masalah-masalah + yang dilaporkan pengembang, jadi ujilah dan berikan umpan balik sesegera mungkin. +
++ Mulailah pekerjaan lebih awal untuk mendukung perilaku platform baru dan kembangkan dengan fitur-fitur baru. +
++ Pembaruan lewat jaringan seluler tanpa kendala untuk setiap perangkat yang didukung melalui + Android Beta Program. Flashing tidak diperlukan. +
++ Laporkan masalah dan berikan umpan balik kepada kami dengan menggunakan + Issue Tracker kami. Hubungkan dengan + pengembang lain di + N Developer Community. +
++ N Developer Preview berjalan dari 9 Maret 2016 hingga rilis publik Android N + final dirilis ke AOSP dan OEM, yang direncanakan selama Kuartal 3 2016. +
+ ++ Pada tahapan pencapaian pengembangan utama kami akan mengirimkan pembaruan untuk lingkungan pengujian dan + pengembangan Anda. Umumnya Anda boleh berharap mendapatkan pembaruan setiap bulan (dengan interval 4 hingga 6 + minggu). Tahapan pencapaian tercantum di bawah ini. +
+ ++ Setiap pembaruan menyertakan SDK Tools, citra sistem preview, emulator, dokumentasi + referensi, dan diff API. +
+ ++ Tiga tahapan pencapaian preview pertama memberikan pengujian + awal dan lingkungan pengembangan yang membantu Anda mengidentifikasi + masalah kompatibilitas dalam aplikasi Anda saat ini dan merencanakan migrasi atau menampilkan pekerjaan + yang diperlukan untuk menargetkan platform baru. Ini adalah periode prioritas yang akan + memberi kami umpan balik dari Anda tentang fitur dan API serta masalah kompatibilitas file + — untuk semua ini, harap gunakan Issue + Tracker. Anda boleh mengharapkan beberapa perubahan API selama pembaruan ini. +
+ ++ Pada preview 4 dan 5 Anda akan memiliki akses ke API + dan SDK N final untuk dikembangkan, serta citra sistem yang hampir final + untuk menguji perilaku dan fitur sistem. Android N akan memberikan level API + standar pada saat ini. Anda bisa mulai melakukan pengujian kompatibilitas akhir atas aplikasi + lama dan menyempurnakan kembali setiap kode baru yang menggunakan API atau fitur N. +
+ ++ Juga, mulai preview 4, Anda akan bisa mempublikasikan aplikasi ke + perangkat yang menjalankan Android N pada level API resmi, seperti + perangkat konsumen yang telah memilih mengikuti program Android Beta. Anda bisa + mempublikasikan ke saluran alfa dan beta Google Play terlebih dahulu, sehingga Anda bisa menguji + aplikasi pada konsumen Android Beta sebelum mendistribusikan secara luas di + toko. +
+ ++ Saat Anda menguji dan mengembangkan di Android N, kami sangat menyarankanterus memperbarui + lingkungan pengembangan saat pembaruan preview + dirilis. Untuk mempermudah prosesnya, Anda bisa mendaftarkan perangkat pengujian di program + Android Beta dan mengambil pembaruan lewat jaringan seluler (OTA) pada + setiap tahapan pencapaian. Atau, citra preview yang diperbarui + tersedia bila Anda mengunduh dan mem-flash secara manual. +
+ ++ Kami akan memberi tahu Anda bila pembaruan preview telah tersedia lewat Android Developers Blog serta + situs ini dan Android + N Developer Community. +
+ + ++ N Developer Preview menyertakan apa saja yang Anda perlukan untuk menguji aplikasi + yang ada pada berbagai ukuran layar, teknologi jaringan, chipset CPU/GPU, + dan arsitektur perangkat keras. +
+ +Anda bisa mengunduh komponen-komponen ini melalui SDK Manager di Android Studio:
+ ++ Kami akan menyediakan pembaruan untuk alat pengembangan ini di setiap tahapan pencapaian jika diperlukan. +
+ ++ N Developer Preview menyertakan citra sistem Nexus dan perangkat keras lainnya yang bisa Anda gunakan saat + menguji dan mengembangkan pada perangkat fisik. Lihat halaman Citra Perangkat untuk melihat daftar lengkap + citra perangkat keras. +
+ ++ Kami akan menyediakan citra sistem yang diperbarui untuk perangkat ini di setiap tahapan pencapaian. Anda + bisa mengunduh dan mem-flash citra sistem yang diperbarui ke perangkat pengujian + secara manual, sesering yang Anda perlukan. Ini terutama berguna untuk lingkungan pengujian + otomatis bila Anda mungkin perlu mem-flash ulang perangkat beberapa + kali. +
+ +Catatan: + Perangkat yang di-flash secara manual tidak akan mendapatkan pembaruan OTA seperti di + preview tahun lalu. Tahun ini, Anda bisa memperoleh OTA dengan mendaftarkan perangkat dalam + Android Beta Program — lihat detailnya di bagian berikutnya. +
+ ++ Yang baru untuk Android N adalah program pembaruan lewat jaringan seluler (OTA) yang secara otomatis + mengirim pembaruan preview terbaru Android N secara langsung ke perangkat yang telah mendaftar + di program ini. Program ini gratis dan terbuka bagi siapa saja yang memiliki + perangkat yang didukung dan telah didaftarkan ke akun Google mereka. +
+ ++ Untuk mendaftarkan dalam program ini, kunjungi situs Android + Beta Program. Anda akan + melihat semua perangkat yang telah didaftarkan ke akun Anda yang memenuhi syarat untuk mendaftar + dalam Android Beta. +
+ ++ Setelah terdaftar, perangkat Anda akan segera menerima pembaruan. Umumnya + Anda tidak perlu pengaturan ulang penuh atas data untuk beralih ke Android N, namun + Anda disarankan mencadangkan setiap data yang tidak ingin hilang sebelum + mendaftarkan perangkat. +
+ ++ Saat pembaruan dikirim ke perangkat Anda, kami menyarankan Anda untuk segera mengunduh dan + menginstalnya sesegera mungkin. Anda perlu memantau perubahan terbaru + di UI sistem, perilaku, API, dan fitur. +
+ ++ Di akhir periode Developer Preview, perangkat Anda yang telah didaftarkan akan + menerima pembaruan ke rilis resmi Android N. +
+ ++ Anda bisa membatalkan pendaftaran perangkat dari program Android Beta kapan saja dari + situs Android Beta. Sebelum membatalkan pendaftaran, pastikan Anda telah mencadangkan data pada + perangkat. +
+ +Catatan: + Bila Anda membatalkan pendaftaran, perangkat Anda akan diatur ulang + ke versi terbaru + Android 6.0 Marshmallow (tidak mesti ke versi yang telah Anda + instal sebelum mendaftarkan perangkat). Untuk memastikan instalasi yang bersih, + data Anda akan dihapus dari perangkat, termasuk kontak, pesan, + foto, dan seterusnya. +
+ ++ Sumber daya dokumentasi ini tersedia pada situs Developer Preview untuk + membantu Anda mempelajari tentang Android N: +
+ ++ Selama pembaruan preview awal, Anda bisa mengunduh + Referensi API + untuk platform Android N sebagai arsip zip terpisah. Unduhan + referensi juga menyertakan laporan diff yang akan membantu Anda mengenali perubahan API dari + API 23 dan pembaruan sebelumnya. +
+ ++ Bila API Android N sudah final dan API Level resmi telah ditetapkan, + kami akan menyediakan referensi API kepada Anda secara online di https://developer.android.com. +
+ ++ Saat Anda menguji dan mengembangkan N Developer Preview, gunakan saluran + ini untuk melaporkan masalah dan memberikan umpan balik. +
+ +
+ N Developer Preview menyediakan sistem pengembangan semata dan pustaka Android
+ yang tidak memiliki API level standar. Jika Anda tidak ingin
+ mengikuti perilaku kompatibilitas untuk menguji aplikasi Anda (sangat
+ disarankan), Anda bisa menargetkan versi preview Android N dengan mengatur
+ targetSdkVersion
+ aplikasi Anda ke “N”
.
+
+ Android N Developer Preview menghasilkan API preview + — API ini tidak akan resmi hingga SDK final dirilis, + yang saat ini direncanakan pada kuartal ketiga 2016. Ini berarti Anda boleh + berharap adanya perubahan kecil pada API selama waktu ini, terutama selama + minggu-minggu pertama program ini. Kami akan menyediakan rangkuman perubahan pada Anda bersama + setiap pembaruan Android N Developer Preview. +
+ ++ Catatan: Meskipun API preview mungkin berubah, perilaku dasar + sistem stabil dan siap diuji. + +
+ ++ Google Play akan mencegah publikasi aplikasi yang menargetkan N Developer + Preview. Bila SDK final Android N telah tersedia, Anda akan dapat + menargetkan Android N API level resmi dan mempublikasikan aplikasi ke Google + Play lewat saluran rilis alfa dan beta. Sementara itu, jika Anda ingin + mendistribusikan aplikasi yang menargetkan Android N kepada penguji, Anda bisa melakukannya lewat email atau + melalui pengunduhan langsung dari situs Anda. +
+ ++ Pada saat rilis penuh Android N ke AOSP dan OEM, yang direncanakan selama Kuartal 3 2016, + Anda akan dapat mempublikasikan aplikasi yang menargetkan Android N ke saluran + rilis publik di Google Play. +
+ + ++ Untuk memulai pengujian aplikasi Anda dengan Android N: +
+ ++ Terima kasih atas partisipasi Anda dalam program Android N Developer Preview! +
diff --git a/docs/html-intl/intl/in/preview/samples.jd b/docs/html-intl/intl/in/preview/samples.jd new file mode 100644 index 000000000000..3c51f48da3b9 --- /dev/null +++ b/docs/html-intl/intl/in/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=Contoh +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ Contoh kode berikut disediakan untuk Android N. Untuk + mengunduh contoh di Android Studio, pilih opsi menu File > Import + Samples. +
+ ++ Catatan: Proyek yang bisa diunduh ini didesain + untuk digunakan bersama Gradle dan Android Studio. +
+ + ++ Contoh ini memperagakan cara memanfaatkan antarmuka pengguna + multijendela bersama aplikasi Anda. +
+ + + ++ Ini adalah contoh yang telah ada sebelumnya yang menampilkan layanan sederhana yang mengirimkan + pemberitahuan menggunakan NotificationCompat. Setiap percakapan yang belum dibaca dari pengguna + akan dikirim sebagai pemberitahuan tersendiri. +
++ Contoh ini telah diperbarui untuk memanfaatkan fitur pemberitahuan baru + yang tersedia di Android N. +
+ + + ++ Ini adalah contoh yang telah ada sebelumnya yang memperagakan cara menggunakan + NotificationManager untuk memberi tahu jumlah pemberitahuan yang saat ini ditampilkan + oleh aplikasi. +
++ Contoh ini telah diperbarui untuk memanfaatkan fitur pemberitahuan baru + yang tersedia di Android N. +
+ + + ++ Contoh ini memperagakan cara menyimpan dan mengakses data dalam penyimpanan yang dienkripsi + dengan perangkat yang selalu tersedia saat perangkat booting. +
+ + + ++ Contoh ini memperagakan cara membaca dan menulis data dari direktori + spesifik, sekaligus meminta izin lebih sedikit. +
+ \ No newline at end of file diff --git a/docs/html-intl/intl/in/preview/setup-sdk.jd b/docs/html-intl/intl/in/preview/setup-sdk.jd new file mode 100644 index 000000000000..5187e9910f9c --- /dev/null +++ b/docs/html-intl/intl/in/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=Menyiapkan Preview +meta.keywords="preview", "android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +Untuk mengembangkan aplikasi bagi Android N Preview, Anda perlu membuat beberapa pembaruan +pada lingkungan pengembang, seperti dijelaskan pada halaman ini.
+ +Untuk sekedar menguji kompatibilitas aplikasi Anda pada +citra sistem Android N, ikuti panduan untuk Menguji pada Perangkat Android N.
+ + + + +Platform Android N menambahkan dukungan untuk fitur bahasa Java 8, +yang memerlukan compiler baru yang disebut Jack. Versi terbaru Jack +saat ini hanya didukung di Android Studio 2.1. Jadi jika ingin +menggunakan fitur bahasa Java 8, Anda perlu menggunakan Android Studio 2.1 untuk +membangun aplikasi. Jika tidak, Anda tidak perlu menggunakan compiler Jack, namun Anda +tetap perlu memperbarui ke JDK 8 untuk mengompilasi pada platform Android N, +seperti dijelaskan di bawah ini. +
+ + + +Android Studio 2.1 saat ini tersedia sebagai preview di +Canary Release Channel. Jika Anda sudah +memiliki Android Studio dan tidak ingin memperbarui ke Canary Channel, Anda bisa +mengunduh Android Studio 2.1 sebagai instalasi terpisah dan menggunakannya +untuk pengembangan dengan Android N, sehingga membuat lingkungan Android Studio +utama Anda tidak terpengaruh.
+ +Untuk mengunduh Android Studio 2.1 sebagai instalasi terpisah, ikuti langkah-langkah +ini (atau jika Anda ingin menerima Android Studio 2.1 sebagai pembaruan pada +instalasi yang ada, lompat ke langkah 4):
+ +Biarkan jendela pengaturan ini tetap terbuka untuk langkah berikutnya.
+ + +Untuk mulai mengembangkan dengan Android N API, Anda perlu menginstal +Android N Preview SDK di Android Studio sebagai berikut:
+ ++ Informasi detail tentang Android N API tersedia dalam dokumentasi referensi N Preview, + yang bisa Anda unduh dari tabel berikut. + Paket ini berisi versi offline untuk situs web pengembang Android yang disederhanakan, + dan termasuk referensi API yang diperbarui untuk Android N API dan + laporan perbedaan API. +
+ +Dokumentasi | +Checksum | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
デバイス | +ダウンロード / チェックサム | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5:b5cf874021023b398f5b983b24913f5d + SHA-1:6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5:af183638cf34e0eb944a1957d7696f60 + SHA-1:54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5:bc4934ea7bd325753eee1606d3725a24 + SHA-1:85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5:c901334c6158351e945f188167ae56f4 + SHA-1:0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5:7bb95bebc478d7257cccb4652899d1b4 + SHA-1:1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5:f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1:7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5:4e21fb183bbbf467bee91598d587fd2e + SHA-1:335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G(AndroidOne) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5:983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1:82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ 以下のいずれかの方法で、プレビュー版をデバイスからアンインストールできます。 +
++ 登録を解除すると、そのデバイスで利用可能な Android の最新の実稼働向けバージョン(Android 6.0 Marshmallow など)への OTA アップデートがデバイスに配信されます。アップデート時はオールリセットされ、デバイス上のユーザーデータは削除されます。デバイスの登録解除前には、重要なデータをバックアップしておいてください。 + + + + +
+注: プログラムの終了前に Developer Preview のシステム イメージをアンインストールすると、端末はオールリセットされ、すべてのユーザーデータが削除されます。 + + + +
+ + +Android エミュレータで Android N Preview を実行するには、Android N Preview SDK をダウンロードして、エミュレータ用の仮想デバイスを準備する必要があります。 + +
+ +まずは以下の手順で Android N Preview SDK をダウンロードします(すでに Android N 向けの開発準備でダウンロード済みの場合は、この手順は飛ばしてください)。 + + + +
これで Android SDK Built-Tools 24.0 0 rc1、Platform-Tools 24.0.0 rc1、SDK Tools 25.0.9 がインストールされます。SDK Tools を 25.0.9 にアップデートしないと、Android N の x86_64 システム イメージは動作しません。 + + +
+ + +次に Android N のシステム イメージを使用して仮想デバイスを作成します。
+ +これで Android N Preview AVD で Android エミュレータを起動できます。
+ ++Android Emulator 2.0 Beta に対応した Android Studio 2.1 のプレビュー版をインストールすると、Android Studio 1.5 よりもパフォーマンスが格段に向上し、Android エミュレータをより快適にお使いいただけます。 + + +
+ +注: Android Studio 2.0 Beta を使用している場合、N プレビュー版のシステム イメージで AVD を作成できないという既知の不具合があります。よって現時点では、Android Studio 2.1 のプレビュー版を使用して AVD を作成してください。 + + + +
+ +仮想デバイスの作成については、仮想デバイスを管理するで詳細をご覧ください。 +
+ + + + + + + + + + + + + + ++ バックグラウンド処理が多くのメモリとバッテリーを消費する場合があります。たとえば、多くのバックグラウンド処理が暗黙的なブロードキャストをリッスンするように登録されていますが、バックグラウンド処理が有用でない場合でも、暗黙的なブロードキャストによりこれらの処理が開始されることがあります。 + +バックグラウンド処理が端末のパフォーマンスとユーザー エクスペリエンスの両方に多大な影響を及ぼす可能性があります。 + +
+ ++ N Developer Preview では、この問題を軽減するために、次の制限が適用されています。 + +
+ ++ Android フレームワークは、これらの暗黙的なブロードキャストの必要性を軽減するいくつかのソリューションを提供します。 +たとえば、{@link android.app.job.JobScheduler} と +{@code GcmNetworkManager} は、従量制ではないネットワークへの接続など、指定条件が満たされたときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。 + + +また、コンテンツ プロバイダの変更に対応するために、{@link android.app.job.JobScheduler} を使用することもできます。{@link android.app.job.JobInfo} オブジェクトは、{@link android.app.job.JobScheduler} がジョブをスケジュールするために使用するパラメータをカプセル化します。 + + +ジョブの条件が満たされると、システムはこのジョブをアプリの {@link android.app.job.JobService} で実行します。 + +
+ ++ このドキュメントでは、アプリをこれらの新しい制限に対応させるために、 +{@link android.app.job.JobScheduler} などの代替メソッドの使用法について説明します。 + +
+ ++ N Developer Preview をターゲットにしたアプリは、マニフェストで {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストの受信登録をしていても、このブロードキャストを受信しません。また、このブロードキャストに依存している処理は開始されません。 + +これにより、ネットワークの変更をリッスンするアプリ、または端末が従量制ではないネットワークに接続したときにネットワーク アクティビティをまとめて実行するアプリに問題が発生する可能性があります。 + +Android フレームワークは、この制限を回避するためのいくつかのソリューションを備えていますが、アプリで実行するタスクに応じて、適切なソリューションを選択してください。 + + +
+ ++ 注: {@link android.content.Context#registerReceiver Context.registerReceiver()} で登録された {@link android.content.BroadcastReceiver} は、アプリがフォアグラウンドにあるときにこれらのブロードキャストを継続して受信します。 + + +
+ ++ {@link android.app.job.JobInfo} オブジェクトをビルドするために {@link android.app.job.JobInfo.Builder JobInfo.Builder} を使用するときは、{@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} メソッドを適用し、{@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} をジョブ パラメータとして渡します。 +次のコードサンプルは、端末が従量制ではないネットワークに接続し、充電しているときに実行するサービスをスケジュールします。 + + +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ ジョブの条件が満たされたとき、アプリはコールバックを受け取り、指定された {@code JobService.class} で {@link android.app.job.JobService#onStartJob onStartJob()} メソッドを実行します。 + +{@link + android.app.job.JobScheduler} 実装の例については、JobScheduler サンプルアプリをご覧ください。 +
+ ++ GMSCore サービスを使用し、Android 5.0(API レベル 21)以前をターゲットにしているアプリは、 +{@code GcmNetworkManager} を使用して {@code Task.NETWORK_STATE_UNMETERED} を指定できます。 + +
+ ++ フォアグラウンドで実行中のアプリは、{@link + android.content.BroadcastReceiver} を登録することにより、{@code + CONNECTIVITY_CHANGE} を引き続きリッスンできます。ただし、{@link + android.net.ConnectivityManager} API は、特定のネットワーク条件が満たされたときだけコールバックをリクエストするより堅牢なメソッドを提供します。 + +
+ ++ {@link android.net.NetworkRequest} オブジェクトは、{@link android.net.NetworkCapabilities} に応じてネットワーク コールバックのパラメータを定義します。 +{@link + android.net.NetworkRequest.Builder NetworkRequest.Builder} クラスを使って {@link android.net.NetworkRequest} オブジェクトを作成します。次に、{@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} は、{@link android.net.NetworkRequest} オブジェクトをシステムに渡します。 + +ネットワーク条件が満たされると、アプリはコールバックを受け取り、{@link + android.net.ConnectivityManager.NetworkCallback} クラスで定義された {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} メソッドを実行します。 + + +
+ ++ アプリは終了するか、{@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()} を呼び出すまで、コールバックを受信し続けます。 + +
+ ++ N Developer Preview では、アプリは、{@link + android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link + android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この制限は、新しい画像やビデオを処理するためにいくつかのアプリを起動する必要があるときに、パフォーマンスとユーザー エクスペリエンスへの影響を軽減するのに役立ちます。 + +N Developer Preview では、{@link android.app.job.JobInfo} と {@link + android.app.job.JobParameters} を拡張することにより、代わりのソリューションを提供しています。 + +
+ ++ N Developer Preview では、コンテンツ URI の変更でジョブをトリガーするために、{@link android.app.job.JobInfo} API に次のメソッドが追加されています。 + +
+ ++ 注: {@code TriggerContentUri()} は、{@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} または {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()} と組み合わせて使うことはできません。 +コンテンツの変更を継続的に監視するには、アプリの {@link + android.app.job.JobService} が最新のコールバックの処理を完了する前に、新しい +{@link android.app.job.JobInfo} をスケジュールします。 +
+ ++ 次のサンプルコードは、システムが変更をコンテンツ URI {@code MEDIA_URI} に通知するときにトリガーされるジョブをスケジュールします。 + +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ システムが特定のコンテンツ URI の変更を通知すると、アプリはコールバックを受け取り、{@link android.app.job.JobParameters} オブジェクトが {@code MediaContentJob.class} の {@link android.app.job.JobService#onStartJob onStartJob()} メソッドに渡されます。 + + + +
+ ++ また、N Developer Preview では、{@link android.app.job.JobParameters} が拡張され、ジョブをトリガーしたコンテンツ権限や URI についての有用な情報をアプリが受け取れるようになっています。 + + +
+ ++ 次のサンプルコードは、{@link + android.app.job.JobService#onStartJob JobService.onStartJob()} メソッドをオーバーライドし、ジョブを起動したコンテンツ権限と URI を記録します。 + +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ アプリをメモリ不足の端末またはメモリ不足の状況で実行するために最適化すると、パフォーマンスとユーザー エクスペリエンスが向上します。 +バックグラウンド サービスと静的に登録された暗黙的なブロードキャスト レシーバーへの依存関係を削除すると、そのような端末上のアプリの動作が向上します。 + +N Developer Preview では、これらの問題を削減するための措置が講じられていますが、これらのバックグラウンド処理をまったく使用せずに、アプリが実行されるように最適化することをお勧めします。 + + + +
+ ++ N Developer Preview には、それらのバックグラウンド処理を無効にした状態でアプリの動作をテストするために使用できるいくつかの Android デバッグ ブリッジ(ADB)コマンドが追加されています。 + +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N は 、 電源を入れたときにユーザーが端末のロックを解除していない場合、セキュリティで保護された「ダイレクト ブート」モードで実行します。 + +この機能をサポートするため、システムで次の 2 つの保存先を使用できるようになります。
+ +デフォルトで、ダイレクト ブート モード中はアプリは実行されません。ダイレクト ブート モード中にアプリでアクションを実行する必要がある場合、このモードで実行するアプリ コンポーネントを登録できます。 + +ダイレクト ブート モードでアプリの実行が必要になる一般的な使用例は次のとおりです。 +
+ +ダイレクト ブート モードで実行中にアプリがデータにアクセスする必要がある場合は、端末暗号化ストレージを使用します。 +端末暗号化ストレージにはキーで暗号化されたデータが保存され、端末がセキュア ブートに成功した場合にのみこのデータを使用できます。 + +
+ +ユーザーの資格情報に関連付けたキーで暗号化しなければならない PIN やパスワードなどのデータには、資格情報暗号化ストレージを使用します。資格情報暗号化ストレージは、ユーザーが端末のロック解除に成功した後に使用可能になり、ユーザーが端末を再起動するまでアクセスできます。 + + +ユーザーが端末をロック解除した後にロック画面を有効にしても、資格情報暗号化ストレージはロックされません。 + +
+ +ダイレクト ブート モード中にアプリを実行したり、端末暗号化ストレージにアクセスしたりするには、アプリ コンポーネントの登録が必要です。
+
+アプリをシステムに登録するには、コンポーネントが暗号化対応するように指定します。
+コンポーネントが暗号化対応するよう指定するには、マニフェスト内で
+android:encryptionAware
属性を true に設定します。
+ +
暗号化対応コンポーネントを登録しておくと、端末を再起動したときにシステムから
+LOCKED_BOOT_COMPLETED
ブロードキャスト メッセージを受信できます。
+この時点で端末暗号化ストレージが使用できるようになり、ダイレクト ブート モード中にコンポーネントが実行しなければならないタスクを実行できます。たとえば、スケジュールしたアラームのトリガーなどが該当します。
+
+
次のコード スニペットは、アプリのマニフェスト内で
+{@link android.content.BroadcastReceiver} を暗号化対応として登録し、LOCKED_BOOT_COMPLETED
のインテント フィルタを追加する方法の例を示しています。
+
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
ユーザーが端末のロックを解除すると、すべてのコンポーネントは端末暗号化ストレージと資格情報暗号化ストレージの両方にアクセスできます。 +
+ +暗号化端末ストレージにアクセスするには、
+Context.createDeviceEncryptedStorageContext()
を呼び出して追加の
+{@link android.content.Context} インスタンスを作成します。このコンテキストで実行されたストレージ API 呼び出しはすべて、端末暗号化ストレージにアクセスします。
+次の例では、端末暗号化ストレージにアクセスして既存のアプリのデータ ファイルを開きます。
+
+
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
端末暗号化ストレージは、ダイレクト ブート モード中にアクセスが必要な情報のみに使用してください。汎用的な暗号化された保存先として、端末暗号化ストレージを使用することはできません。ユーザーの個人情報や、ダイレクト ブート モード中に特に必要ではない暗号化されたデータには、資格情報暗号化ストレージを使用してください。 + + + +
+ +再起動後にユーザーが端末のロックを解除すると、アプリは資格情報暗号化ストレージへのアクセスに切り替えて、ユーザーの資格情報に応じて通常のシステム サービスを使用します。 + +
+ +再起動後、ユーザーが端末のロックを解除したときに通知を受信するには、実行中のコンポーネントから {@link android.content.BroadcastReceiver} を登録して、ACTION_USER_UNLOCKED
メッセージをリッスンするようにします。
+
+または、既存の {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} メッセージを受信することもできます。このメッセージは、端末が起動してユーザーが端末のロックを解除したことを示すようになりました。
+
+
+UserManager.isUserUnlocked()
を呼び出して、ユーザーが端末のロックを解除したかを直接問い合わせることもできます。
ユーザーが端末をアップデートしてダイレクト ブート モードを使用できるようになると、既存のデータを端末暗号化ストレージに移行しなければならない場合があります。
+
+Context.migrateSharedPreferencesFrom()
および
+Context.migrateDatabaseFrom()
を使用すると、設定およびデータベースのデータを資格情報暗号化ストレージと端末暗号化ストレージ間で移行できます。
+
どのデータを資格情報暗号化ストレージから端末暗号化ストレージに移行するかは、慎重に判断してください。 +パスワードや認証トークンなどのユーザーの個人情報は、端末暗号化ストレージに移行しないでください。 + +場合によっては、この 2 つの暗号化された保存先に、データセットを振り分けて管理する必要があります。 +
+ +新しいダイレクト ブート モードを使用して、暗号化対応アプリをテストしてみましょう。ダイレクト ブートを有効にする方法は 2 つあります。 +
+ +警告:ダイレクト ブートを有効にすると、端末上のすべてのユーザーデータが消去されます。 +
+ +Android N がインストールされたサポート対象端末では、次のいずれかの方法を使用してダイレクト ブートを有効にします。 +
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
テスト端末でモードの切り替えが必要な場合、エミュレーションされたダイレクト ブート モードも使用できます。 +データが失われるおそれがありますので、EMULATED モードは開発中にのみ使用してください。 +エミュレーションされたダイレクト ブート モードを有効にするには、端末でロック パターンを設定します。ロック パターンの設定時にセキュリティで保護されたスタートアップ画面について確認メッセージが表示された場合は、[No thanks] を選択します。次に、次の adb shell コマンドを使用します。 + + +
+ ++$ adb shell sm set-emulate-fbe true ++ +
エミュレーションされたダイレクト ブート モードを無効にするには、次のコマンドを使用します。
+ ++$ adb shell sm set-emulate-fbe false ++ +
これらのコマンドを使用すると、端末が再起動されます。
diff --git a/docs/html-intl/intl/ja/preview/features/icu4j-framework.jd b/docs/html-intl/intl/ja/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..791a67fe4c0f --- /dev/null +++ b/docs/html-intl/intl/ja/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=ICU4J Android フレームワーク API + +@jd:body + ++ ICU4J は幅広く使用されている、オープン ソースの Java ライブラリのセットで、Unicode のほか、ソフトウェア アプリケーションのグローバル化のサポートを提供しています。 +Android N では、アプリのデベロッパー向けの Android フレームワーク内で ICU4J API のサブセットを公開しており、{@code android.icu} パッケージ内で使用できます。 + +これらの API は、端末上のローカライズ データを使用します。 +そのため、ICU4J ライブラリを APK にコンパイルせず、フレームワーク内にあるライブラリを呼び出せばよいので、APK のフットプリントを削減できます + +(この場合、Android N より前のバージョンの Android を実行しているユーザーも、ICU4J ライブラリを含むバージョンのアプリをダウンロードできるようにするには、APK を複数のバージョン用意する必要があります)。 + + + +
+ ++ ここではまず、これらのライブラリをサポートするために必要な最低限の Android API レベルについて基本的な情報を説明します。 +次に、Android 固有の ICU4J の実装に必要な情報を説明します。 +最後に、Android フレームワーク内で ICU4J API を使用する方法について説明します。 + +
+ +
+ Android N では、com.ibm.icu
ではなく
+android.icu
パッケージを介して ICU4J API のサブセットを公開しています。Android フレームワークでは、さまざまな理由により ICU4J API を公開しないという選択も考えられます。たとえば、Android N で廃止された API を公開しないため、または ICU チームからまだ安定版の発表がないため、などの理由があります。
+
+
+
+ICU チームが今後 API を廃止した場合、Android でも廃止と見なすことになりますが、引き続きそれらの API を含める予定です。
+
+
Android API レベル | +ICU バージョン | +CLDR バージョン | +
---|---|---|
Android N | +56 | +28 | +
いくつか注意事項があります。
+ +
+ アプリ内で既に ICU4J API を使用しており、
+android.icu
API がその要件を満たしている場合、このフレームワーク API に移行するには、Java のインポートを com.ibm.icu
から android.icu
に変更します。
+
+次に、APK から ICU4J ファイルのコピーを削除します。
+
+
+ 注: ICU4J フレームワーク API では、名前空間に {@code com.ibm.icu} ではなく{@code android.icu} を使用します。 +これは、独自の {@code com.ibm.icu} ライブラリを含む APK で名前空間が競合しないようにするためです。 + +
+ +
+ java
および android
パッケージには、ICU4J にあるクラスと同等のクラスが一部含まれています。
+しかし多くの場合、ICU4J では、より幅広い標準と言語のサポートを提供しています。
+
+
次に、すぐに利用できる例をいくつか示します。
+クラス | +代替クラス | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J は ICU ライセンスでリリースされています。詳細については、ICU User Guide をご覧ください。 + +
diff --git a/docs/html-intl/intl/ja/preview/features/multi-window.jd b/docs/html-intl/intl/ja/preview/features/multi-window.jd new file mode 100644 index 000000000000..2d5417894022 --- /dev/null +++ b/docs/html-intl/intl/ja/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=マルチ ウィンドウのサポート +page.metaDescription=複数のアプリを同時に表示するための Android N の新しいサポート。 +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N には、複数のアプリを同時に表示するためのサポートが追加されています。 +ハンドヘルド端末で、分割画面モードにして、2 つのアプリを並べて実行したり、重ねて表示したりできます。 +TV デバイスで、アプリがピクチャ イン ピクチャ モードでビデオを再生しているときに、ユーザーは別のアプリを操作できます。 + + +
+ ++ N Preview SDK でアプリをビルドする場合、アプリがマルチ ウィンドウ ディスプレイを処理をする方法を設定できます。 +たとえば、アクティビティの最小許容ディメンションを指定できます。 +また、アプリに対してマルチ ウィンドウ ディスプレイを無効にし、アプリを全画面モードのみで表示することもできます。 + + +
+ ++ Android N では、複数のアプリが画面を同時に共有できます。たとえば、ユーザーは画面を分割し、ウェブページを左側の画面に表示しながら、右側の画面でメールを作成することができます。 + +ユーザー エクスペリエンスは端末によって異なります。 + +
+ ++ ユーザーは、次の方法でマルチ ウィンドウ モードに切り替えることができます。 +
+ ++ ユーザーは、複数のアクティビティが画面を共有しているときに、データを 1 つのアクティビティから別のアクティビティにドラッグ アンド ドロップできます + +(以前は、単一のアクティビティ内でのみデータをドラッグ アンド ドロップできました)。 + +
+ ++ マルチ ウィンドウ モードは、アクティビティのライフサイクルを変更しません。 + +
+ ++ マルチ ウィンドウ モードでは、ユーザーが直前に操作したアクティビティのみが任意の時点でアクティブになります。 +このアクティビティは、トップ レベルにあると見なされます。 + 他のすべてのアクティビティは、表示されていても一時停止状態になっています。 + ただし、一時停止状態ではあるが、表示されているこれらのアクティビティには、表示されていないアクティビティよりも高い優先度が付与されます。 +ユーザーが一時停止状態のアクティビティのいずれかを操作した場合、そのアクティビティが再開され、前のトップ レベルのアクティビティが一時停止します。 + + +
+ ++ 注: マルチ ウィンドウ モードでは、アプリが一時停止状態になっても、そのアプリを表示したままにすることができます。 +アプリは、一時停止していても、アクティビティを続行する必用がある場合があります。 +たとえば、一時停止モードになっているが、表示されているビデオ再生アプリは、ビデオの表示を継続する必要があります。 +そのため、ビデオを再生するアクティビティが {@link android.app.Activity#onPause onPause()} ハンドラでビデオを一時停止しないようにすることをお勧めします。 + + + その代わり、これらのアクティビティは {@link android.app.Activity#onStop + onStop()} でビデオを一時停止し、{@link android.app.Activity#onStart + onStart()} でビデオの再生を再開する必要があります。 +
+ ++ 実行時の変更の処理で指定したように、ユーザーがアプリをマルチ ウィンドウ モードにすると、アクティビティに構成の変更が通知されます。 + +基本的に、この構成の変更は、端末が縦表示から横表示に切り替えられたことをアプリに通知する場合と同じ影響(端末のディメンションが変更された場合を除いて)をアクティビティのライフサイクルに及ぼします。 + + +実行時の変更の処理で説明したように、アクティビティは構成の変更を処理することができます。または、システムによってアクティビティを破棄し、新しいディメンションでアクティビティを再作成することもできます。 + + + +
+ +
+ ユーザーがウィンドウのサイズを変更して、高さや幅を拡大した場合、ユーザー アクションに一致するようにアクティビティのサイズが変更され、必要に応じて、実行時の変更が発行されます。
+
+アプリで新しく表示された領域を描画するまでに時間がかかる場合、{@link
+ android.R.attr#windowBackground windowBackground} 属性またはデフォルトの
+windowBackgroundFallback
システム属性によって指定された色でこれらの領域が一時的に塗りつぶされます。
+
+
+ アプリが Android N をターゲットにしている場合は、アプリのアクティビティがマルチ ウィンドウ ディスプレイをサポートする方法や、このサポートを行うかどうかを決めることができます。 +サイズとレイアウトを制御するための属性をマニフェストに設定できます。 + + ルート アクティビティ属性の設定は、タスクスタック内のすべてのアクティビティに適用されます。 + +
+ ++ 注: Android N より前の SDK バージョンでマルチ オリエンテーション アプリをビルドして、そのアプリをマルチ ウィンドウ モードで使用する場合は、アプリのサイズが強制的に変更されます。 + +アプリに予想外の動作が発生する場合があることをユーザーに警告するダイアログ ボックスが表示されます。 +システムは、向きが固定されたアプリのサイズを変更しません。ユーザーがマルチ ウィンドウ モードで向きが固定されたアプリを開こうとすると、そのアプリが全画面で表示されます。 + + + +
+ +
+ マルチ ウィンドウ ディスプレイを有効または無効にするには、この属性をマニフェストの <activity>
ノードまたは
+<application>
ノードに設定します。
+
+
+android:resizeableActivity=["true" | "false"] ++ +
+ この属性が true に設定されている場合、アクティビティを分割画面モードまたはフリーフォーム モードで起動できます。 +この属性が false に設定されている場合、アクティビティはマルチ ウィンドウ モードをサポートしません。 +この値が false のとき、ユーザーがアクティビティをマルチ ウィンドウ モードで起動しようとすると、アクティビティが全画面で表示されます。 + + +
+ ++ アプリが Android N をターゲットにしているが、この属性の値が指定されていない場合、属性の値がデフォルトの true になります。 + +
+ +
+ この属性をマニフェストの <activity>
ノードに設定すると、アクティビティがピクチャ イン ピクチャ ディスプレイをサポートするかどうかを示すことができます。
+android:resizeableActivity
が false の場合、この属性は無視されます。
+
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ Android N では、<layout>
マニフェスト要素により、マルチ ウィンドウ モードでのアクティビティの動作に影響を及ぼすいくつかの属性がサポートされています。
+
+
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + たとえば、次のコードは、アクティビティがフリーフォーム モードで表示されているときに、アクティビティのデフォルトのサイズと位置、およびその最小サイズを指定する方法を示しています。 + + +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N では、マルチ ウィンドウ モードで実行できるアプリをサポートするための新しい機能が導入されています。 + +
+ ++ 端末がマルチ ウィンドウ モードになっている場合、特定の機能は、端末の画面を他のアクティビティやアプリと共有する場合があるアクティビティに対して機能しないため、これらの機能は無効なるか、無視されます。 + +これらの機能には、次のものが含まれます。 + +
android:screenOrientation
属性に加えられた変更を無視します。
+ + マルチ ウィンドウ ディスプレイをサポートするために、次の新しいメソッドが {@link android.app.Activity} クラスに追加されています。 +各メソッドの詳細については、N プレビュー SDK リファレンスをご覧ください。 + +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ 注: ピクチャ イン ピクチャ モードは、マルチ ウィンドウ モードの特別な形態です。
+myActivity.inPictureInPicture()
が true を返す場合は、myActivity.inMultiWindow()
も true を返します。
+
+
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ また、これらの各メソッドの {@link android.app.Fragment} バージョンがあります。たとえば、Fragment.inMultiWindow()
です。
+
+
+ アクティビティをピクチャ イン ピクチャ モードにするには、新しいメソッド
+Activity.enterPictureInPicture()
を呼び出します。端末がピクチャ イン ピクチャ モードをサポートしない場合、このメソッドの効果はありません。
+詳細については、ピクチャ イン ピクチャに関するドキュメントをご覧ください。
+
+
+ 新しいアクティビティを起動するときに、可能であれば、新しいアクティビティを現在のアクティビティの隣に表示する必用があるかどうかをシステムに示すことができます。
+そうするには、フラグ
+Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
を使用します。
+このフラグを渡すと、次の動作がリクエストされます。
+
+
+ 端末がフリーフォーム モードになっている場合、新しいアクティビティを起動するときに、
+ActivityOptions.setLaunchBounds()
を呼び出すことにより、新しいアクティビティのディメンションと画面上での位置を指定することができます。
+端末がマルチ ウィンドウ モードではない場合、このメソッドの効果はありません。
+
+
+ 注: タスクスタック内でアクティビティを起動すると、画面上のアクティビティが起動したアクティビティに置き換えられ、すべてのマルチ ウィンドウ プロパティが継承されます。 + +マルチ ウィンドウ モードで新しいアクティビティを別個の画面として起動する場合は、新しいアクティビティを新しいタスクスタックで起動する必要があります。 + +
+ ++ ユーザーは、2 つのアクティビティが画面を共有しているときに、データを 1 つのアクティビティから別のアクティビティにドラッグ アンド ドロップできます + +(以前は、単一のアクティビティ内でのみデータをドラッグ アンド ドロップできました)。 +そのため、アプリがドラッグ アンド ドロップをサポートしていない場合は、ドラッグ アンド ドロップ機能をアプリに追加する必要があります。 + +
+ +
+ N プレビュー SDK では、異なるアプリ間のドラッグ アンド ドロップをサポートするために、android.view
パッケージが拡張されています。
+次のクラスとメソッドの詳細については、N プレビュー SDK リファレンスをご覧ください。
+
+
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
を渡します。
+URI パーミッションを受け取る側のアクティビティに付与する必要がある場合、必要に応じて、新しいフラグ
+View.DRAG_FLAG_GLOBAL_URI_READ
または
+View.DRAG_FLAG_GLOBAL_URI_WRITE
を渡します。
+
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + ユーザーが Android N を実行している端末をマルチ ウィンドウ モードにしてアプリの起動を試みる場合に備えて、Android N 向けにアプリをアップデートするかどうかに関係なく、アプリがマルチ ウィンドウ モードでどのように動作するかを確認する必要があります。 + + +
+ ++ Android N を端末にインストールすると、分割画面モードが自動的にサポートされます。 + +
+ ++ アプリが N プレビュー SDK でビルドされていないときに、ユーザーがマルチ ウィンドウ モードでそのアプリを使用しようとすると、アプリが向きの固定を宣言しない限り、アプリのサイズが強制的に変更されます。 + + +
+ ++ アプリが向きの固定を宣言しない場合、Android N を実行している端末でアプリを起動し、アプリを分割画面モードにすることを試みる必要があります。 + +アプリのサイズが強制的に変更されたときに、ユーザー エクスペリエンスが許容範囲内にあることを確認してください。 + +
+ ++ アプリが向きの固定を宣言する場合、アプリをマルチ ウィンドウ モードにすることを試みる必要があります。 +アプリをマルチ ウィンドウ モードにすることを試みたとき、アプリが全画面モードのままであることを確認してください。 + +
+ ++ アプリが N プレビュー SDK でビルドされていて、マルチ ウィンドウ モードが無効になっていない場合、分割画面モードとフリーフォーム モードの両方で次の動作を確認してください。 + + +
+ ++ アプリのパフォーマンスをマルチ ウィンドウ モードで確認するには、以下の操作を試みてください。 +特に記載のない限り、分割画面モードとマルチ ウィンドウ モードの両方でこれらの操作を試みる必要があります。 + +
+ +
+
+android:resizableActivity="false"
を設定して、マルチ ウィンドウのサポートを無効にした場合は、Android N を実行している端末でアプリを起動し、アプリをフリーフォーム モードおよび分割画面モードにすることを試みる必要があります。
+
+アプリをマルチ ウィンドウ モードにすることを試みたとき、アプリが全画面モードのままであることを確認してください。
+
+
Android N では、複数言語のユーザーのサポートが強化されており、設定で複数のロケールを選択できます。 +Android N ではこの機能を提供するために、サポート対象のロケール数を大幅に拡大し、システムがリソースを解決する方法を変更しました。 + +この新しいリソース解決方法は、より堅牢で、既存の APK との互換性を保つよう設計されていますが、予想外の動作には十分に注意してください。 + +たとえば、アプリで目的の言語がデフォルトに設定されているかをテストする必要があります。 +また、アプリで複数の言語をサポートする場合、そのサポートが意図したとおりに機能するかを確かめてください。 + +最後に、明示的にサポートを設計していない言語については、アプリで適切に処理する必要があります。 +
+ +このドキュメントでは最初に、Android N より前のバージョンのリソース解決方針について説明します。次に、Android N の改善されたリソース解決方針について説明します。 + +最後に、増大したロケールを活用し、より多くの複数言語ユーザーをサポートする方法について説明します。 +
+ +Android N より前のバージョンの Android では、アプリとシステムのロケールを一致させることができない場合がありました。 +たとえば、アプリのデフォルトの言語が米国英語で、{@code es_ES} リソース ファイルでスペイン語の文字列もローカライズされていたとします。 + +
+Java コードが文字列を参照したとき、次のように文字列の言語を解決していました。 +
+これらの解決の問題は、完全一致が見つからなかった場合に、ロケールの国コードが無視されることが原因で起こります。 +次に例を示します。
+ +ユーザー設定 | +アプリのリソース | +リソース解決 | +
---|---|---|
fr_CH | +
+デフォルト(en) +de_DE +es_ES +fr_FR +it_IT + |
+
+fr_CH を試行 => 失敗 +fr を試行 => 失敗 +デフォルト(en)を使用 + |
+
この例では、システムはユーザーが英語を理解できるかどうかを認識せず、英語の文字列を表示します。 +この動作は現在、ごく一般的です。 +Android N では、このような状況が大幅に削減されるはずです。 +
+ +Android N は、より堅牢なリソース解決を導入しており、自動的に適切な代替言語を見つけます。
+ただし、解決を迅速化し保守性を向上させるには、最も一般的な親言語でリソースを保存する必要があります。
+
+ たとえば、これまで {@code es-US} ディレクトリにスペイン語のリソースを保存していた場合、{@code es-419} ディレクトリに移動します。ここには、ラテンアメリカのスペイン語が格納されます。
+
+ 同様に {@code en-GB} という名前のフォルダにリソースを保存している場合、そのフォルダの名前を {@code en-001}(国際英語)に変更します。en-GB
文字列の最も一般的な親言語は {@code en-001} であるためです。
+
+
+ 次の例では、このような対応がリソース解決のパフォーマンスと信頼性を向上する根拠について説明します。
+
Android N では、表 1 で説明した例の解決方法が異なります。 +
+ + +ユーザー設定 | +アプリのリソース | +リソース解決 | +
---|---|---|
|
+
+デフォルト(en) +de_DE +es_ES +fr_FR +it_IT + |
+
+fr_CH を試行 => 失敗 +fr を試行 => 失敗 +fr の子言語を試行 => fr_FR +fr_FR を使用 + |
+
これで、ユーザーは英語ではなくフランス語のリソースを利用できます。この例は、フランス語の文字列を Android N の {@code fr_FR} ではなく {@code fr} に保存すべき理由も示しています。これが、最も近い親言語と一致させ、迅速に解決し、予測しやすくするための対策になります。 + + +
+ +この改善された解決ロジックに加えて、Android では、選択できるユーザー言語を増やしました。 +もう一度上記の例で説明します。今回は、追加のユーザー言語としてイタリア語が指定され、アプリはフランス語をサポートしていません。 +
+ + +ユーザー設定 | +アプリのリソース | +リソース解決 | + +
---|---|---|
|
+
+デフォルト(en) +de_DE +es_ES +it_IT + |
+
+fr_CH を試行 => 失敗 +fr を試行 => 失敗 +fr の子を試行 => 失敗 +it_CH を試行 => 失敗 +it を試行 => 失敗 +it の子言語を試行 => it_IT +it_IT を使用 + |
+
+
アプリでフランス語をサポートしていなくても、ユーザーが理解できる言語が使用されます。 +
+ + +Android N では、新しい API {@code LocaleList.GetDefault()} が加わりました。これにより、アプリは直接、ユーザーが指定した言語のリストを問い合わせることができます。 +この API を使用すると、アプリの動作がさらに洗練され、コンテンツの表示がより最適化されます。 + +たとえば検索で、ユーザーの設定に基づいて複数の言語で結果を表示できます。 +ブラウザ アプリは、ユーザーが理解できる言語の翻訳ページを表示することがなくなり、キーボード アプリは、自動的に最適なレイアウトを有効にすることができます。 + +
+ +Android 6.0(API レベル 23)までは、Android は多くの一般的な言語(en、es、ar、fr、ru)に対して 1 つか 2 つのロケールのみをサポートしていました。 + +各言語にはわずかなバリエーションしかなかったため、アプリはリソース ファイルでハードコーディングされた文字列として数字や日付を保存し、処理することができました。 + +しかし Android で幅広いロケールのセットがサポートされるようになったため、日付、時刻、通貨などの情報は、1 つのロケール内でも形式が大幅に異なる場合があります。 + + +形式をハードコーディングすると、エンドユーザーが混乱するおそれがあります。 +したがって、Android N で開発するときは、数字や日付の文字列をハードコーディングせず、必ずフォーマッタを使用してください。 +
+ +その良い例がアラビア語です。アラビア語のロケールのサポートは {@code ar_EG} の 1 つだけでしたが、Android N では 27 に増えました。 +これらのロケールは、ほとんどのリソースを共有できますが、数字は ASCII 表記とネイティブ表記で好みが分かれています。 +たとえば、「4 桁の PIN を選択してください」など、数字の変数を含む文を作成する場合、以下のようにフォーマッタを使用します。 + +
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/ja/preview/features/notification-updates.jd b/docs/html-intl/intl/ja/preview/features/notification-updates.jd new file mode 100644 index 000000000000..bbd8481f8eea --- /dev/null +++ b/docs/html-intl/intl/ja/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=通知 +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + +
Android N には、アプリが視認性の高いインタラクティブな通知をポストできるようにする新しい API がいくつか導入されています。 +
+ +Android N では、ハンドセットでインライン リプライをサポートするために、既存の {@link android.support.v4.app.RemoteInput} 通知 API が拡張されています。 +これらの機能を使用すると、ユーザーは、アプリにアクセスすることなく、通知シェードからすばやく応答できます。 +
+ ++ Android N では、類似した通知をバンドルして、単一の通知として表示することもできます。 +このバンドルを可能にするために、Android N では、既存の {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} メソッドが使用されます。ユーザーは、各通知を展開して、通知シェードから個別に返信や消去などのアクションを各通知に対して行うことができます。 + + +
+ +最後に、Android N には、アプリのカスタマイズした通知ビューでシステム デコレーションを活用できるようにする新しい API が追加されています。 +これらの API は、通知ビューで、標準のテンプレートを使った一貫した表示を共有できるようにします。 + +
+ +このドキュメントでは、アプリでこれらの新しい通知機能を使用するときに考慮する必要のある主な変更点について説明します。 +
+ +Android N のダイレクト リプライ機能を使用すると、ユーザーは、テキスト メッセージにすばやく応答したり、通知インターフェース内でタスク リストを直接アップデートしたりできます。 + +ハンドヘルド デバイスでは、インライン リプライ アクションが、通知にアタッチされた追加ボタンとして表示されます。 +ユーザーがキーボード経由で返信する場合、通知アクション向けに指定したインテントにテキストによる応答がアタッチされ、そのインテントがハンドヘルド デバイス用アプリに送信されます。 + + + + + + +
+ +ダイレクト リプライをサポートする通知アクションを作成する方法は次のとおりです。 +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
を使用して、{@link android.support.v4.app.RemoteInput} オブジェクトをアクションにアタッチします。
+
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
ユーザーが通知アクションをトリガーすると、ユーザーは応答を入力するよう求められます。 +
+ + + + +リプライ アクションのインテントで宣言したアクティビティで、通知インターフェースからのユーザー入力を取得する方法は次のとおりです。 +
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
次のコード スニペットは、メソッドがバンドルから入力テキストを取得する方法を示しています。 +
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
アプリはロジックを適用して、取得したテキストに対して実行するアクションを決定できます。インタラクティブなアプリ(チャットなど)の場合、ユーザーが適切に応答できるように通知自体により多くのコンテキスト(たとえば、ユーザー自身のメッセージを含めた、複数行のチャット履歴)を提供します。ユーザーが {@link android.support.v4.app.RemoteInput} を介して応答する場合は、{@code setRemoteInputHistory()} メソッドを使って、返信履歴にテキスト メッセージを含めます。 + + + + + + +
+ +Android N は、通知のキューを表す新しい方法である + バンドル通知をデベロッパーに提供します。この機能は、Android Wear の通知スタック機能に似ています。 + +たとえば、受信したメッセージの通知をアプリで作成する場合、複数のメッセージが受信されると、通知が単一のグループにバンドルされます。 + +既存の {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} メソッドを使用して、同様の通知をバンドルできます。 +
+ ++ 通知グループでは、通知グループを構成する通知が階層化されます。 + この階層の最上位には、そのグループの概要情報を表示する親通知があります。 +ユーザーは通知グループを順次展開できます。ユーザが階層を深くたどると、より多くの情報が表示されます。 + +ユーザーがバンドルを展開すると、すべての子通知の詳細情報が表示されます。ユーザーがいずれかの通知を展開すると、その内容がすべて表示されます。 + + +
+ + + + +通知をグループに追加する方法については、各通知をグループに追加するをご覧ください。 + +
+ + +このセクションでは、前のバージョンの Android プラットフォームで利用可能な {@link android.app.Notification.InboxStyle InboxStyle} 通知の代わりに、通知グループを使用する必要がある状況についてのガイドラインを提供します。 + + +
+ +ユースケースで次のすべての条件が満たされた場合にのみ通知グループを使用する必要があります。 +
+ +通知グループの適切なユースケースの例には、着信メッセージのリストを表示するメッセージング アプリや受信したメールのリストを表示するメールアプリなどが含まれます。 + +
+ ++単一の通知が望ましいユースケースの例には、1 人のユーザーからの個別メッセージや、1 行のテキスト アイテムのリスト表示が含まれます。 + +このリスト表示を行うには、 +{@link android.app.Notification.InboxStyle InboxStyle} または {@link android.app.Notification.BigTextStyle BigTextStyle} を使用します。 + + +
+ ++ アプリは、グループに単一の子通知が含まれている場合でも、グループの概要を常にポストする必要があります。 +グループに単一の通知のみが含まれている場合、システムによって、概要の表示が非表示になり、子通知が直接表示されます。 +これにより、ユーザーがグループの子通知をスワイプして消すときに一貫した使用感が出ます。 + + +
+ ++ 注: このバージョンの Android N では、単一の子通知が含まれる通知グループの概要を非表示にできません。 +この機能は、将来のバージョンの Android N に追加されます。 + +
+ +通常、子通知はグループとして表示されますが、子通知をヘッドアップ通知として一時的に表示するように設定できます。 + + +この機能は、特に最新の子通知とその関連するアクションへの即時アクセスを可能にするので便利です。 + +
+ + ++ Android 5.0(API レベル 21)以降では、Android Wear 端末をサポートするために、通知グループとリモート入力が {@link + android.app.Notification} API の一部になっています。 +これらの API を使用して通知を既に作成している場合は、アプリの動作が上記のガイドラインに適合していることの確認と、{@code + setRemoteInputHistory()} の実装検討のみを行ってください。 + + +
+ ++ 下位互換性をサポートするために、サポート ライブラリの {@link android.support.v4.app.NotificationCompat} クラスで同じ API が利用できるようになっているため、前の Android バージョンで機能する通知を作成できます。 + + +携帯端末とタブレットでは、概要通知のみがユーザーに表示されるため、アプリは、受信トレイスタイルやグループの全情報を表す同等の通知を引き続きサポートする必要があります。 + +Android Wear 端末では、古いプラットフォーム レベル上にもすべての子通知が表示されるため、API レベルに関係なく、子通知を作成する必要があります。 + + + +
+ +Android N 以降では通知ビューをカスタマイズでき、通知ヘッダー、アクション、展開レイアウトなどのシステム デコレーションを引き続き取得できます。 + +
+ +この機能を有効にするために、Android N には、カスタムビューにスタイルを適用する次の API が追加されています。 +
+ +この新しい API を使用するには、{@code setStyle()} メソッドを呼び出し、目的のカスタムビュー スタイルに渡します。 +
+ +次のコード スニペットは、{@code DecoratedCustomViewStyle()} メソッドでカスタム通知オブジェクトを作成する方法を示しています。 +
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/ja/preview/features/picture-in-picture.jd b/docs/html-intl/intl/ja/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..a7f2a9225618 --- /dev/null +++ b/docs/html-intl/intl/ja/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=ピクチャ イン ピクチャ +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
Android N では、Android TV ユーザーは、アプリを操作するときに画面の隅に固定されたウィンドウでビデオを視聴できるようになりました。 + +ピクチャ イン ピクチャ(PIP)モードを使用すると、アプリはバックグランドで別のアクティビティを続けながら、固定されたウィンドウでビデオ アクティビティを実行できるようになります。 + +PIP ウィンドウでは、アプリの使用中にマルチタスクを実行できます。これにより、ユーザーの作業効率が向上します。 +
+ +アプリで、PIP モードをトリガーするタイミングを決めることができます。次に、PIP モードの開始時点の例を示します。 +
+ +PIP ウィンドウは 240 x 135 dp で、画面の 4 つのコーナーのうちいずれかの一番上のレイヤに表示されます。表示する場所はシステムによって選択されます。 +ユーザーは PIP メニューを表示して、PIP ウィンドウを全画面表示に切り替えたり、リモコンの [Home] ボタンを押して PIP ウィンドウを閉じたりすることができます。 + +別のビデオがメイン画面で再生を開始すると、PIP ウィンドウは自動的に閉じます。 + +最近使ったアプリから PIP ウィンドウを閉じることもできます。
+ + + + +PIP では、Android N で使用可能なマルチウィンドウ API を活用し、固定されたビデオ オーバーレイ ウィンドウを表示します。 +PIP をアプリに追加するには、PIP をサポートするアクティビティを登録し、必要に応じてアクティビティを PIP モードに切り替えて、UI 要素を非表示にして、アクティビティが PIP モードを開始してもビデオの再生が続行されるようにします。 + + +
+ +デフォルトでは、システムはアプリの PIP を自動的にサポートしません。アプリで PIP をサポートする場合、マニフェストで
+android:supportsPictureInPicture
および
+android:resizeableActivity
を true
に設定して、ビデオ アクティビティを登録します。
+
+また、アクティビティがレイアウトの設定変更を処理するように指定して、PIP モードの遷移中にレイアウト変更が発生しても、アクティビティが再開しないようにします。
+
+
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
アクティビティを登録する際は、PIP モードでは、アクティビティが TV 画面の小さなオーバーレイ ウィンドウに表示される点に注意してください。 +ビデオの再生アクティビティは、最小限の UI にすることで最高のユーザー エクスペリエンスを提供できます。 +小さな UI 要素を含むアクティビティでは、PIP モードに切り替えたときに優れたユーザー エクスペリエンスを提供できない可能性があります。PIP ウィンドウでは、その UI 要素の詳細が見えづらくなるためです。 + + +
+ +Activity.enterPictureInPicture()
を呼び出します。次の例では、ユーザーがメディア コントロール バーにある専用の PIP ボタンを選択したときに、PIP モードに切り替わります。
+
+
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
メディア コントロール バーに PIP ボタンを追加すると、ユーザーがビデオの再生を操作中に、簡単に PIP モードに切り替えることができます。 +
+ + + + +Android N には、新しい
+PlaybackControlsRow.PictureInPictureAction
クラスが含まれています。このクラスは、コントロール バーの PIP アクションと PIP アイコンの使用方法を定義します。
+
アクティビティが PIP モードを開始したら、ビデオの再生のみを表示する必要があります。
+アクティビティが PIP を開始する前に UI 要素を削除して、再び全画面表示に戻ったら、削除した要素を復元します。Activity.onPictureInPictureChanged()
または
+Fragment.onPictureInPictureChanged()
をオーバーライドして、必要に応じて UI 要素を有効または無効にします。次に例を示します。
+
+
+
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
アクティビティを PIP に切り替えると、システムはそのアクティビティを一時停止状態と見なして、アクティビティの onPause()
メソッドを呼び出します。
+PIP モードによってアクティビティが一時停止になっても、ビデオの再生は一時停止せず、再生を続ける必要があります。
+
+アクティビティの
+onPause()
メソッドで PIP を確認し、適切に再生を処理してください。次に例を示します。
+
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
アクティビティが PIP モードを終了して全画面モードに戻ると、システムはアクティビティを再開して onResume()
メソッドを呼び出します。
+
PIP は、ビデオを全画面表示で再生するアクティビティに使用します。アクティビティを PIP モードに切り替えるときは、ビデオ コンテンツ以外は何も表示しないでください。アクティビティが PIP モードを開始したタイミングを検出し、ピクチャ イン ピクチャの実行中に UI を処理するで説明したように、UI 要素を非表示にします。 + + +
+ +PIP ウィンドウは画面の隅にフローティング ウィンドウとして表示されるため、メイン画面のどの場所にも重要な情報を表示しないでください。PIP ウィンドウによって隠れる可能性があります。 + +
+ +アクティビティが PIP モードになると、デフォルトで、入力フォーカスは失われます。PIP モードで動作中に入力イベントを受け付けるには、
+MediaSession.setMediaButtonReceiver()
を使用します。
+
写真アプリなどは通常、外部ストレージの特定のディレクトリ(Pictures
ディレクトリなど)のみにアクセスする必要があります。
+外部ストレージへのアクセスに関する従来のアプローチでは、このようなアプリに目的のディレクトリへのアクセスを容易に提供できる設計にはなっていませんでした。
+
+次に例を示します。
+
+ +StorageManager
クラスを使用して、適切な
+StorageVolume
インスタンスを取得します。次に、そのインスタンスの
+StorageVolume.createAccessIntent()
メソッドを呼び出して、インテントを作成します。このインテントを使用して、外部ストレージのディレクトリにアクセスします。
+リムーバブル メディア ボリュームなど、使用できるすべてのボリュームのリストを取得するには、
+StorageManager.getVolumesList()
を使用します。
+
次のコード スニペットは、プライマリ共有ストレージの
+Pictures
ディレクトリを開く方法の例を示しています。
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
システムは外部ディレクトリへのアクセスの付与を試行し、必要に応じてシンプルな UI で、ユーザーにアクセスを確認します。 +
+ + + + +ユーザーがアクセスを付与すると、
+Activity.RESULT_OK
の結果コードと、URI を含むインテント データを指定して、
+onActivityResult()
のオーバーライドを呼び出します。提供された URI を使用して、ディレクトリの情報にアクセスします。これは、ストレージ アクセス フレームワークで返された URI を使用する場合と同様です。
+
+
+
+
ユーザーがアクセスを付与しなかった場合は、
+Activity.RESULT_CANCELED
の結果コードと、null のインテント データを指定して、
+onActivityResult()
のオーバーライドを呼び出します。
注: 特定の外部ディレクトリへのアクセスを取得すると、そのディレクトリ内のサブディレクトリへのアクセスも取得します。 +
+ +特定のディレクトリへのアクセスを使用してリムーバブル メディア上のディレクトリにアクセスするには、まず {@link android.os.Environment#MEDIA_MOUNTED} 通知をリッスンする {@link android.content.BroadcastReceiver} を追加します。次に例を示します。 + +
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
ユーザーが SD カードなどのリムーバブル メディアをマウントすると、システムは
+{@link android.os.Environment#MEDIA_MOUNTED} 通知を送信します。この通知は、インテント データ内の StorageVolume
オブジェクトを提供します。このオブジェクトを使用して、リムーバブル メディア上のディレクトリにアクセスできます。
+
+次の例では、リムーバブル メディア上の Pictures
ディレクトリにアクセスします。
+
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
外部ディレクトリのアクセス URI はできる限り保持してください。そうすれば、ユーザーに何度もアクセス要求をする必要がなくなります。
+ユーザーがアクセスを付与したら、ディレクトリのアクセス URI を指定して
+getContentResolver().takePersistableUriPermssion()
を呼び出します。
+システムが URI を保持し、以降のアクセス要求では RESULT_OK
を返して、ユーザーに確認の UI を表示しません。
+
+
ユーザーが外部ディレクトリへのアクセスを拒否した直後に、またアクセスを要求しないようにしてください。 +何度もアクセスを要求すると、ユーザー エクスペリエンスが低下します。 +
diff --git a/docs/html-intl/intl/ja/preview/features/security-config.jd b/docs/html-intl/intl/ja/preview/features/security-config.jd new file mode 100644 index 000000000000..6facba61ebf8 --- /dev/null +++ b/docs/html-intl/intl/ja/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=ネットワーク セキュリティ構成 +page.keywords=preview,security,network + +@jd:body + ++ Android N には、ネットワーク セキュリティ構成機能が含まれています。これにより、アプリのコードを修正しなくても、安全な宣言型構成ファイルで、アプリのネットワーク セキュリティの設定をカスタマイズできます。 + +これらの設定は、特定のドメインおよび特定のアプリに対して構成できます。 +主な機能は次のとおりです。 + +
+ ++ ネットワーク セキュリティ構成機能は、XML ファイルを使用します。このファイルで、アプリの設定を指定できます。 +アプリのマニフェストに、このファイルを指すエントリを含める必要があります。 +次のコードはマニフェストからの抜粋で、このエントリの作成方法を示しています。 + +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ アプリで、プラットフォームのデフォルトの設定ではなく、カスタマイズした一連の CA を信頼することが必要な場合があります。 +主な理由は次のとおりです。 +
+ ++ デフォルトで、すべてのアプリのセキュアな接続(TLS、HTTPS など)は、システムにプレインストールされた CA を信頼し、API レベル 23(Android M)以下をターゲットにしたアプリは、ユーザーが追加した CA も信頼します。 + +アプリは {@code base-config}(アプリ全体のカスタマイズ)または {@code domain-config} (ドメイン単位のカスタマイズ)を使用して、独自の接続をカスタマイズすることもできます。 + + + +
+ + ++ 自己署名 SSL 証明書を使用するホストか、または信頼できる非パブリック CA(社内の CA など)によって SSL 証明書が発行されているホストに接続するケースで説明します。 + + +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ PEM または DER 形式で、自己署名または非パブリック CA 証明書を +{@code res/raw/my_ca} に追加します。 +
+ + ++ システムによって信頼されているすべての CA をアプリで信頼したくない場合は、信頼する CA を制限できます。 +これにより、他の CA が発行した偽造証明書からアプリを保護できます。 + +
+ ++ 信頼できる CA を制限するための設定は、特定のドメインでカスタムの CA を信頼する設定と似ています。ただし、リソースで複数の CA を指定できる点が異なります。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ PEM または DER 形式で、信頼できる CA を {@code res/raw/trusted_roots} に追加します。
+ PEM 形式を使用する場合、そのファイルには PEM データのみを含めるようにして、余分なテキストを含めないでください。
+1 つだけでなく複数の
+<certificates>
要素を指定できます。
+
+
+ システムで信頼されていない CA を、アプリが追加で信頼しなければならない場合があります。これは、システムに CA がまだ組み込まれていなかったり、CA が Android システムに組み込まれるための要件を満たしていないことが原因です。 + +CA を追加するには、アプリの構成で複数の証明書ソースを指定します。 + + +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ HTTPS で接続するアプリをデバッグするときは、運用サーバーの SSL 証明書がインストールされていないローカルの開発サーバーへの接続が必要になります。 + +アプリのコードを変更せずにこの接続をサポートするには + + 、 {@code debug-overrides} を使用して、android:debuggable が {@code true} の場合にのみ信頼されるデバッグ限定の CA を指定できます。 + +通常、IDE およびビルド ツールによって、非リリース ビルドには自動的にこのフラグが設定されます。 + +
+ ++ この方法は、通常の条件付きコードよりも安全です。セキュリティ対策として、アプリ ストアでは debuggable とマークされたアプリは拒否されるからです。 + + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ アプリケーションで、セキュアな接続のみを使用して接続する場合、それらの接続先に対して(HTTPS ではなく暗号化されていない HTTP プロトコルを使用する)クリアテキストのサポートを除外できます。 + +このオプションにより、バックエンド サーバーなど外部ソースが提供する URL の変更によって、アプリで思わぬパフォーマンスの低下が発生するのを防ぐことができます。 + + + 詳細については、{@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()} をご覧ください。 +
+ ++ たとえば、アプリで {@code + secure.example.com} へのすべての接続には常に HTTPS を使用して、機密性の高いトラフィックを有害なネットワークから保護することが必要な場合があります。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ 通常、アプリはプレインストールされたすべての CA を信頼します。これらの CA が偽造証明書を発行すると、アプリは MiTM 攻撃のリスクにさらされます。 + +アプリによっては、信頼する CA を制限するか証明書をピン留めすることで、受け入れる証明書を制限できます。 + +
+ ++ 証明書をピン留めするには、公開鍵のハッシュによって証明書のセットを指定します(X.509 証明書の SubjectPublicKeyInfo)。 +証明書チェーンが有効になるのは、証明書チェーンに 1 つ以上のピン留めされた公開鍵が含まれている場合のみです。 + + +
+ ++ 証明書のピン留めを使用するときは、必ずバックアップの鍵を含めてください。そうすれば、新しい鍵に切り替えたり、CA を変更したりする必要が生じた場合に(CA の証明書またはその CA の中間証明書にピン留めしていても)、アプリの接続が影響を受けることはありません。 + + +そうしないと、接続を復元するためにアプリにアップデートをプッシュしなければならなくなります。 + +
+ ++ また、ピン留めの有効期限を設定することもできます。その有効期限を過ぎると、ピン留めが無効になります。 +これにより、アップデートされていないアプリの接続の問題を防ぐことができます。 +ただし、ピン留めに有効期限を設定すると、ピン留めを回避できるようになります。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ 固有の構成で設定されていない値は、継承されます。この動作により、より複雑な構成が可能になるうえ、構成ファイルの読みやすさを維持できます。 + +
+ ++ 固有のエントリに値が設定されていない場合、その次に汎用的なエントリの値が使用されます。 +{@code domain-config} で設定されていない値は、ネストされている場合は親の {@code domain-config} から、ネストされていない場合は {@code + base-config} から取得されます。 +{@code base-config} で設定されていない値には、プラットフォームのデフォルト値を使用します。 + +
+ ++ たとえば、{@code + example.com} のサブドメインに対するすべての接続で、CA のカスタム セットを使用する必要があるケースを考えてみましょう。また、これらのドメインに対するクリアテキストのトラフィックは、{@code + secure.example.com} に接続する場合を除いて許可します。 +{@code example.com} の構成で {@code + secure.example.com} の構成をネストすることで、 +{@code trust-anchors} の重複を回避できます。 +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ ネットワーク セキュリティ構成機能では、XML ファイル形式を使用します。 + ファイルの全体的な構造については、次のコード サンプルをご覧ください。 +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ 次のセクションでは、このファイル形式の構文とその他の詳細について説明します。 + +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
に含まれていない接続先に対するすべての接続に使用される、デフォルトの構成。
+
+
++ 設定されていない値はすべて、プラットフォームのデフォルト値を使用します。API レベル 24 以上をターゲットにしたアプリのデフォルトの構成は次のとおりです。 + +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++API レベル 23 以下をターゲットにしたアプリのデフォルトの構成は次のとおりです。 +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
複数の {@code domain-config} 要素で接続先を指定している場合は、最も具体的な(長い)マッチング ドメイン ルールを持つ構成が採用されます。 +
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ ソースから取得した CA が証明書のピン留めを回避するかどうかを指定します。{@code + "true"} の場合、証明書チェーンはこのソースから取得したいずれかの CA を使用して作成され、ピン留めは実行されません。 +この設定は、CA をデバッグしたり、アプリのセキュアなトラフィックでユーザーの MiTM の許可をサポートするために役立ちます。 + +
+ ++ デフォルトは {@code "false"} です。ただし、{@code debug-overrides} 要素で指定された場合のデフォルトは {@code "true"} です。 + +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
をご覧ください。
+ + 有効期限を設定しておくと、ユーザーがアプリのアップデートを無効にしているなどの原因で、ピンのセットのアップデートを取得していないアプリで、アプリの接続上の問題を回避できます。 + + +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
TV の入力サービスを使用すると、ユーザーは time-shifting API を介してチャンネルの再生を一時停止および再開できます。 +Android N では、録画したセッションを複数保存できるようにして、タイムシフティング機能を拡張しています。 +
+ +ユーザーはあらかじめ録画をスケジュールできます。また、プログラムを視聴しながら録画を開始することもできます。 +システムが録画を保存すると、システムの TV アプリで録画を視聴、管理、再生できます。 +
+ +TV 入力サービスで録画機能を提供する場合は、アプリが録画をサポートしていることをシステムに示し、プログラムの録画機能を実装し、録画中に発生したエラーを処理および通知し、録画したセッションを管理する必要があります。 + + +
+ +TV 入力サービスで録画をサポートしていることをシステムに示すには、次の手順を実行します。 +
+ +TvInputService.onCreate()
メソッドで、TvInputInfo.Builder
クラスを使用して新しい
+TvInputInfo
オブジェクトを作成します。
+TvInputInfo
オブジェクトを作成するときは、
+setCanRecord(true)
を呼び出してから、build()
を呼び出して、サービスが録画をサポートしていることを示します。
+TvInputService.updateTvInputInfo()
を呼び出してシステムに TvInputInfo
オブジェクトを登録します。TV 入力サービスで録画機能のサポートを登録した後、システムがアプリの録画機能の実装にアクセスする必要があるときに、
+TvInputService.onCreateRecordingSession()
を呼び出します。
+
+独自の
+TvInputService.RecordingSession
サブクラスを実装し、onCreateRecordingSession()
コールバックが発生したときに返します。
+
+このサブクラスは、正しいチャンネル データへの切り替え、要求されたデータの録画、録画のステータスおよびエラーのシステムへの通知を処理します。
+
+
システムが RecordingSession.onTune()
を呼び出すと、チャンネル URI を渡して、URI で指定されたチャンネルに合わせます。
+notifyTuned()
を呼び出して、アプリが目的のチャンネルに合わせたことをシステムに通知します。または、アプリが適切なチャンネルに合わせることができなかった場合は、
+notifyError()
を呼び出します。
+
+
次に、システムは RecordingSession.onStartRecording()
コールバックを呼び出します。
+アプリは直ちに録画を開始する必要があります。システムはこのコールバックを呼び出すときに、これから録画するプログラムに関する情報を含む URI を提供します。
+
+録画が完了したら、このデータを RecordedPrograms
データ テーブルにコピーする必要があります。
+
最後に、システムが RecordingSession.onStopRecording()
を呼び出します。この時点で、アプリは録画を直ちに停止する必要があります。
+また、RecordedPrograms
テーブルのエントリも作成する必要があります。
+このエントリは、
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
列に録画したセッション データの URI を設定し、システムが最初に
+onStartRecording()
を呼び出したときに提供したプログラム情報がすべて含まれている必要があります。
+
+
RecordedPrograms
テーブルへのアクセス方法の詳細については、録画したセッションを管理するをご覧ください。
+
録画中にエラーが発生し、録画したデータのレンダリングができない場合は、RecordingSession.notifyError()
を呼び出してシステムに通知します。同様に、録画セッションの作成後に notifyError()
を呼び出して、アプリがセッションを録画できないことをシステムに通知することもできます。
+
+
+
録画中にエラーが発生したにもかかわらず、一部の録画を再生できるようにしてユーザーに提供したい場合は、
+RecordingSession.notifyRecordingStopped()
を呼び出すと、システムで部分的なセッションを使用できるようになります。
+
+
システムは、すべての録画可能チャンネル アプリで録画したすべてのセッションの情報を、TvContract.RecordedPrograms
+コンテンツ プロバイダ テーブルに保持します。
+この情報は、
+RecordedPrograms.Uri
コンテンツ URI を使用してアクセスできます。コンテンツ プロバイダ API を使用して、このテーブルのエントリの読み取り、追加、削除が可能です。
+
コンテンツ プロバイダのデータの操作方法については、コンテンツ プロバイダの基本をご覧ください。 + +
+ +TV 端末のストレージには上限があるため、録画したセッションを保存するためにストレージを割り当てるときは、十分に検討してください。
+録画したセッションを保存する容量が不足している場合は、
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
を使用します。
+
ユーザーが録画を開始すると、できるだけ速やかにデータの録画を開始する必要があります。
+録画を円滑に開始するには、システムが
+onCreateRecordingSession()
コールバックを呼び出したときにストレージ容量のアクセスや割り当てなど、時間のかかるタスクをあからじめ完了しておきます。
+そうすれば、onStartRecording()
コールバックが発生したときに直ちに録画を開始できます。
+
+
Android N 向けのアプリを開発する際は、Java 8 の機能をご利用いただけます。このページでは Android N Preview でサポートしている Java 8 の新機能や、それらを利用するためのプロジェクトの正しい設定方法、想定される既知の問題についてご紹介します。 + + + + +
+ +これらの機能を使うには、Android Studio 2.1(プレビュー版)と Android N Preview SDK をダウンロードしてセットアップし、Jack ツールチェーンと最新の Gradle 用の Android Plugin を準備する必要があります。Android N Preview SDK をお持ちでない方は、Android N 向けの開発準備の説明をご覧ください。 + + +
+ + + ++ 注: Android N プラットフォーム向けのアプリを開発する際は、必ずしも Java 8 の新機能を使う必要はありません。Java 8 の機能を使用せずにコーディングしたい場合は、プロジェクトのソースコードを保持して、ターゲットの互換性の指定を Java 7 にしておくこともできます。ただし、Android N プラットフォームでビルドする時は、必ず JDK 8 を使用してコンパイルしてください。 + + + + +
+ ++ Android ではまだ Java 8 の全機能はサポートしておりません。現時点で Android N のプレビュー版向けにアプリを開発する際にご利用いただける機能は、以下のとおりです。 + + +
+ ++ さらに以下の Java 8 機能の API もご利用いただけます。 +
+ ++ 注: Android N の実装は匿名クラスのラムダ式に基づいているため下方互換性があり、前の Andoird バージョンで実行することができます。前のバージョンでラムダ式をテストする際は、必ず {@code + build.gradle} ファイルの {@code compileSdkVersion} と {@code + targetSdkVersion} の値を 23 以下に設定してください。 + + + +
+ ++ Java 8 の新機能を使うには、新しい Jack ツールチェーンも必要です。この新しい Android ツールチェーンは、Java のソースコードを Android で判別可能な dex バイトコードにコンパイルします。さらにこのツールには独自の {@code .jack} ライブラリ フォーマットがあり、再パッケージ化、縮小、難読化、Multidex など、ほとんどのツールチェーン機能に対応しています。 + + + + + +
+ +以下は、Android の DEX ファイルのビルドに使用する 2 つのツールチェーンの比較です。
++ プロジェクトで Java 8 の機能と Jack を使うには、モジュール固有の {@code build.gradle} ファイルに以下の内容を記載します。 + +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Android Studio 2.0(ベータ版)で導入された Instant Run は、現段階では Jack と併用できません。そのため新しいツールチェーンの使用中は、Instant Run が無効になります。 + +
+ +Jack はアプリのコンパイル中に中間クラスファイルを生成しないため、中間ファイルに依存する以下のようなツールは現在 Jack と併用できません。 + +
+ +その他の不具合がありましたら、バグの報告をお願いします。
\ No newline at end of file diff --git a/docs/html-intl/intl/ja/preview/overview.jd b/docs/html-intl/intl/ja/preview/overview.jd new file mode 100644 index 000000000000..29340f88296f --- /dev/null +++ b/docs/html-intl/intl/ja/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=プログラムの概要 +page.metaDescription= 次期 Android バージョン用のアプリを準備しましょう。 +page.image=images/cards/card-n-overview_2x.png +meta.tags="プレビュー", "デベロッパー", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ Android N Developer Preview には、Android の次期バージョンに備えてアプリをテストし、最適化するための機能がすべて備わっています。N Developer Preview 用のツールをダウンロードするだけで、今すぐ無料でご利用いただけます。 + + + +
+ + + + + + + ++ さまざまなデバイスやエミュレータでアプリを動かしてテストできます。 + +
++ プレビュー期間は毎月アップデートされるので、最新のプラットフォームで変更された箇所のテストを実施できます。 +
++ 最初の数週間でデベロッパーから報告された問題に優先的に対応するので、テストの実施とフィードバックはお早めにお願いします。 + +
++ 新しいプラットフォーム動作への対応や、新機能を利用した開発を早い段階で開始できます。 +
++ Android ベータ版プログラムによる無線でのシームレスなアップデートに対応しているため、イメージを書き込む必要がありません。 + +
++ Issue Tracker で問題を報告し、フィードバックを送ってください。N デベロッパー コミュニティでは、他のデベロッパーと情報交換をすることができます。 + + + +
++ N Developer Preview の対象期間は、2016 年 3 月 9 日から AOSP と OEM 向けの Android N の正式リリース(2016 年 の第 3 四半期を予定)までの間です。 + +
+ ++ 主要な開発マイルストーンでアップデートをリリースしますので、開発やテスト用の環境としてご利用ください。リリース間隔は基本的には各月(4 週から 6 週に 1 回)の予定です。マイルストーンについては、以下をご覧ください。 + + +
+ ++ 各アップデートには、SDK ツールとプレビュー版のシステム イメージ、エミュレータ、参考資料、API の差分情報が含まれます。 + +
+ ++ 最初の 3 つのプレビュー マイルストーンでは、初期段階のテストや開発用の環境を提供します。それを利用して既存のアプリにおける互換性の問題を特定し、新規プラットフォームへの移行や主な作業計画を立ててください。この期間は各種機能や API、ファイル互換性の問題など、あらゆるフィードバックを受け付けている貴重な期間です。ぜひ Issue Tracker を使用して、皆様のご意見をお聞かせください。いただいたフィードバックをもとに、一部の API を改善してアップデートで提供する予定です。 + + + + + + +
+ ++ Preview 4 と 5 には、開発に使用する Android N の最終版の API と SDK、システム動作や機能のテストに使用する最終版とほぼ同じシステム イメージが含まれます。この時点で Android N の標準 API レベルが確定しますので、以後は既存アプリの最終的な互換性テストを開始し、Android N の API や機能を使った新しいコードを改善できるようになります。 + + + + +
+ ++ さらに Preview 4 以降では、正式な API レベルの Android N を搭載しているデバイスにアプリを公開できるようになります(Android ベータ版プログラムにオプトインしたユーザーのデバイスなどが対象)。なお、アプリは Google Play のアルファ版やベータ版のチャネルで先に配信できるので、ストア全体に公開する前に、Android ベータ版のユーザーに事前にアプリをテストしてもらうことが可能です。 + + + + + +
+ ++ Android N でテストや開発を行う場合、プレビューのアップデートがリリースされるたびに開発環境を最新の状態に更新することを強くお勧めします。その際はテスト用のデバイスを Android ベータ版プログラムに登録して、マイルストーンごとに無線(OTA)でアップデートを取得するようにしておくと便利です。もしくはプレビュー イメージを手動でダウンロードして書き込むこともできます。 + + + + + +
+ ++ プレビュー アップデートをご利用いただけるようになった際は Android デベロッパー ブログ、本サイト、Android N デベロッパー コミュニティでお知らせします。 + + +
+ + ++ N Developer Preview は、既存のアプリをさまざまな画面サイズ、ネットワーク テクノロジー、CPU や GPU チップセット、ハードウェア アーキテクチャでテストするために必要なものをすべて備えています。 + + +
+ +各コンポーネントは Android Studio の SDK Manager を使ってダウンロードできます。
+ ++ 上記のツールは、必要に応じて各マイルストーンでアップデートします。 +
+ ++ N Developer Preview に含まれる Nexus などのハードウェアのシステム イメージを使用すると、実機でテストや開発ができます。ハードウェア イメージの一覧は、デバイス イメージのページでご確認ください。 + + +
+ ++ これらのデバイス用のシステム イメージは、各マイルストーンでアップデートします。アップデートされたシステム イメージは、何度でもダウンロードしてテスト用のデバイスに手動で書き込むことができます。自動化されたテスト環境では、繰り返しデバイスに再書き込みをする必要があるので、この方法は特に便利です。 + + + + +
+ +注: 昨年のプレビュー版とは違い、手動で書き込みをしたデバイスは OTA アップデートを取得できなくなります。そのため、今年はデバイスを Android ベータ版プログラムに登録して、OTA を取得するようにしてください。 詳細は次のセクションに記載しています。 + + + +
+ ++ Android N は、新たに無線(OTA)アップデート プログラムに対応しています。このプログラムに登録しているデバイスには、Android N の最新プレビュー版へのアップデートが直接自動配信されます。登録は無料で、Google アカウントに登録済みの対象機種を所有していれば誰でもご利用いただけます。 + + + +
+ ++ このプログラムに登録するには、まず Android ベータ版プログラムのサイトに移動します。このページには、Android ベータ版プログラムに登録可能なアカウントに登録済みデバイスの一覧が表示されます。 + + + +
+ ++ 登録が完了すると、すぐにデバイスにアップデートが配信されます。ほとんどの場合、Android N に移行する際にデータのオールリセットは不要ですが、デバイスの登録前には大事なデータをバックアップしておくことをお勧めします。 + + + +
+ ++ デバイスにアップデートが配信されたら、できるだけ早めにダウンロードしてインストールするようにしてください。そうすることで常に最新のシステム UI や 動作、API、さまざまな機能の変更点を把握できます。 + + +
+ ++ Developer Preview の終了時には、登録デバイスに Android N の正式リリース版へのアップデートが配信されます。 + +
+ ++ デバイスはいつでも Android ベータ版プログラムへの登録を解除できます。登録を解除する前には、デバイス上のデータを必ずバックアップしておいてください。 + + +
+ +注: 登録を解除すると、デバイスはファクトリー リセットされ、Android 6.0 Marshmallow の最新バージョンになります(デバイスを登録する前のバージョンに戻るとは限りません)。確実にクリーン インストールを行うため、連絡先やメッセージ、写真などのデバイス上のデータは削除されます。 + + + + + + +
+ ++ Developer Preview サイトにあるドキュメントで、Android N の詳細をご確認いただけます。 + +
+ ++ 初期のプレビュー アップデートでは、Android N プラットフォーム用の API リファレンスの最新版を個別の zip ファイルとしてダウンロードできます。このリファレンスには差分レポートも含まれているので、API 23 や以前のアップデートからの API の変更点をご確認いただけます。 + + + + +
+ ++ Android N の API が最終決定して正式な API レベルが割り当てられた時点で、API リファレンスを https://developer.android.com で公開します。 + +
+ ++ N Developer Preview のテスト中や開発中は、以下の方法で不具合の報告やフィードバックの送信を行ってください。 + +
+ +
+ N Developer Preview では開発専用のシステムと、標準 API レベルを持たない Android ライブラリを提供します。アプリのテストで互換動作を除外する場合(強く推奨します)、アプリの targetSdkVersion
を “N”
に設定することで Android N の プレビュー版を対象にすることができます。
+
+
+
+
+
+
+ Android N Developer Preview では、プレビュー API を提供しています。この API は、2016 年の第 3 四半期に予定している最終版 SDK のリリースまで正式版ではありません。そのため、プログラム開始後の数週間は特に軽微な API 変更が発生することが予想されます。変更点の概要については、Android N Developer Preview がアップデートされるたびにお知らせします。 + + + + + +
+ ++ 注: プレビュー API は変更される可能性がありますが、システムの基幹にかかわる機能には変更はありませんので、すぐにテストしていただけます。 + + +
+ ++ Google Play では N Developer Preview を対象としたアプリの配信を禁止しています。Android N の最終版 SDK がリリースされてからは、正式な Android N の API レベルを対象にして、アルファ版またはベータ版のリリース チャンネルでアプリを Google Play に公開できます。それまでは、Android N を対象とするアプリをテスターに配信する場合は、電子メールで送付するか、自身のサイトから直接ダウンロードしてもらうようにしてください。 + + + + + +
+ ++ AOSP と OEM 向けの Android N のフルリリースは 2016 年度の第 3 四半期を予定しています。その後は、Android N 向けのアプリを Google Play の公式リリース チャンネルで配信いただけます。 + + +
+ + ++ 以下の手順で Android N を使用したアプリのテストを開始できます。 +
+ ++ Android N Developer Preview プログラムへの参加をお待ちしています。 +
diff --git a/docs/html-intl/intl/ja/preview/samples.jd b/docs/html-intl/intl/ja/preview/samples.jd new file mode 100644 index 000000000000..30c391e81ce8 --- /dev/null +++ b/docs/html-intl/intl/ja/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=サンプル +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ 以下は Android N のサンプルコードです。サンプルを Android Studio でダウンロードするには、[File] > [Import Samples] メニュー オプションを選択します。 + + +
+ ++ 注: 以下のダウンロード可能なプロジェクトは、Gradle と Android Studio でご利用いただくために提供しています。 + +
+ + ++ このサンプルでは、自身のアプリでマルチ ウィンドウのユーザー インターフェースを使用する方法をご確認いただけます。 + +
++ GitHub でサンプルを入手 + +
+ + ++ NotificationCompat を用いて通知を送信するシンプルなサービスをご確認いただる既存のサンプルです。ユーザからの未読メッセージは、それぞれ別の通知として送信されます。 + + +
++ このサンプルは、Android N 向けの新たな通知機能を利用できるようにアップデートされています。 + +
++ GitHub でサンプルを入手 + +
+ + ++ 1 つのアプリで表示している通知の件数を NotificationManager で取得する方法をご確認いただける既存のサンプルです。 + + +
++ このサンプルは、Android N 向けの新たな通知機能を利用できるようにアップデートされています。 + +
++ GitHub でサンプルを入手 + +
+ + ++ このサンプルでは、デバイスの暗号化ストレージ内のデータにアクセスしたり、データを保存したりする方法をご確認いただけます。この機能はデバイスが起動している間は常に有効です。 + +
++ GitHub でサンプルを入手 + +
+ + ++ このサンプルでは、より少ないパーミッションで、特定のディレクトリに対するデータの読み出しや書き込みを行う方法をご確認いただけます。 + +
++ GitHub でサンプルを入手 + +
\ No newline at end of file diff --git a/docs/html-intl/intl/ja/preview/setup-sdk.jd b/docs/html-intl/intl/ja/preview/setup-sdk.jd new file mode 100644 index 000000000000..8f3cd062b771 --- /dev/null +++ b/docs/html-intl/intl/ja/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=プレビューのセットアップ +meta.keywords="プレビュー"、"android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +このページで説明しているように、Android N Preview 向けのアプリを開発するには、デベロッパー環境をアップデートする必要があります。 +
+ +Android N システム イメージでアプリの互換性を簡単にテストするには、Android N デバイスでのテストに関するガイドに従ってください。 +
+ + + + +Android N プラットフォームには、Jack と呼ばれる新しいコンパイラーが必要な Java 8 機能のサポートが追加されています。現在、最新バージョンの Jack は、Android Studio 2.1 のみでサポートされています。したがって、Java 8 機能を使用する場合は、Android Studio 2.1 を使用してアプリをビルドする必要があります。Java 8 機能を使用しない場合は Jack コンパイラーを使用する必要はありません。ただし、以下に説明するように、Android N プラットフォームを対象にコンパイルを行うには、JDK 8 にアップデートする必要があります。 + + + + + + +
+ + + +現在、Android Studio 2.1 は、先行リリース チャンネルでプレビューとして入手できます。Android Studio を既に入手していて、先行チャンネル版にアップデートしない場合は、Android Studio 2.1 を個別のインストールとしてダウンロードして、Android N での開発に使用することにより、Android Studio のプライマリ環境に影響を及ぼさないようにすることができます。 + + + + +
+ +Android Studio 2.1 を個別のインストールとしてダウンロードするには、次のステップを実行します(既存のインストールを Android Studio 2.1 にアップデートする場合は、ステップ 4 に進んでください)。 + +
+ +次のステップのために、この設定ウィンドウを開いたままにします。
+ + +Android N API を使用して開発を開始するには、次のステップに従って、Android Studio に Android N Preview SDK をインストールする必要があります。 +
+ ++ Android N API に関する詳細は、N Preview のリファレンス ドキュメントに記載されています。このドキュメントは、次の表からダウンロードできます。このパッケージには、簡略化されたオフライン バージョンの Android デベロッパー ウェブサイト、Android N API のアップデートされた API リファレンス、API の比較レポートが含まれています。 + + + + +
+ +ドキュメント | +チェックサム | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
기기 | +다운로드/체크섬 | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ 기기에서 Preview를 제거하려면 +다음 중 한 가지 방법을 사용할 수 있습니다.
++ 기기는해당 기기에 제공되는 가장 최신 Android 프로덕션 버전으로 +OTA 업데이트를 받게 됩니다(예: Android 6.0 Marshmallow). +업데이트 시 기기가 완전히 초기화되므로 기기의 사용자 데이터는 삭제됩니다 + 기기 등록을 해제하기 +전에 중요한 데이터는 백업하세요. +
+참고: +프로그램이 끝나기 전에 Developer Preview 시스템 이미지를 삭제하려면 +기기를 완전히 초기화하고 기기에서 모든 사용자 데이터를 +삭제해야 합니다. +
+ + +Android 에뮬레이터를 사용하여 Android N Preview를 실행하려면 +Android N Preview SDK를 다운로드하고 에뮬레이터용 가상 기기를 +생성해야 합니다.
+ +먼저 다음과 같이 Android N Preview SDK를 다운로드합니다( +Android N용 개발 설정 + 시 이미 다운로드했다면 이 부분은 건너뛸 수 있습니다). + +
이제 Android SDK Built-Tools 24.0 0 rc1, +Platform-Tools 24.0.0 rc1 및 SDK Tools +25.0.9를 다운로드했습니다. SDK 도구를 25.0.9로 업데이트하지 않으면 +Android N에서 x86_64 시스템 이미지를 실행할 수 없습니다.
+ + +Android N 시스템 이미지로 가상 기기 생성:
+ +이제 Android N Preview AVD로 Android 에뮬레이터를 시작할 수 있습니다.
+ ++Android 에뮬레이터에서 최상의 경험을 얻으려면 +Android Studio 2.1 Preview를 설치하세요. Android Studio 1.5의 에뮬레이터에 비해 더욱 빠른 성능을 제공하는 Android Emulator 2.0 Beta가 +지원됩니다. +
+ +참고: +현재 Android Studio 2.0 Beta를 사용하는 경우 +N Preview 시스템 이미지로 AVD를 생성할 수 없는 문제가 보고되었습니다. +따라서 지금은 Android Studio 2.1 Preview를 사용하여 AVD를 생성해야 합니다. +
+ +가상 기기 생성에 대한 자세한 내용은 가상 기기 관리를 참조하세요. +
+ + + + + + + + + + + + + + ++ 백그라운드 프로세스는 메모리와 배터리를 많이 소모할 수 있습니다. 예를 들어, 암시적 브로드캐스트는 +이 브로드캐스트를 수신하도록 등록된 많은 백그라운드 프로세스를 시작할 수 있지만 +해당 프로세스가 많은 작업을 수행하지 못할 경우가 있습니다. 이로 인해 기기 성능과 +사용자 경험에 상당한 영향을 미칠 수 있습니다. +
+ ++ 이 문제를 완화하기 위해, N Developer Preview +는 다음과 같은 제한을 적용합니다. +
+ ++ Android 프레임워크는 이러한 암시적 브로드캐스트의 +필요성을 줄이기 위한 여러 가지 해결책을 제공합니다. 예를 들어, {@link android.app.job.JobScheduler} +및 + {@code GcmNetworkManager}는 지정된 +조건(예: 비 데이터 통신 네트워크에 연결)이 충족될 경우 네트워크 작업을 +예약할 수 있는 강력한 메커니즘을 제공합니다. 이제 {@link android.app.job.JobScheduler}를 +사용하여 콘텐츠 제공자의 변경에 대응할 수도 있습니다. {@link android.app.job.JobInfo} +객체는 {@link android.app.job.JobScheduler}가 +작업 예약에 사용하는 매개변수를 캡슐화합니다. 작업 조건이 충족되면 시스템은 +이 작업을 앱의 {@link android.app.job.JobService}에서 실행합니다. +
+ ++ 이 문서에서는 대체 메서드(예: {@link android.app.job.JobScheduler})를 +사용하여 이러한 새로운 제한에 맞게 앱을 적용하는 방법에 대해 +배워보겠습니다. +
+ ++ 브로드캐스트를 수신하도록 매니페스트에 등록되어 +있더라도, N Developer Preview를 대상으로 하는 앱은 {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} 브로드캐스트를 수신하지 않으며, 이 브로드캐스트에 종속되는 프로세스는 +시작되지 않습니다. 이 경우 네트워크 변경을 수신하려는 앱이나, +기기가 비 데이터 통신 네트워크에 연결될 때 대량 네트워크 액티비티를 +수행하려는 앱에서 문제가 발생할 수 있습니다. 이 제한을 해결하기 위한 여러 가지 +해결책이 Android 프레임워크에 이미 있지만, 올바른 해결책을 선택하는 것은 +앱의 용도에 따라 다릅니다. +
+ ++ 참고: {@link android.content.Context#registerReceiver Context.registerReceiver()}로 +등록된 {@link android.content.BroadcastReceiver}는 앱이 +포그라운드에 있는 동안 계속해서 이 브로드캐스트를 수신합니다. +
+ ++ {@link android.app.job.JobInfo.Builder JobInfo.Builder} 클래스를 +사용하여 {@link android.app.job.JobInfo} 객체를 빌드하는 경우, {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} 메서드를 적용하고 {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED}를 작업 매개변수로 전달합니다. 다음의 코드 샘플에서는 기기가 비 데이터 통신 +네트워크에 연결되어 충전 중일 때 실행할 서비스를 +예약합니다. +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ 작업의 조건이 충족되면, 앱은 +{@link android.app.job.JobService#onStartJob onStartJob()} 메서드를 지정된 {@code JobService.class}에서 실행하기 위한 콜백을 +수신합니다. {@link + android.app.job.JobScheduler} 구현의 더 많은 예를 보려면, JobScheduler 샘플 앱을 참조하세요. +
+ ++ GMSCore 서비스를 사용하고 Android 5.0(API 레벨 21) 이하를 대상으로 하는 앱은 +{@code GcmNetworkManager}를 사용하고 {@code Task.NETWORK_STATE_UNMETERED}를 +지정할 수 있습니다. +
+ ++ 포그라운드에서 실행되는 앱은 여전히 등록된 {@link + android.content.BroadcastReceiver}로 {@code + CONNECTIVITY_CHANGE}를 수신할 수 있습니다. 그러나, {@link + android.net.ConnectivityManager} API는 지정된 네트워크 조건이 충족될 경우에만 콜백을 요청하는 +더욱 강력한 메서드를 제공합니다. +
+ ++ {@link android.net.NetworkRequest} 객체는 {@link android.net.NetworkCapabilities}의 +관점에서 네트워크 콜백의 매개변수를 정의합니다. {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder} 클래스로 {@link android.net.NetworkRequest} 객체를 +생성합니다. 이어서 {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} +이 {@link android.net.NetworkRequest} 객체를 시스템에 전달합니다. 네트워크 조건이 충족되면, 앱은 {@link + android.net.ConnectivityManager.NetworkCallback} 클래스에 정의된 {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} 메서드를 +실행하기 위한 콜백을 +수신합니다. +
+ ++ 앱이 종료되거나 앱이 {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()}을 호출할 때까지 계속해서 +콜백을 수신합니다. +
+ ++ N Developer Preview에서 앱은 {@link + android.hardware.Camera#ACTION_NEW_PICTURE} 또는 {@link + android.hardware.Camera#ACTION_NEW_VIDEO} 브로드캐스트를 송수신할 수 없습니다. 이 제한은 새로운 이미지나 +동영상을 처리하기 위해 여러 앱을 깨워야 하는 경우, 성능 및 사용자 경험에 +미치는 영향을 줄여줍니다. N Developer Preview는 +{@link android.app.job.JobInfo} 및 {@link + android.app.job.JobParameters}를 확장하여 대체 해결책을 제공합니다. +
+ ++ 콘텐츠 URI 변경에 대한 작업을 트리거하기 위해, N Developer Preview +는 다음과 같은 메서드로 {@link android.app.job.JobInfo} API를 확장합니다. +
+ ++ 참고: {@code TriggerContentUri()}는 {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} 또는 {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()}와 +조합으로 사용될 수 없습니다. 콘텐츠 변경을 계속해서 모니터링하려면, 앱의 {@link + android.app.job.JobService}가 가장 최근 콜백의 처리를 완료하기 전에 새로운 +{@link android.app.job.JobInfo}를 예약하세요. +
+ ++ 다음 샘플 코드에서는 콘텐츠 URI, {@code MEDIA_URI}의 +변경을 시스템이 보고할 때 트리거할 작업을 예약합니다. +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ 지정된 콘텐츠 URI에서의 변경을 시스템이 보고할 때, +앱이 콜백을 수신하고 {@link android.app.job.JobParameters} 객체가 +{@code MediaContentJob.class}의 {@link android.app.job.JobService#onStartJob onStartJob()}메서드에 +전달됩니다. +
+ ++ N Developer Preview에서는 또한 어떤 콘텐츠 기관과 +URI가 작업을 트리거했는지에 대한 유용한 정보를 앱이 +수신할 수 있도록 {@link android.app.job.JobParameters}를 확장합니다. +
+ ++ 다음 샘플 코드에서는 {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} 메서드를 재정의하고 +, 작업을 트리거한 콘텐츠 기관과 URI를 기록합니다. +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ 저용량 메모리 기기나 저용량 메모리 조건에서 +앱이 실행되도록 최적화하면 성능과 사용자 경험을 개선할 수 있습니다. 백그라운드 서비스에 대한 종속성과 정적으로 등록된 +암시적 브로드캐스트 수신기에 대한 종속성을 제거하면 기기에서 앱을 +더욱 빨리 실행할 수 있습니다. N Developer Preview는 이러한 문제 중 일부를 줄이기 위한 +조치를 취하고 있지만, 백그라운드 +프로세스를 전혀 사용하지 않고 앱이 실행되도록 +최적화하는 것이 좋습니다. +
+ ++ N Developer Preview에서는 백그라운드 프로세스를 +비활성화하고 앱 동작을 테스트하는 데 사용할 수 있는 몇 가지 추가적인 ADB(Android Debug Bridge) 명령을 소개합니다. +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N은 기기에 전원이 들어와 있지만사용자가 잠금을 해제하지 않았을 때안전한 +직접 부팅 + 모드에서 실행됩니다. 이를 지원하기 위해 시스템에서 두 가지 데이터 저장소 위치를 제공합니다.
+ +기본적으로 직접 부팅 모드 시 앱이 실행되지 않습니다. +직접 부팅 모드에서 조치가 필요한 경우, +이 모드에서 실행되어야 하는 앱 구성 요소를 등록할 수 있습니다. 직접 부팅 모드 시 실행되어야 하는 앱의 +몇 가지 공통 사용 사례:
+ +앱이 직접 부팅 모드에서 실행되는 동안 데이터에 액세스해야 하는 경우 +기기 암호화 저장소를 사용합니다. 기기 암호화 저장소에는 +기기가 성공적으로 확인된 부팅을 수행한 후에만 +사용할 수 있는 키로 암호화된 데이터가 포함됩니다.
+ +PIN이나 암호와 같이 사용자 자격증명과 연관된 키로 암호화해야 하는 데이터는 +자격증명 암호화 저장소를 사용합니다. +자격증명 암호화 저장소는 사용자가 기기의 잠금을 해제한 뒤부터 +기기를 다시 시작할 때까지 사용할 수 있습니다. 사용자가 +기기의 잠금을 해제한 뒤 잠금 화면을 활성화해도 +자격증명 암호화 저장소가 잠기지 않습니다.
+ +앱은 직접 부팅 모드에서 실행되거나
+기기 암호화 저장소에 액세스하기 전까지
+시스템에 구성 요소를 등록해야 합니다. 앱은 구성 요소를
+암호화 인식으로 표시하여 시스템에 등록합니다. 구성 요소를 암호화 인식으로 표시하려면 매니페스트에서
+android:encryptionAware
특성을 true로 설정합니다.
+ +
암호화 인식 구성 요소로 등록하면 기기가 다시 시작되었을 때 시스템에서
+LOCKED_BOOT_COMPLETED
브로드캐스트 메시지를
+수신할 수 있습니다. 이 시점에서 기기 암호화 저장소를
+사용할 수 있고, 여러분의 구성 요소는
+예약된 알람 트리거 등과 같이 직접 부팅 모드에서 실행해야 하는 작업을 실행할 수 있습니다.
다음 코드 조각은
+{@link android.content.BroadcastReceiver}를 암호화 인식으로 등록하고 앱 매니페스트에
+LOCKED_BOOT_COMPLETED
의 인텐트 필터를 추가하는 예시입니다.
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
사용자가 기기의 잠금을 해제하면 모든 구성 요소가 +기기 암호화 저장소와 자격증명 암호화 저장소에 액세스할 수 있습니다.
+ +기기 암호화 저장소에 액세스하려면
+Context.createDeviceEncryptedStorageContext()
를 호출하여 두 번째
+{@link android.content.Context} 인스턴스를 생성합니다. 이 컨텍스트를 사용하여 호출한 모든 저장소 API는
+기기 암호화 저장소에 액세스합니다. 다음은
+기기 암호화 저장소에 액세스하고 기존
+앱 데이터 파일을 여는 예시입니다.
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
직접 부팅 모드에서 액세스해야 하는 정보에만 +기기 암호화 저장소를 사용합니다. +기기 암호화 저장소를 범용 암호화 저장소로 사용하지 마십시오. +개인적인 사용자 정보 또는 직접 부팅 모드에서 필요하지 않은 암호화 데이터는 +자격증명 암호화 저장소를 사용합니다.
+ +사용자가 재시작 후 기기의 잠금을 해제하면 +앱이 자격증명 암호화 저장소 액세스로 전환하고, +사용자 자격증명을 따르는 일반 시스템 서비스를 사용할 수 있습니다.
+ +사용자가 재부팅 후 기기의 잠금을 해제할 때 알림을 받으려면
+실행 중인 구성 요소에서 {@link android.content.BroadcastReceiver}를 등록하고
+ACTION_USER_UNLOCKED
메시지를 수신합니다. 또는,
+기존 {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} 메시지를 수신할 수 있습니다. 이 메시지는 기기가 부팅되었으며 사용자가 기기의 잠금을
+해제했음을 나타냅니다.
사용자가
+UserManager.isUserUnlocked()
를 호출하여 기기 잠금을 해제했는지 직접 쿼리할 수 있습니다.
사용자가 기기를 직접 부팅 모드를 사용하도록 업데이트하면
+기존 데이터를 기기 암호화 저장소로 마이그레이션해야 할 수도 있습니다.
+Context.migrateSharedPreferencesFrom()
와
+Context.migrateDatabaseFrom()
를 사용하여 자격증명 암호화 저장소와 기기 암호화 저장소 간에
+기본 설정과 데이터베이스 데이터를 마이그레이션합니다.
자격증명 +암호화 저장소에서 기기 암호화 저장소로 마이그레이션할 데이터는 신중히 결정하세요. 암호나 인증 토큰 등의 +개인 사용자 정보는 기기 암호화 저장소로 +마이그레이션해서는 안됩니다. 일부 시나리오에서 +두 가지 암호화 저장소에 있는 별도의 데이터 세트를 관리해야 할 수 있습니다.
+ +새로운 직접 부팅 모드로 암호화 인식 앱을 테스트하세요. 직접 부팅을 +활성화하는 방법은 두 가지가 있습니다.
+ +주의: 직접 부팅을 활성화하면 +기기에서 모든 사용자 데이터가 삭제됩니다.
+ +Android N이 설치된 지원 기기에서 +직접 부팅을 활성화하는 방법:
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
테스트 기기에서 모드를 전환해야 할 경우 +에뮬레이션된 직접 부팅 모드도 사용할 수 있습니다. 에뮬레이션된 모드는 개발 시에만 사용해야 하며 +데이터가 손실될 수 있습니다. 에뮬레이션된 직접 부팅 모드를 활성화하려면 +기기에서 잠금 패턴을 설정합니다. 잠금 패턴을 설정할 때 안전 모드 화면으로 시작할지 묻는 메시지가 나오면 "No thanks"를 +선택한 뒤 다음 +adb shell 명령을 사용합니다.
+ ++$ adb shell sm set-emulate-fbe true ++ +
에뮬레이션된 직접 부팅 모드를 끄려면 다음 명령을 사용합니다.
+ ++$ adb shell sm set-emulate-fbe false ++ +
이 명령을 사용하면 기기가 재부팅됩니다.
diff --git a/docs/html-intl/intl/ko/preview/features/icu4j-framework.jd b/docs/html-intl/intl/ko/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..77f1feb9bf54 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=ICU4J Android 프레임워크 API + +@jd:body + ++ ICU4J는 오픈 소스이며 널리 사용되는 Java 라이브러리 세트로, 소프트웨어 애플리케이션에 유니코드와 +세계화 지원을 제공합니다. Android N은 +Android 프레임워크에서 앱 개발자가 +{@code android.icu} 패키지에서 사용할 수 있는 ICU4J API의 하위 세트를 노출합니다. 이 API는 +기기의 현지화 데이터를 사용합니다. 따라서 ICU4J 라이브러리를 APK로 컴파일하지 않고 +프레임워크에서 호출하여APK +풋프린트를 줄일 수 있습니다. (이 경우, Android N 이하 버전의 Android를 +실행하는 사용자가 ICU4J 라이브러리를 포함한 앱 버전을 다운로드할 수 있도록 +여러 버전의 +APK를 제공해야 할 수도 있습니다.) +
+ ++ 이 문서에서는 먼저 이 라이브러리 지원에 필요한 최소 +Android API 레벨과 관련된 몇 가지 기본 정보를 제공합니다. 그 후, +각 Android에서 ICU4J를 구현하는 데 무엇이 필요한지 설명합니다. 마지막으로, +Android 프레임워크에서 ICU4J API를 사용하는 방법을 설명합니다. +
+ +
+ Android N은
+com.ibm.icu
가 아니라 android.icu
패키지를 통해 ICU4J API의 하위 세트를 노출합니다.
+Android 프레임워크는 여러 가지 이유로
+ICU4J API를 노출하지 않을 수 있습니다. 예컨대 Android N은
+일부 사용 중단된 API나 ICU팀에서 안정적이라고 선언하지 않은 API를
+노출하지 않습니다. ICU팀이 이후 API의 사용을 중단하면, Android도
+이를 사용 중단됨으로 표시하지만 계속 포함합니다.
+
Android API 레벨 | +ICU 버전 | +CLDR 버전 | +
---|---|---|
Android N | +56 | +28 | +
중요한 참고 사항:
+ +
+ 앱에서 이미 ICU4J API를 사용하고 있고
+android.icu
API가 요구사항을 충족한다면
+프레임워크 API로 마이그레이션할 때 Java 가져오기를
+com.ibm.icu
에서 android.icu
로 변경해야 합니다. 그러면 APK에서
+ICU4J 파일 사본을 삭제할 수 있습니다.
+
+ 참고: ICU4J 프레임워크 API는 {@code com.ibm.icu} 대신 {@code android.icu} +네임스페이스를 사용합니다. 이는 자체 {@code com.ibm.icu} 라이브러리가 포함된 APK에서 +네임스페이스 충돌을 피하기 위해서입니다. +
+ +
+ java
와 android
패키지의 일부 클래스는
+ICU4J의 클래스와 같습니다. 그러나 ICU4J는 종종 더욱 폭넓은
+표준과 언어를 지원합니다.
+
시작하기 위한 몇 가지 예시:
+클래스 | +대체 | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J는 ICU 라이선스에 따라 배포됩니다. 자세한 내용은 ICU + 사용자 가이드를 참조하세요. +
diff --git a/docs/html-intl/intl/ko/preview/features/multi-window.jd b/docs/html-intl/intl/ko/preview/features/multi-window.jd new file mode 100644 index 000000000000..78abcd1338b0 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=다중 창 지원 +page.metaDescription=Android N에서 한 번에 둘 이상의 앱을 표시하도록 지원. +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N에서는 동시에 둘 이상의 앱을 표시하도록 +지원합니다. 핸드헬드 기기에서 두 개의 앱을 화면 분할 모드에서 +나란히 또는 상하로 실행할 수 있습니다. TV 기기에서 앱이 +PIP 모드를 사용하는 경우 사용자가 다른 앱과 상호작용하는 +동안에 계속 동영상을 재생할 수 있습니다. +
+ ++ N Preview SDK로 앱을 빌드하는 경우, 앱이 다중 창 +표시를 처리하는 방식을 구성할 수 있습니다. 예를 들어, 액티비티의 +최소 허용 치수를 지정할 수 있습니다. 또한 앱에 +대해 다중 창 표시를 비활성화할 수도 있으며, 이 경우 시스템은 앱을 전체 화면 모드에서만 +표시합니다. +
+ ++ Android N에서는 여러 앱이 동시에 화면을 공유할 수 있습니다. 예를 들어, 사용자가 화면을 분할하여 왼쪽에서는 웹페이지를 +보면서 오른쪽에서는 이메일을 작성할 +수 있습니다. 사용자 경험은 기기에 따라 +달라집니다. +
+ ++ 사용자가 다음과 같이 다중 창 모드로 전환할 수 있습니다. +
+ ++ 사용자는 여러 액티비티가 화면을 공유하는 동안 한 액티비티에서 +또 다른 액티비티로 데이터를 끌어서 놓을 +수 있습니다. (이전에는, 사용자가 단일 액티비티 내에서만 +데이터를 끌어서 놓을 수 있었습니다.) +
+ ++ 다중 창 모드는 액티비티 +수명 주기를 변경하지 않습니다. +
+ ++ 다중 창 모드에서는, 사용자가 가장 최근에 상호작용했던 액티비티만 +지정된 시간에 활성화됩니다. 이 액티비티는 최상위로 간주됩니다. + 다른 모든 액티비티는 표시되어 있더라도 일시 정지된 상태입니다. + 그러나 시스템은 이러한 일시 정지되었지만 표시된 액티비티에게 표시되지 +않은 액티비티보다 더 높은 우선 순위를 부여합니다. 사용자가 일시 정지된 액티비티 중 하나와 상호작용하면, 해당 +액티비티가 재개되고 이전의 최상위 액티비티가 일시 +정지됩니다. +
+ ++ 참고: 다중 창 모드에서는 앱이 일시 정지된 상태에서도 여전히 +사용자에게 표시될 수 있습니다. 앱이 일시 정지된 동안에도 액티비티를 +계속해야 하는 경우도 있습니다. 예를 들어, 일시 정지 모드이지만 표시된 +동영상 재생 앱은 계속해서 동영상을 보여줘야 합니다. 이러한 이유로, 동영상을 +재생하는 액티비티는 {@link android.app.Activity#onPause onPause()} 핸들러에서 +동영상을 일시 정지하지 않는 것이 좋습니다. + 그 대신, {@link android.app.Activity#onStop + onStop()}에서 동영상을 일시 정지하고, {@link android.app.Activity#onStart + onStart()}에서 재생을 재개해야 합니다. +
+ ++ 사용자가 앱을 다중 창 모드에 놓으면, +시스템은 런타임 변경 처리에 지정된 대로, 구성 변경을 액티비티에게 +알려줍니다. 기본적으로, 이 변경의 액티비티-수명 주기 관계는 기기의 모드가 +세로 모드에서 가로 모드로 전환되었음을 +시스템이 앱에 알려줄 때와 동일합니다(단순 스왑 대신 +기기 치수가 변경되는 경우는 제외). 런타임 변경 처리에서 설명한 +대로, 액티비티 스스로 구성 변경을 처리하거나, 시스템이 액티비티를 소멸시키고 +새 치수로 다시 액티비티를 생성하도록 할 수 +있습니다. +
+ +
+ 사용자가 창의 크기를 조정하여 한쪽 치수를 더 크게 만드는
+경우, 시스템은 사용자 작업에 맞게 액티비티의 크기를 조정하고 필요한
+경우 런타임 변경을 수행합니다. 앱이 새로 노출되는 영역에 그릴 때 지연이 발생하는 경우, 시스템은 {@link
+ android.R.attr#windowBackground windowBackground} 특성 또는 기본
+windowBackgroundFallback
스타일 특성에 의해
+지정된 색으로 이 영역을 임시로 채웁니다.
+
+ 앱이 Android N을 대상으로 하는 경우, 앱의 액티비티가 다중 +창 표시를 지원하는지 여부와 지원 방법을 구성할 수 있습니다. 매니페스트에서 특성을 설정하여 크기와 레이아웃을 제어할 +수 있습니다. + 루트 액티비티의 특성 설정은 작업 스택 내의 모든 +액티비티에 적용됩니다. +
+ ++ 참고: Android N보다 더 낮은 버전의 SDK로 다중 방향 앱을 작성하는 경우 +사용자가 앱을 다중 창 모드에서 사용하면, 시스템이 +이 앱의 크기를 강제로 조정합니다. 앱이 예상치 못하게 동작할 수 있음을 사용자에게 경고하는 +대화 상자가 표시됩니다. 시스템은 고정 +방향 앱의 크기는 조정하지 않습니다. 사용자가 +다중 창 모드 하에서 고정 방향 앱을 열려고 시도하면, +앱이 전체 화면을 차지합니다. +
+ +
+ 매니페스트의 <activity>
또는
+<application>
노드에서 이 특성을 설정하여 다중 창
+표시를 활성화하거나 비활성화합니다.
+
+android:resizeableActivity=["true" | "false"] ++ +
+ 이 특성을 true로 설정하면, 액티비티를 분할 화면 모드와 자유형식 +모드로 시작할 수 있습니다. 이 특성을 false로 설정하면, 액티비티가 다중 창 모드를 지원하지 +않습니다. 이 값이 false이고 사용자가 +다중 창 모드에서 액티비티를 시작하려고 시도하면, 액티비티가 전체 화면을 +차지합니다. +
+ ++ 앱이 Android N을 대상으로 하지만 이 특성에 값을 지정하지 +않은 경우, 이 특성의 기본값은 true가 됩니다. +
+ +
+ 이 특성을 매니페스트의 <activity>
노드에 설정하여
+액티비티가 PIP 표시를 지원하는지 여부를 나타냅니다. android:resizeableActivity
가 false인 경우 이 특성이
+무시됩니다.
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ Android N에서 <layout>
매니페스트 요소는
+다중 창 모드에서 액티비티가 동작하는 방식에 영향을 미치는
+여러 특성을 지원합니다.
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + 예를 들어, 다음 코드는 액티비티가 자유형식 모드로 표시될 +때 이 액티비티의 기본 크기와 위치 및 최소 크기를 +지정하는 방법을 보여줍니다. +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N에서는 다중 창 모드에서 실행 가능한 앱을 지원하는 새로운 +기능을 제공합니다. +
+ ++ 기기가 다중 창 모드에 있는 경우 일부 기능이 비활성화되거나 +무시되는데, 그 이유는 이들 기능은 기기 화면을 다른 액티비티 +또는 앱과 공유하는 액티비티에는 적합하지 않기 때문입니다. 이러한 기능에는 다음이 포함됩니다. + +
android:screenOrientation
특성의 변경을 무시합니다.
+ + 다중 창 표시를 지원하기 위해 다음과 같은 새 메서드가 {@link android.app.Activity} +클래스에 추가되었습니다. 각 메서드에 대한 자세한 내용은, +N Preview SDK 참조를 참조하세요. +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ 참고: PIP 모드는 다중 창 모드의 특별한
+케이스입니다. myActivity.inPictureInPicture()
가
+true를 반환하면, myActivity.inMultiWindow()
도 또한
+true를 반환합니다.
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ 또한 이들 각 메서드의 {@link android.app.Fragment} 버전이
+있습니다(예: Fragment.inMultiWindow()
).
+
+ 액티비티를 PIP 모드에 두려면, 새로운 메서드인
+Activity.enterPictureInPicture()
를 호출합니다. 기기가 PIP 모드를 지원하지 않으면 이 메서드는
+영향이 없습니다. 자세한 내용은
+PIP 문서를 참조하세요.
+
+ 새 액티비티를 시작하는 경우, 가능하면 이 새 액티비티가 현재
+액티비티에 인접하여 표시되어야 함을 시스템에게 알려줄 수 있습니다. 이를 위해
+, 플래그
+Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
를 사용합니다. 이 플래그를 전달하면
+다음과 같은 동작이 요청됩니다.
+
+ 기기가 자유형식 모드에 있고 새 액티비티를 시작 중인 경우,
+ActivityOptions.setLaunchBounds()
를 호출하여 이 새 액티비티의 치수와 화면 위치를
+지정할 수 있습니다. 기기가 다중 창 모드에 있지 않으면, 이 메서드가 영향을
+미치지 않습니다.
+
+ 참고: 작업 스택 내에서 액티비티를 시작하는 경우, +이 액티비티는 화면상의 액티비티를 대체하여, 모든 다중 창 속성을 +상속합니다. 새 액티비티를 다중 창 모드에서 별도 창으로 시작하려면, +새 작업 스택에서 액티비티를 시작해야 합니다. +
+ ++ 사용자는 두 +액티비티가 화면을 공유하는 동안 한 액티비티에서 다른 액티비티로 데이터를 끌어서 놓을 +수 있습니다. (이전에는, 사용자가 단일 액티비티 내에서만 데이터를 끌어서 +놓을 수 있었습니다.) 이러한 이유로, 앱이 현재 지원하지 않는 경우에는 끌어서 놓기 +기능을 앱에 추가하는 것이 좋습니다. +
+ +
+ N Preview SDK는 앱 간의 끌어서 놓기를 지원하기 위해 android.view
+패키지를 확장합니다. 다음과 같은 클래스와 메서드에 대한 자세한
+내용은, N Preview
+SDK 참조를 참조하세요.
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
을
+전달합니다. 수신자 액티비티에게 URI 권한을
+부여해야 하는 경우, 새 플래그
+View.DRAG_FLAG_GLOBAL_URI_READ
또는
+View.DRAG_FLAG_GLOBAL_URI_WRITE
를 적절하게 전달합니다.
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + 앱을 Android N용으로 업데이트하든 안하든 간에, +Android N이 실행 중인 기기에서 사용자가 앱을 다중 창 모드로 +시작하려고 시도하는 경우, 앱이 다중 창 모드에서 어떻게 작동하는지 확인해야 합니다. +
+ ++ 기기에 Android N을 설치하면, 화면 분할 모드가 +자동으로 지원됩니다. +
+ ++ 앱을 N Preview SDK로 작성하지 않았는데 사용자가 +앱을 다중 창 모드에서 사용하려고 시도하는 경우, 이 앱이 고정 방향을 선언하지 +않으면 시스템이 앱의 크기를 강제로 조정합니다. +
+ ++ 앱이 고정 방향을 선언하지 않은 경우, Android N이 +실행 중인 기기에서 앱을 시작해야 하며, 앱을 화면 분할 모드에 +두도록 시도해야 합니다. 앱의 크기를 강제로 조정하는 경우 사용자 경험이 +적절한지 확인하세요. +
+ ++ 앱이 고정 방향을 선언하는 경우, 앱을 다중 창 모드에 +두도록 시도해야 합니다. 이 때 앱이 전체 화면 모드에 남아있는지 +확인하세요. +
+ ++ N Preview SDK로 앱을 작성했는데 다중 창 지원을 비활성화하지 +않은 경우, 화면 분할 및 자유형식 모드에서 다음과 +같은 동작을 확인하세요. +
+ ++ 다중 창 모드에서 앱의 성능을 확인하려면, 다음 +작업을 시도해 보세요. 별다른 설명이 없는 한, 화면 분할 및 다중 창 모드 +에서 모두 이들 작업을 시도해야 합니다. +
+ +
+ android:resizableActivity="false"
를 설정하여
+다중 창 지원을 비활성화한 경우, Android N을 실행 중인 기기에서
+앱을 시작해야 하며, 앱을 자유형식 및 화면
+분할 모드로 둬야 합니다. 이 때 앱이 전체 화면 모드에 남아있는지
+확인하세요.
+
Android N은 다국어 사용자를 위한 지원을 개선해서 +설정에서 여러 로케일을 선택할 수 있습니다. Android N은 +지원되는 로케일 수를 대폭 확대하고 +시스템이 리소스를 결정하는 방식을 변경하여 이 기능을 제공합니다. 새로 도입된 리소스 결정 방법은 +더욱 안정적이고 기존 APK와 호환되도록 설계되어 있지만 +예상치 못한 동작이 없는지 신중히 살펴봐야 합니다. 예를 들어, +앱이 예상 언어로 기본 설정되어 있는지 테스트해야 합니다. 또한, +앱이 여러 언어를 지원한다면 +원하는 대로 작동하는지 확인해야 합니다. 마지막으로 +앱이 지원하도록 명시하지 않은 언어를 무리 없이 처리하는지 확인해야 합니다.
+ +이 문서에서는 +Android N 이전의 리소스 결정 전략을 설명한 뒤에, Android N의 개선된 +리소스 결정 전략을 설명합니다. 마지막으로 +더 많은 다국어 사용자를 지원하기 위해 확장된 로케일을 활용하는 방법을 설명합니다.
+ +Android N 이전의 Android는 +앱과 시스템 로케일을 매칭하지 못하는 경우도 있었습니다. 예를 들어, 앱의 기본 언어가 +미국 영어지만 {@code es_ES} + 리소스 파일에 스페인어 문자열도 현지화되어 있습니다.
+Java 코드가 문자열을 참조할 때 다음과 같이 문자열 언어를 +결정합니다.
+시스템이 정확한 일치를 찾지 못하면 +로케일의 국가 코드를 삭제하기 때문에 이러한 결정 문제가 발생합니다. 예:
+ +사용자 설정 | +앱 리소스 | +리소스 결정 | +
---|---|---|
fr_CH | +
+기본값(en) +de_DE +es_ES +fr_FR +it_IT + |
+
+fr_CH 시도 => 실패 +fr 시도 => 실패 +기본값(en) 사용 + |
+
이 예시에서 시스템은 +사용자가 영어를 이해할 수 있는지 여부와 관계없이 영어 문자열을 표시합니다. 현재 이러한 동작이 상당히 +일반적입니다. Android N은 이런 +결과가 나타나는 빈도를 상당히 낮추었습니다.
+ +Android N은 더욱 안정적인 리소스 결정을 사용하고
+자동으로 더욱 알맞은 대안책을 찾습니다. 그러나 결정 속도를 높이고
+관리성을 개선하려면 가장 일반적인 상위 방언에 리소스를 저장해야 합니다.
+ 예를 들어, 전에 {@code es-US} 디렉터리에
+스페인어 리소스를 저장했다면 남미 스페인어가 있는 {@code es-419} 디렉터리로 이동합니다.
+ 마찬가지로 {@code en-GB}란 폴더에 리소스 문자열이 있다면
+폴더 이름을 {@code en-001}(국제 영어)로 변경합니다.
+en-GB
문자열의 가장 일반적인 상위 리소스는 {@code en-001}이기 때문입니다.
+ 다음은 이러한 방법이
+성능과 리소스 결정의 신뢰성을 개선하는 이유를 설명하는 예시입니다.
Android N의 경우, 표 1의 사례는 +다르게 결정됩니다.
+ + +사용자 설정 | +앱 리소스 | +리소스 결정 | +
---|---|---|
|
+
+기본값(en) +de_DE +es_ES +fr_FR +it_IT + |
+
+fr_CH 시도 => 실패 +fr 시도 => 실패 +Fr의 하위 리소스 시도 => fr_FR +fr_FR 사용 + |
+
이제 사용자는 영어 대신 프랑스어 리소스를 보게 됩니다. 이 예시는 +Android N에서 프랑스어 문자열을 {@code fr_FR} +이 아니라 {@code fr}에 저장해야 하는 이유를 알 수 있습니다. 이러한 동작을 통해 가장 가까운 상위 방언과 일치시켜서 +더욱 빠르고 예측 가능하게 결정합니다.
+ +Android는 이러한 결정 논리를 개선했을 뿐만 아니라 +선택 가능한 언어를 더 많이 제공합니다. 위의 예시에 이탈리아어가 추가 사용자 언어로 지정되었지만 +앱에서 프랑스어를 지정하지 않는 경우를 적용해 보겠습니다.
+ + +사용자 설정 | +앱 리소스 | +리소스 결정 | + +
---|---|---|
|
+
+기본값(en) +de_DE +es_ES +it_IT + |
+
+fr_CH 시도 => 실패 +fr 시도 => 실패 +fr의 하위 리소스 시도 => 실패 +it_CH 시도 => 실패 +it 시도 => 실패 +it의 하위 리소스 시도 => it_IT +it_IT 사용 + |
+
+
앱이 프랑스어를 지원하지 않지만 +사용자는 여전히 자신이 이해하는 언어를 볼 수 있습니다.
+ + +Android N에서는 앱이 사용자가 지정한 언어 목록을 직접 쿼리할 수 있는 새로운 API {@code LocaleList.GetDefault()} +가 추가되었습니다. 이 API는 +앱 동작을 더욱 정교하게 해주고 +콘텐츠 표시 최적화를 개선합니다. 예를 들어, 검색 시 +사용자 설정에 따라 여러 언어로 결과를 표시할 수 있습니다. 브라우저 앱은 +사용자가 이미 알고 있는 언어로 +번역 페이지를 제공하지 않고, 키보드 앱은 모든 적절한 레이아웃을 자동 활성화할 수 있습니다.
+ +Android 6.0(API 레벨 23)까지 Android는 많은 공통 언어(en, es, ar, fr, ru)에 대해 +1~2개의 로케일만 +지원했습니다. 각 언어의 변종은 몇 개뿐이기 때문에 +리소스 파일에 하드코딩된 문자열로 몇 개의 숫자와 날짜를 저장하는 것만으로 +충분했습니다. 그러나 Android에서 지원되는 로케일 세트가 확장되면서 +단일 로케일 내에서조차 +날짜, 시간, 통화 및 유사 정보에 +큰 차이가 생길 수 있게 되었습니다. 형식 하드코딩은 +최종 사용자에게 혼란을 줄 수 있습니다. 그러므로 Android N을 개발할 때는 +숫자와 날짜 문자열을 하드코딩하는 대신 포맷터를 사용하도록 하세요.
+ +가장 좋은 예시로는 아랍어가 있습니다. Android N에서 아랍어 지원이 +{@code ar_EG} 1개에서 27개 아랍어 로케일로 확장되었습니다. 이러한 로케일은 대부분의 리소스를 공유할 수 있지만 +어떤 로케일은 ASCII 숫자를 선호하고 어떤 로케일은 네이티브 숫자를 선호합니다. 예를 들어, +"4자리 핀 선택"과 같은 숫자 변수가 포함된 문장을 생성하려면 +아래와 같이 포맷터를 사용합니다.
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/ko/preview/features/notification-updates.jd b/docs/html-intl/intl/ko/preview/features/notification-updates.jd new file mode 100644 index 000000000000..16f4dade34d8 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=알림 +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + + + +
Android N에서는 앱이 가시성과 상호작용이 뛰어난 알림을 +게시할 수 있도록 여러 새로운 API를 소개합니다.
+ +Android N에서는 핸드셋에서 인라인 회신을 지원하기 위해 기존의 {@link android.support.v4.app.RemoteInput} +알림 API를 확장합니다. 이 기능을 사용하면 앱을 방문하지 않고도 알림 창에서 +신속하게 응답할 수 있습니다.
+ ++ Android N에서는 또한 비슷한 알림을 묶어서 단일 알림으로 +표시할 수도 있습니다. 이것이 가능하도록, Android N에서는 기존의 {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} 메서드를 사용합니다. 사용자가 각 알림을 확장할 수 있으며, 각 알림에 대해 회신 및 +닫기와 같은 동작을 알림 창에서 개별적으로 수행할 +수 있습니다. +
+ +마지막으로, Android N에서는 또한 앱의 사용자 지정된 알림 +뷰에서 시스템 장식을 활용할 수 있는 새 API를 추가합니다. 이들 API는 표준 템플릿을 통해 알림 뷰가 +일관된 프레젠테이션을 공유하도록 보장해 +줍니다.
+ +이 문서에서는 새 알림 기능을 앱에서 사용할 때 고려해야 +하는 몇 가지 주요 변경 사항을 중점적으로 다룹니다.
+ +Android N에 있는 직접 회신 기능을 사용하여, 사용자가 문자 +메시지에 신속하게 응답하거나 알림 인터페이스 내에서 직접 +작업 목록을 업데이트할 수 있습니다. 핸드헬드에서 인라인 회신 동작은 알림에 연결된 추가적인 +버튼으로 나타납니다. 사용자가 키보드를 통해 회신하면, +시스템은 여러분이 알림 동작에 지정했던 +인텐트에 텍스트 응답을 첨부하고 이 인텐트를 +핸드헬드 앱으로 보냅니다. + + + +
+ +직접 회신을 지원하는 알림 동작을 만들려면: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
을 사용하여 {@link android.support.v4.app.RemoteInput}
+객체를 동작에 첨부합니다.
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
시스템이 사용자에게 알림 동작이 트리거될 때 응답을 입력하라는 +메시지를 표시합니다.
+ + + + +회신 동작의 인텐트에 선언한 액티비티에 대해 알림 +인터페이스로부터 사용자 입력을 수신하려면:
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
다음 코드 조각에서는 메서드가 번들로부터 입력 텍스트를 +검색하는 방법을 보여줍니다.
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
검색된 텍스트에 어떤 동작을 취할지를 결정하기 위해 +앱이 로직을 적용할 수 있습니다. +채팅과 같은 대화형 앱은 알림 자체에서 더 많은 컨텍스트를 +제공하므로(예: 사용자 자신의 메시지를 포함한 여러 줄의 채팅 기록) +사용자가 적절하게 응답할 수 있습니다. +사용자가 {@link android.support.v4.app.RemoteInput}을 통해 응답하는 경우, {@code setRemoteInputHistory()} +메서드로 텍스트를 회신 기록에 +포함시킵니다.
+ +Android N에서는 일련의 알림을 표시하기 위한 새로운 방식을 +개발자에게 제공합니다. 묶음 알림. 이것은 +Android Wear의 알림 +스택 기능과 유사합니다. 예를 들어, 수신된 메시지에 대해 앱이 알림을 생성하는 경우, +둘 이상의 메시지가 수신되면 그 알림을 하나의 +단일 그룹으로 묶습니다. 기존의 +{@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} 메서드를 사용하여 유사한 알림을 묶을 수 있습니다.
+ ++ 알림 그룹은 이 그룹을 구성하는 알림을 계층 구조로 만듭니다 . + 계층 구조의 맨 위는 그룹의 요약 정보가 표시되는 상위 +알림입니다. 사용자는 알림 그룹을 점진적으로 확장할 수 있으며, 시스템은 +사용자가 더 깊이 파고들수록 더 많은 정보를 +표시합니다. 사용자가 번들을 확장하면 시스템은 모든 하위 알림에 대해 +더 많은 정보를 표시하며, 사용자가 이들 알림 중 하나를 확장하면 +시스템은 알림의 전체 콘텐츠를 표시합니다. +
+ + + + +알림을 그룹에 추가하는 방법을 알아보려면, +각 +알림을 그룹에 추가를 참조하세요.
+ + +이 섹션에서는 이전 버전의 Android 플랫폼에서 +사용되었던 {@link android.app.Notification.InboxStyle InboxStyle} 알림 대신에 +알림 그룹을 사용할 때의 지침을 +제공합니다.
+ +자신의 사용 사례에서 다음의 모든 조건이 충족되는 경우에만 +알림 그룹을 사용해야 합니다.
+ +알림 그룹의 사용 사례에 대한 좋은 예로는, 수신 메시지의 +목록을 표시하는 메시징 앱이나 수신된 이메일의 목록을 표시하는 +이메일 앱이 있습니다.
+ ++단일 알림이 바람직한 사례의 예로는, 한 사람이 보낸 +개별 메시지나 1줄 텍스트 항목의 목록 표시가 +있습니다. 이를 수행하기 위해 +({@link android.app.Notification.InboxStyle InboxStyle} 또는 +{@link android.app.Notification.BigTextStyle BigTextStyle})을 사용할 +수 있습니다. +
+ ++ 그룹에 하나의 하위 항목만 포함되어 있더라도 앱은 +항상 그룹 요약을 게시해야 합니다. 하나의 알림만 포함된 경우에는 시스템이 요약을 +억제하고 하위 알림을 직접 표시합니다. 이렇게 하면 사용자가 그룹의 +하위 항목을 스와이프할 때 시스템이 일관된 경험을 제공할 수 +있습니다. +
+ ++ 참고: 이 버전의 Android N에서는 아직 단일 하위 +항목이 포함된 알림 그룹에 대해 요약을 억제하지 않습니다. 이 +기능은 이후 버전의 Android N에 추가될 것입니다. +
+ +시스템은 +일반적으로 하위 알림을 그룹으로 표시하지만, +이 알림이 일시적으로 헤드업 알림으로 +나타나도록 설정할 수 있습니다. 이 기능을 사용하면 가장 최근의 하위 항목과 이에 +관련된 동작에 즉시 액세스할 수 있으므로 특히 유용합니다. +
+ + ++ Android 5.0 (API 레벨 21) 이후로, 알림 그룹과 +원격 입력은 Android Wear 기기를 지원하기 위한 {@link + android.app.Notification} API의 일부였습니다. 이미 이들 API로 알림을 작성한 경우 수행할 조치는, +앱 동작이 위에 설명된 지침과 일치하는지 확인하고 {@code + setRemoteInputHistory()} 구현을 +고려하는 것입니다. +
+ ++ 이전 버전과의 호환성을 지원하기 위해, +지원 라이브러리의 {@link android.support.v4.app.NotificationCompat} 클래스로 동일한 +API를 사용할 수 있으며, 이전 Android 버전에서 작동하는 알림을 작성할 +수 있습니다. 핸드헬드와 태블릿에서는 요약 알림만 사용자에게 보이므로, +앱은 해당 그룹의 전체 정보 콘텐츠에 대해 받은편지함 +스타일이나 이와 동등한 알림 표시를 계속 가져야 합니다. Android +Wear 기기에서는 구형 플랫폼 레벨에서도 +사용자가 모든 하위 알림을 볼 수 있으므로, API 레벨에 상관없이 하위 알림을 +작성해야 합니다. +
+ +Android N부터는 알림 뷰를 사용자 지정할 수 있으며 +알림 헤더, 동작 및 확장 가능한 레이아웃과 같은 시스템 장식을 계속 +획득할 수 있습니다.
+ +이 기능을 활성화하기 위해, Android N에서는 다음과 +같은 API를 추가하여 사용자 지정 뷰의 스타일을 지정합니다.
+ +이 새로운 API를 사용하려면, {@code setStyle()} 메서드를 호출하여, +원하는 사용자 지정 뷰 스타일에 전달합니다.
+ +이 코드 조각은 +{@code DecoratedCustomViewStyle()} 메서드로 사용자 지정 알림 객체를 구성하는 방법을 보여줍니다.
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/ko/preview/features/picture-in-picture.jd b/docs/html-intl/intl/ko/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..74472b5a545e --- /dev/null +++ b/docs/html-intl/intl/ko/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=PIP +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
Android N에서 Android TV 사용자는 +앱 안에서 탐색할 때 화면 모서리의 고정 창에서 +동영상을 볼 수 있습니다. PIP(Picture-in-picture) 모드를 사용하면 +앱의 백그라운드에서 다른 액티비티를 계속하면서 +고정 창에서 동영상 액티비티를 실행할 수 있습니다. PIP 창에서 사용자는 앱을 사용하는 동안 멀티태스킹이 가능하므로 +생산성이 향상됩니다.
+ +앱이 PIP 모드를 실행할 시기를 결정할 수 있습니다. PIP 모드로 진입하는 시기와 관련된 몇 가지 +예시:
+ +PIP 창은 240x135dp이고 +화면 모서리 4개 중 하나에서 가장 위쪽 레이어에 표시되며, 시스템이 선택합니다. 사용자는 +리모컨의 Home 버튼을 눌러 +PIP 창을 전체 화면으로 전환하거나 PIP를 닫는 PIP 메뉴를 불러올 수 있습니다. 다른 동영상이 +메인 화면에서 재생되기 시작하면 PIP 창이 +자동으로 닫힙니다. 사용자가 Recents를 통해서 PIP 창을 닫을 수도 있습니다.
+ + + + +PIP는 Android N에서 사용할 수 있는 다중 창 API를 사용하여 +고정된 동영상 오버레이 창을 제공합니다. 앱에 PIP를 추가하려면 +PIP를 지원하는 액티비티를 등록하고 필요한 경우 액티비티를 PIP 모드로 전환해야 합니다. 또한 +액티비티가 PIP 모드에 있을 때 UI 요소가 숨겨지고 동영상 재생이 +계속되는지 확인해야 합니다.
+ +기본적으로 시스템은 앱에 대해 PIP를 자동으로 지원하지 않습니다.
+앱에서 PIP를 지원하려면
+android:supportsPictureInPicture
와
+android:resizeableActivity
를 true
로 설정하여 매니페스트에서 동영상 액티비티를
+등록합니다. 또한,
+PIP 모드 전환 시 레이아웃 변경이 일어날 때 액티비티가 다시 시작되지 않도록
+액티비티가 레이아웃 구성 변화를 처리하게 지정합니다.
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
액티비티를 등록할 때는 PIP 모드에서 +액티비티가 TV 화면의 작은 오버레이 창에 표시된다는 것을 기억하세요. 최소 UI를 포함한 +동영상 재생 액티비티가 가장 좋은 사용자 경험을 제공합니다. 작은 UI 요소를 포함한 +액티비티는 PIP 모드로 전환할 때 +사용자가 PIP 창의 UI 요소를 상세히 볼 수 없으므로 +좋은 사용자 경험을 제공하지 못할 수 있습니다.
+ +Activity.enterPictureInPicture()
를 호출합니다. 다음은 사용자가 미디어 컨트롤 막대에서 전용 PIP 버튼을 선택했을 때
+PIP 모드로 전환하는 예시입니다.
+
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
미디어 제어 막대에 PIP 버튼을 추가하면 +사용자가 동영상 재생을 제어하면서 PIP 모드로 쉽게 전환할 수 있습니다.
+ + + + +Android N에는 컨트롤 막대 PIP 동작을 정의하고 PIP 아이콘을 사용하는 새로운
+PlaybackControlsRow.PictureInPictureAction
클래스가 포함되어 있습니다.
+
액티비티가 PIP 모드로 들어가면
+동영상 재생만 표시됩니다. 액티비티가 PIP 모드로 들어가기 전에 UI 요소를 제거하고
+액티비티가 다시 전체 화면이 되었을 때 이 요소를 복원합니다.
+필요에 따라 Activity.onPictureInPictureChanged()
또는
+Fragment.onPictureInPictureChanged()
을 재정의하고
+UI 요소를 활성화/비활성화합니다. 예:
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
액티비티가 PIP 모드로 전환되면 시스템은
+액티비티가 일시 정지된 상태에 있다고 간주하고 액티비티의 onPause()
메서드를 호출합니다. 동영상
+재생은 일시 정지되어서는 안되며 PIP 모드로 인해 액티비티가 일시 정지되었다면
+계속 재생되어야 합니다. 액티비티의
+onPause()
메서드에서 PIP를 확인하고 적절히 재생을 처리합니다. 예:
+
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
액티비티가 PIP 모드에서 전체 화면 모드로 전환되면,
+시스템이 액티비티를 재시작하고 onResume()
메서드를 호출합니다.
PIP는 전체 화면 동영상을 재생하는 액티비티용입니다. 액티비티를 +PIP 모드로 전환할 때는 동영상 콘텐츠만 표시하세요. +PIP에서 UI 처리에서 설명한 바와 같이 액티비티가 PIP 모드로 들어갈 때 +추적하고 UI 요소를 숨깁니다.
+ +PIP 창이 화면 모서리에 떠 있는 창으로 표시되므로 +PIP 창으로 가려질 수 있는 영역에는 메인 화면에서 +중요한 정보를 표시하지 말아야 합니다.
+ +액티비티가 PIP 모드일 때는 기본적으로 입력 포커스를 받지 않습니다. PIP 모드에서
+입력 이벤트를 수신하려면
+MediaSession.setMediaButtonReceiver()
를 사용합니다.
일반적으로 사진 앱과 같은 앱은
+Pictures
디렉터리 등 외부 저장소의 특정 디렉터리에만 액세스하면 됩니다. 기존 외부 저장소 액세스 방식은
+이런 유형의 앱에 대상화된 디렉터리 액세스를 쉽게
+제공하지 못합니다. 예:
Android N은 일반 외부 저장소 디렉터리에 액세스하기 위한 +단순화된 새로운 API를 제공합니다.
+ +StorageManager
클래스를 사용하여 적절한
+StorageVolume
인스턴스를 가져옵니다. 그 후, 해당 인스턴스의
+StorageVolume.createAccessIntent()
메서드를 호출하여 인텐트를 생성합니다.
+이 인텐트로 외부 저장소 디렉터리에 액세스합니다. 이동식 미디어 볼륨을 포함한
+모든 이용 가능한 볼륨 목록을 가져오려면
+StorageManager.getVolumesList()
를 사용합니다.
다음 코드 조각은 기본 공유 저장소의
+Pictures
디렉터리를 여는 방법에 대한 예시입니다.
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
시스템이 외부 디렉터리에 액세스 권한을 부여하고자 시도하고, +필요에 따라 단순화된 UI를 사용하는 사용자의 액세스를 확인합니다.
+ + + + +사용자가 액세스 권한을 부여하면, 시스템이
+Activity.RESULT_OK
의 결과 코드가 포함된
+onActivityResult()
재정의와 URI가 포함된 인텐트 데이터를 호출합니다. 제공된
+URI를 사용하여 디렉터리 정보에 액세스합니다.
+저장소
+액세스 프레임워크가
+반환한 URI를 사용하는 것과 유사합니다.
사용자가 액세스 권한을 부여하지 않으면 시스템이
+Activity.RESULT_CANCELED
의 결과 코드가 포함된
+onActivityResult()
재정의와 null 인텐트 데이터를 호출합니다.
참고: 특정 외부 디렉터리에 대한 액세스 권한을 얻으면 +해당 디렉터리의 하위 디렉터리에 대한 액세스 권한도 얻게 됩니다.
+ +범위가 지정된 디렉터리 액세스를 사용하여 이동식 미디어의 디렉터리에 액세스하려면 +먼저 다음과 같은 +{@link android.os.Environment#MEDIA_MOUNTED} 알림을 수신하는 {@link android.content.BroadcastReceiver}를 추가합니다.
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
사용자가 SD 카드 등의 이동식 미디어를 장착하면 시스템이
+{@link android.os.Environment#MEDIA_MOUNTED} 알림을 보냅니다. 이 알림은
+이동식 미디어 디렉터리에 액세스하는 데 사용할 수 있는 인텐트 데이터의 StorageVolume
객체를
+제공합니다. 다음은
+이동식 미디어의 Pictures
디렉터리에 액세스하는 예시입니다.
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
가능하면, 사용자에게 액세스 권한을 반복적으로 요청하지 않도록 외부 디렉터리 액세스 URI를
+변경하지 마세요. 사용자가 액세스 권한을 부여하면 디렉터리 액세스 URI로
+getContentResolver().takePersistableUriPermssion()
를
+호출합니다. 시스템이 URI를 유지하고 이후 액세스 요청에서는
+RESULT_OK
를 반환하고 사용자에게 확인 UI를
+표시하지 않습니다.
사용자가 외부 디렉터리 액세스를 거부하면 +다시 즉시 액세스를 요청하지 마세요. 액세스를 반복적으로 요청하는 것은 +나쁜 사용자 경험을 제공하게 됩니다.
diff --git a/docs/html-intl/intl/ko/preview/features/security-config.jd b/docs/html-intl/intl/ko/preview/features/security-config.jd new file mode 100644 index 000000000000..505df814d261 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=네트워크 보안 구성 +page.keywords=preview,security,network + +@jd:body + ++ Android N에는 앱 코드를 수정하지 않고 앱이 안전한 선언 +구성 파일에서 네트워크 보안 설정을 사용자 지정할 수 있는 +네트워크 보안 구성 기능이 포함되어 있습니다. 이 설정은 +특정 도메인과 특정 앱에 대해 구성할 수 있습니다. 이 기능의 +핵심 기능: +
+ ++ 네트워크 보안 구성 기능은 XML 파일을 사용해서 +앱의 설정을 지정합니다. 앱 매니페스트에 이 파일을 가리키는 항목을 +포함해야 합니다. 매니페스트에서 발췌한 다음 코드는 +이 항목을 생성하는 방법을 보여줍니다. +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ 앱에서 플랫폼 기본값 대신 사용자 지정 CA 세트를 +신뢰하고자 할 수 있습니다. 가장 일반적인 이유는 다음과 같습니다. +
+ ++ 기본적으로 모든 앱으로부터 안전한(예: TLS, HTTPS) 연결은 사전 설치된 시스템 CA를 신뢰하고, +API 레벨 23(Android M) +이하를 대상으로 하는 앱도 사용자가 추가한 CA 스토어를 기본적으로 신뢰합니다. 앱은 +{@code base-config}(앱 +전체 사용자 지정) 또는 {@code domain-config}(도메인별 +사용자 지정)를 사용하여 연결을 사용자 지정할 수 있습니다. +
+ + ++ 자체 서명된 +인증서를 사용하는 호스트나 신뢰할 수 있는 비공개 CA(예: 사내 CA)에서 발급한 SSL 인증서를 사용하는 호스트에 +연결할 경우를 가정합시다. +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ 자체 서명된 인증서 또는 비공개 CA 인증서를 PEM 또는 DER 형식으로 +{@code res/raw/my_ca}에 추가합니다. +
+ + ++ 앱에서 시스템이 신뢰하는 CA 중 일부를 신뢰하지 않으려면, 대신 +신뢰할 CA 세트를 줄여서 지정할 수 있습니다. 이 방법은 +다른 CA에서 발급된 허위 인증서로부터 앱을 보호해줍니다. +
+ ++ 신뢰할 수 있는 CA 세트를 제한하는 구성은 특정 도메인에서 사용자 지정 CA를 신뢰하는 것과 비슷하지만 +여러 CA가 리소스에서 제공된다는 점이 다릅니다. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ 신뢰할 수 있는 CA를 PEM 또는 DER 형식으로 {@code res/raw/trusted_roots}에 추가합니다.
+ PEM 형식을 사용할 경우 파일에 PEM 데이터만 포함되고
+다른 추가 텍스트가 포함되어서는 안 됩니다. 또한 한 개가 아니라 여러 개의
+<certificates>
+요소를 제공할 수 있습니다.
+
+ 앱에서 시스템이 신뢰하지 않는 CA를 신뢰하고자 한다면, +이는 시스템에 해당 CA가 아직 포함되지 않았거나 CA가 Android 시스템에 포함되기 위한 +요구사항을 충족하지 못했기 때문일 수 있습니다. +구성에 대해 여러 개의 인증서 소스를 지정하면 +신뢰할 수 있는 CA를 추가할 수 있습니다. +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ HTTPS로 연결되는 앱을 디버그할 때 +프로덕션 서버에 대해 SSL 인증서가 없는 로컬 개발 서버에 +연결하고자 할 수도 있습니다. 앱 코드를 수정하지 않고 +이 기능을 지원하려면 +{@code debug-overrides}를 사용하여android:debuggable +이 {@code true}일 때만 신뢰할 수 있는 디버그 전용 CA를 +지정할 수 있습니다. 일반적으로 IDE와 빌드 도구는 비 릴리스 빌드에 대해 +이 플래그를 자동으로 설정합니다. +
+ ++ 보안 예방 조치로 앱 스토어에서 +디버그 가능으로 표시된 앱은 허용하지 않기 때문에 +일반적인 조건 코드보다 안전합니다. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ 보안 연결만 사용하여 대상에 연결하는 애플리케이션은 해당 +대상에 대해 일반 텍스트를 지원하는 기능(HTTPS 대신 암호화되지 않은 HTTP +사용)을 옵트아웃할 수 있습니다. 이 옵션은 +백엔드 서버 등의 외부 소스가 제공하는 URL의 변경 사항으로 인해 +앱에서 우연히 회귀가 일어나지 않도록 예방합니다. + 자세한 내용은 {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()}를 참조하세요. +
+ ++ 예를 들어, 앱에서 적대적 네트워크로부터 민감한 트래픽을 보호하기 위해 {@code + secure.example.com}에 대한 연결은 항상 HTTPS를 통해서만 수행되도록 +할 수 있습니다. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ 일반적으로 앱은 모든 사전 설치된 CA를 신뢰합니다. 이러한 CA에서 +허위 인증서를 발급한다면 앱이 MiTM +공격에 노출될 위험이 있습니다. 일부 앱은 신뢰하는 CA 세트를 제한하거나 +인증서를 고정하는 방식으로 허용하는 인증서 세트를 제한합니다. +
+ ++ 인증서 고정은 +공개 키 해시(X.509인증서의 SubjectPublicKeyInfo)로 인증서 세트를 제공하는 방식으로 수행됩니다. 그러면 인증서 체인에 +하나 이상의 고정된 공개 키가 있어야만 +인증서 체인이 유효합니다. +
+ ++ 인증서 고정을 사용할 때는 언제나 백업 키를 포함해야 +새로운 키로 강제 전환하거나 CA를 변경할 경우( +CA 인증서 또는 해당 CA의 중간 CA에 고정할 경우) +앱 연결이 영향을 받지 않습니다. 그렇지 않으면 +연결을 복구하기 위해 앱에 업데이트를 내보내야 합니다. +
+ ++ 또한, 고정을 수행하지 않게 되면 핀 만료 시간을 +설정할 수 있습니다. 이는 업데이트되지 않은 앱에서 +연결 문제를 예방해 줍니다. 그러나 핀에 만료 시간을 설정하면 +고정 우회가 가능할 수도 있습니다. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ 특정 구성에서 설정되지 않은 값을 상속합니다. 이 동작은 구성 파일을 읽을 수 있게 유지하면서도 +더욱 복잡한 구성이 가능합니다. +
+ ++ 특정 항목에 값이 설정되지 않았다면 +그 다음으로 일반적인 항목의 값이 사용됩니다. {@code domain-config}에서 설정되지 않은 값은 +중첩될 경우 상위 {@code domain-config}에서 가져오고 그렇지 않을 경우 {@code + base-config}에서 가져옵니다. {@code base-config}에서 설정되지 않은 값은 +플랫폼 기본 값을 사용합니다. +
+ ++ 예를 들어, {@code + example.com}의 하위 도메인에 대한 모든 연결은 사용자 지정 CA 세트를 사용해야 합니다. 또한, 이러한 도메인에 대한 일반 텍스트 트래픽은 +{@code + secure.example.com}에 연결할 때를 제외하고 허용됩니다. {@code example.com} 구성 내부에 {@code + secure.example.com} 구성을 중첩하면 +{@code trust-anchors}를 복제하지 않아도 됩니다. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ 네트워크 보안 구성 기능은 XML 파일 형식을 사용합니다. + 파일의 전반적 구조는 다음 코드 샘플에 나타나 있습니다. +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ 다음 섹션에서는 이 파일 형식의 구문과 +기타 세부 정보를 설명합니다. +
+ +<base-config>
0 또는 1개<domain-config>
임의의 개수<debug-overrides>
0 또는 1개
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
에 포함되지 않는 모든 연결에서 사용하는 기본 구성.
+
++ 설정되지 않은 값은 플랫폼 기본값을 사용합니다. API 레벨 24 이상을 대상으로 하는 +앱의 기본 구성: +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++API 레벨 23 이하를 대상으로 하는 앱의 기본 구성: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
1개 이상
+<trust-anchors>
0 또는 1개
+<pin-set>
0 또는 1개
+<domain-config>
임의의 개수여러 {@code domain-config} 요소에서 대상을 포함하는 경우 가장 구체적인(긴) +일치 도메인이 포함된 구성이 사용됩니다.
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
0 또는 1개
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
임의의 개수
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ 이 소스의 CA가 인증서 고정을 우회할지 지정합니다. {@code + "true"}이고 인증서 체인이 이 소스의 CA 중 하나를 통해 묶일 경우 +고정을 수행하지 않습니다. 디버그 CA 또는 +사용자가 앱의 보안 트래픽을 MiTM하도록 지원할 때 유용합니다. +
+ ++ {@code debug-overrides} +요소에서 지정되지 않은 경우 기본값은 {@code "false"}입니다. 지정된 경우 기본값은 {@code "true"}입니다. +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
임의의 개수
+ <pin>
를 참조하세요.
+ + 만료는 사용자가 앱 업데이트를 비활성화하는 등과 같이 +핀 세트가 업데이트되지 않는 앱에서 +연결 문제를 예방하는 데 유용합니다. +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
TV 입력 서비스를 이용하면 +타임 시프팅 API를 통해 채널 재생을 일시 정지했다가 다시 시작할 수 있습니다. Android N에서는 사용자가 여러 개의 녹화된 세션을 저장할 수 있도록 함으로써 +타임 시프팅을 확장합니다.
+ +사용자는 미리 녹화를 예약하거나 프로그램을 보면서 녹화를 +시작할 수 있습니다. 시스템이 녹화물을 저장하면 사용자는 시스템 TV 앱을 사용하여 +녹화물을 탐색, 관리, 재생할 수 있습니다.
+ +TV 입력 서비스에 녹화 기능을 제공하고 싶다면 +앱이 녹화를 지원한다는 것을 시스템에 나타내고 +프로그램을 녹화하는 기능을 구현하고, 녹화 중 발생하는 오류를 처리 및 전달하고, +녹화된 세션을 관리해야 합니다.
+ +TV 입력 서비스가 녹화를 지원한다는 것을 시스템에 알리려면 +다음 절차를 따르세요.
+ +TvInputService.onCreate()
메서드에서 TvInputInfo.Builder
+클래스를 사용하여
+TvInputInfo
객체를 생성합니다.TvInputInfo
객체를 생성할 때 build()
를 호출하기 전에
+setCanRecord(true)
를 호출하여
+서비스가 녹화를 지원한다는 것을 나타냅니다.TvInputService.updateTvInputInfo()
를 호출하여 시스템에 TvInputInfo
객체를 등록합니다.TV 입력 서비스가 녹화 기능을 지원하도록 등록한 후,
+시스템은 앱의 녹화 구현에 액세스해야 할 때
+TvInputService.onCreateRecordingSession()
을 호출합니다.
+ 자체적인
+TvInputService.RecordingSession
서브클래스를 구현하고
+onCreateRecordingSession()
콜백이
+실행되면 이를 반환합니다. 이 서브클래스는 정확한 채널 데이터로 전환하고,
+요청된 데이터를 녹화하고, 녹화 상태와 오류를 시스템에
+전송하는 역할을 담당합니다.
시스템이 RecordingSession.onTune()
을 호출하면
+채널 URI에 전달되고, URI가 지정하는 채널에 맞춰 조정됩니다.
+notifyTuned()
를 호출해서 앱이 원하는 채널에 맞춰졌음을 시스템에 알리거나
+앱이 적절한 채널에 맞출 수 없으면
+notifyError()
를 호출합니다.
이어서 시스템이 RecordingSession.onStartRecording()
+콜백을 호출합니다. 앱이 즉시 녹화를 시작해야 합니다. 시스템이 이 콜백을 호출하면,
+녹화될 프로그램에 관한 정보가 포함된 URI를 제공할 수 있습니다.
+ 녹화가 완료되면 이
+데이터를 RecordedPrograms
데이터 테이블에 복사해야 합니다.
마지막으로 시스템이 RecordingSession.onStopRecording()
을 호출합니다.
+이 시점에서 앱이 즉시 녹화를 중단해야 합니다. 또한,
+RecordedPrograms
테이블에서 항목을 생성해야 합니다. 이 항목에는
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
열의 녹화된 세션 데이터 URI,
+최초
+onStartRecording()
호출에서 시스템이 제공한 프로그램 정보가 포함됩니다.
+
RecordedPrograms
테이블에 액세스하는 자세한 방법은
+녹화된 세션 관리를 참조하세요.
녹화 중에 오류가 발생해서 녹화된 데이터 렌더링을 사용할 수 없을 경우,
+RecordingSession.notifyError()
를 호출하여 시스템에 알립니다.
+마찬가지로 녹화 세션이 생성된 이후 notifyError()
를 호출하여
+앱이 더 이상 세션을 녹화하지 못한다는 것을 시스템에 알릴 수 있습니다.
녹화 중에 오류가 발생했지만
+사용자에게 재생 가능한 부분 녹화물을 제공하고 싶다면
+RecordingSession.notifyRecordingStopped()
를 호출하여 시스템이
+부분 세션을 사용할 수 있게 합니다.
시스템은 TvContract.RecordedPrograms
+콘텐츠 제공자 테이블에 모든 녹화 가능한 채널 앱에서 녹화된
+모든 세션에 관한 정보를 보관합니다. 이 정보는
+RecordedPrograms.Uri
콘텐츠 URI를 통해 액세스할 수 있습니다. 콘텐츠 제공자 API를 사용하여
+이 테이블의 항목을 읽고, 추가하고, 삭제합니다.
콘텐츠 제공자 데이터에 관한 자세한 정보는 + +콘텐츠 제공자 기본 정보를 참조하세요.
+ +TV 기기는 저장소가 제한될 수 있으므로
+녹화된 세션을 저장할 저장소를 할당할 때는 신중히 판단하세요. 녹화된 세션을 저장할 공간이 부족할 때는
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
를 사용하세요.
+
사용자가 녹화를 시작하면 최대한 빨리 데이터 녹화를
+시작해야 합니다. 이를 용이하게 하려면
+시스템이
+onCreateRecordingSession()
콜백을 호출할 때 저장소 액세스 및 할당 등과 같이 선행 시간이 많이 걸리는 작업을 완료합니다. 이렇게 하면
+onStartRecording()
콜백이
+실행될 때 즉시 녹화를 시작할 수 있습니다.
Android N은 Java 8 언어 기능을 지원합니다. +Java 8 언어 기능은 Android N을 대상으로 하는 앱을 개발할 때 사용할 수 있습니다. +이 페이지에서는 Android N Preview에서 지원되는 새로운 언어 기능과, +프로젝트를 적절히 설정하여 언어 기능을 사용하는 방법, +발생할 수도 있는 알려진 문제를 설명합니다. +
+ +이 기능을 사용하려면 Android +Studio 2.1(프리뷰)와 Android N Preview SDK를 다운로드하고 설정해야 합니다. 여기에는 필수 +Jack 툴체인과 업데이트된 Gradle용 Android 플러그인이 포함됩니다. 아직 +Android N Preview SDK를 설치하지 않았다면 Android N용 개발 설정을 참조하세요.
+ + + ++ 참고: 새로운 Java 8 언어 기능은 +Android N 플랫폼을 대상으로 하는 앱 개발에 필요한 요구 사항은 아닙니다. +Java 8 언어 기능으로 코드를 작성하고 싶지 않다면, +프로젝트의 소스와 대상 호환성 값을 Java 7로 설정할 수 있지만 +Android N 플랫폼용으로 구축하려면 JDK 8로 컴파일해야 합니다. +
+ ++ Android는 현재 모든 Java 8 언어 기능을 지원하지 않습니다. 그러나 현재 다음 기능은 +Android N Preview를 대상으로 하는 +앱을 개발할 때 이용할 수 있습니다. +
+ ++ 또한, 다음 Java 8 언어 기능 API를 사용할 수 있습니다. +
+ ++ 참고: Android N은 익명 클래스에 대한 람다 식의 구현을 +기반으로 합니다. 이 방식을 사용하면 +이전 버전과 호환되고 이전 버전의 Android에서 실행할 수 있습니다. +이전 버전에서 람다 식을 테스트하려면 {@code + build.gradle} 파일에서 {@code compileSdkVersion}과 {@code + targetSdkVersion}을 23 이하로 설정하십시오. +
+ ++ 새로운 Java 8 언어 기능을 사용하려면 +새로운 Jack 툴체인을 사용해야 합니다. 이 새로운 +Android 툴체인은 Java 언어 소스를 Android에서 읽을 수 있는 Dex +바이트코드로 컴파일하고, 자체 {@code .jack} 라이브러리 형식이 있으며, 단일 도구로는 가장 많은 툴체인 +기능(리패키징, 축소, 난독화, 멀티덱스)을 +제공합니다. +
+ +다음은 Android DEX 파일을 빌드하는 데 사용하는 2개의 툴체인을 비교한 것입니다.
++ 프로젝트에서 Java 8 언어 기능과 Jack을 활성화하려면 +모듈별 {@code build.gradle} 파일에 다음을 입력합니다. +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Android Studio 2.0(베타)에 도입된 Instant Run은 +현재 Jack과 호환되며 새로운 툴체인을 사용하는 동안 비활성화됩니다. +
+ +Jack이 앱을 컴파일할 때 중간 클래스 파일을 생성하지 않으므로 +이런 파일에 의존하는 도구는 현재 Jack과 호환되지 않습니다. 이러한 도구의 예시는 +다음과 같습니다.
+ +Jack을 사용하는 동안 다른 문제를 발견하면 버그를 보고해주세요.
\ No newline at end of file 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 000000000000..a7ee3d3078e2 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=프로그램 개요 +page.metaDescription=앱에서 차기 버전의 Android를 사용할 수 있도록 준비하세요. +page.image=images/cards/card-n-overview_2x.png +meta.tags="프리뷰", "developer", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ Android N Developer Preview에 오신 것을 환영합니다. 이 프로그램은 +차기 버전의 Android에 대해 앱을 테스트하고 최적화하는 데 필요한 +모든 것을 제공합니다. 이 프로그램은 무료이고, +N Developer Preview 도구를 다운로드하면 바로 시작할 수 있습니다. +
+ + + + + + + ++ 다양한 기기 또는 에뮬레이터에서 앱을 실행하고 테스트하세요. + +
++ Preview 동안 월별 업데이트를 제공할 예정이며 따라서 여러분은 항상 최신 플랫폼 변경에 대해 테스트할 수 있습니다. +
++ Google에서는 처음 몇 주 동안 개발자가 보고한 문제에 우선 순위를 부여할 예정이므로, +가능한 빨리 테스트하고 피드백을 보내 주세요. +
++ 새로운 플랫폼 동작을 지원하고 새로운 기능으로 개발하려면 작업을 일찍 시작하세요. +
++ Android 베타 프로그램을 통해 모든 지원되는 기기에서 매끄럽게 무선으로 업데이트합니다 +. 플래시가 필요없습니다. +
++ +Issue Tracker를 사용하여 문제를 보고하고 피드백을 보내 주세요. +N 개발자 커뮤니티에서 +다른 개발자와 연락하세요. +
++ N Developer Preview는 2016년 3월 9일부터 2016년 3분기로 예정된 +AOSP 및 OEM에 Android N 최종 공개 릴리스까지 진행됩니다. +
+ ++ 중요 개발 마일스톤에서 여러분의 개발과 테스트 환경에 대한 +업데이트를 제공합니다. 일반적으로는 매월(4~6주 +간격) 업데이트를 제공할 예정입니다. 마일스톤은 다음과 같습니다. +
+ ++ 각 업데이트에는 SDK 도구, 프리뷰 시스템, 이미지, 에뮬레이터, 참조 문서, +API 차이 등이 포함됩니다. +
+ ++ 첫 3단계 프리뷰 마일스톤은 현재 앱의 호환성 문제를 파악하고 +새 플랫폼에 필요한 마이그레이션이나 주요 작업을 +계획하는 데 도움이 되는조기 테스트 및 개발 환경을 제공합니다. +이는 기능과 API, 파일 호환성 문제에 대한 피드백을 제공하는 +우선순위 기간입니다. +—이러한 모든 경우에 Issue +Tracker를 사용하세요. 업데이트 과정에서 일부 API가 변경될 수 있습니다. +
+ ++ 프리뷰 4 및 5에서 개발에 사용할 최종 + N API 및 SDK와 최종 버전에 가까운 시스템 이미지에 대한 액세스를 제공하고, +시스템 동작과 기능을 테스트할 수 있습니다. 이번에 Android N은 표준 API +레벨을 제공합니다. 레거시 앱의 최종 호환성 테스트를 시작하고 +N API 또는 기능을 사용하는 새 코드를 개선할 수 있습니다. +
+ ++ 또한 프리뷰 4에서 시작하면 Android 베타 프로그램에 옵트인된 소비자 기기와 같이 +공식 API 레벨에서 Android N을 실행하는 기기에 앱을 +게시할 수 있습니다. +Google Play 알파 및 베타 채널에 먼저 게시할 수 있으므로, +Play 스토어에 광범위하게 배포하기 전에 Android 베타 소비자를 통해 앱을 테스트할 수 있습니다. + +
+ ++ Android N에서 테스트 및 개발하는 동안 프리뷰 업데이트가 릴리스되면 +개발 환경을 최신으로 유지하는 것이 좋습니다. +이 과정을 손쉽게 진행하려면 테스트 기기를 +Android 베타 프로그램에 등록하고 각 마일스톤에서 OTA 업데이트를 +받을 수 있습니다. 또는 업데이트된 프리뷰 이미지를 직접 다운로드하고 +플래시할 수 있습니다. +
+ ++ 프리뷰 업데이트가 제공될 때마다 Android 개발자 블로그, +해당 사이트 및 Android +N 개발자 커뮤니티를 통해서 알려드릴 것입니다. +
+ + ++ N Developer Preview에는 +기존 앱을 다양한 화면 크기, 네트워크 기술, CPU/GPU 칩셋 +및 하드웨어 아키텍처에서 테스트하는 데 필요한 모든 것이 포함되어 있습니다. +
+ +이러한 구성 요소는 Android Studio에서 SDK Manager를 통해 다운로드할 수 있습니다.
+ ++ 필요에 따라 각 마일스톤에서 이러한 개발 도구를 업데이트할 것입니다. +
+ ++ N Developer Preview에는 Nexus와 물리적 기기를 테스트하고 개발할 때 사용할 수 있는 다른 하드웨어 시스템 이미지가 포함되어 있습니다. +하드웨어 이미지의 전체 목록을 보려면 기기 이미지 페이지를 +참조하세요. +
+ ++ 각 마일스톤에서 업데이트된 시스템 이미지를 제공합니다. +업데이트된 시스템 이미지를 다운로드 및 플래시하고 필요한 만큼 자주 +직접 기기를 테스트할 수 있습니다. 이 방법은 +기기를 여러 번 다시 플래시해야 하는 자동화된 테스트 환경에 +특히 유용합니다. +
+ +참고: +수동으로 플래시된 기기는 지난 해 프리뷰와 달리 OTA 업데이트를 받지 못합니다 +. 올해에는 Android 베타 프로그램에 기기를 등록해야 OTA 업데이트를 받을 수 있습니다. +—자세한 내용은 다음 섹션을 참조하세요. +
+ ++ Android N에서는 프로그램에 등록한 기기에 Android N의 최신 프리뷰 업데이트를 자동으로 전송하는 +OTA(Over-the-Air) 업데이트 프로그램이 새로 도입되었습니다. +이 프로그램은 무료이고 Google 계정에 등록된 지원 기기를 가지고 있는 사람이라면 +누구나 사용할 수 있습니다. +
+ ++ 프로그램에 등록하려면 Android +Beta 프로그램 사이트를 방문하세요. +계정에 등록된 기기 중 Android 베타에 등록할 수 있는 기기를 +모두 확인할 수 있습니다. +
+ ++ 등록을 마치면 곧 기기에서 업데이트를 수신합니다. 대부분의 경우, +Android N으로 이동하기 위해 데이터를 완전히 초기화할 필요는 없지만, +잃고 싶지 않은 데이터가 있다면 기기를 등록하기 전에 백업하는 것이 +좋습니다. +
+ ++ 업데이트가 기기에 전송되면, +가급적 빨리 다운로드하고 설치하는 것이 좋습니다. 시스템 UI, 동작, API 및 기능의 최신 변경 사항에 맞춰 +기기를 최신으로 유지할 수 있습니다. +
+ ++ Developer Preview가 마무리될 때, 등록된 기기는 +공식 Android N 릴리스 업데이트를 받게 됩니다. +
+ ++ Android 베타 사이트에서 언제든 Android 베타 프로그램에서 기기 등록을 해제할 수 있습니다. +등록을 해제하기 전에 기기에서 데이터를 +백업하세요. +
+ +참고: + 등록을 해제하면 Android 6.0 Marshmallow +최신 버전으로 기기가 공장 초기화됩니다 +(기기 등록 전에 설치했던 버전이 +아닐 수도 있습니다). 클린 설치를 위해서 +연락처, 메시지, 사진 등의 데이터가 +기기에서 삭제됩니다. +
+ ++ Developer Preview 사이트에서 다음과 같은 문서 리소스를 이용할 수 있으며, +Android N에 대해 익히는 데 유용합니다. +
+ ++ 초기 프리뷰 업데이트 동안 +최신 Android N 플랫폼용 +API 참조를 별도의 zip 아카이브로 다운로드할 수 있습니다. 참조 +다운로드에는 +API 23 및 이전 업데이트에서 API 변경 사항을 확인하는 데 유용한 차이점 보고서도 포함되어 있습니다. +
+ ++ Android N API가 최종 버전이 되고 공식 API 레벨이 할당되면, +https://developer.android.com에서 온라인으로 API 참조를 제공할 것입니다. +
+ ++ N Developer Preview에서 테스트하고 개발하면서 다음 채널을 활용하여 +문제를 보고하고 피드백을 제공해 주세요. +
+ +
+ N Developer Preview는 표준 API 레벨이 없는 개발 전용 시스템과 Android
+라이브러리를 제공합니다.
+앱을 테스트하기 위해 호환성 동작에서 옵트아웃하고자 하는 경우(강력히
+권장함), 앱의 targetSdkVersion
+를 “N”
으로 설정하여 N Developer 프리뷰 버전을
+대상으로 지정하면 됩니다.
+
+ Android N Developer Preview에서는 프리뷰 API +를 제공합니다. —이 API는 최종 SDK가 출시될 때까지 +공식적인 버전으로 인정되지 않습니다. 최종 SDK 릴리스는 현재 2016년 3분기로 예정되어 있습니다. 즉, 시간이 지나면서 특히 프로그램을 시작한 초기 몇 주 동안에는 +사소한 API 변경이 있을 수 있습니다. +Android N Developer Preview를 업데이트할 때마다 +변경 사항을 요약하여 제공할 것입니다. +
+ ++ 참고: 프리뷰 API는 변경될 수 있지만, 기본 시스템 +동작은 안정적이며 지금 바로 테스트 가능한 상태입니다. + +
+ ++ Google Play는 N Developer +Preview를 대상으로 하는 앱의 게시를 금지합니다. Android N 최종 SDK를 사용할 수 있게 되면 +공식 Android N API 레벨을 대상으로 지정하고 알파 및 베타 릴리스 채널을 통해 Google +Play에 게시할 수 있습니다. 그때까지는 +Android N을 대상으로 하는 앱을 테스터들에게 배포하고자 하는 경우, 이메일이나 본인의 사이트에서 직접 +다운로드를 통해 하시면 됩니다. +
+ ++ AOSP와 OEM에 대한 Android N 전체 릴리스는 2016년 3분기로 예정되어 있습니다. +이때 Google Play에서 공개 릴리스 채널에 Android N을 대상으로 하는 앱을 +게시할 수 있을 것입니다. +
+ + ++ Android N으로 앱 테스트를 시작하려면: +
+ ++ Android N Developer Preview 프로그램에 참가해 주셔서 대단히 감사합니다! +
diff --git a/docs/html-intl/intl/ko/preview/samples.jd b/docs/html-intl/intl/ko/preview/samples.jd new file mode 100644 index 000000000000..634133b28127 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=샘플 +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ Android N용으로 다음 코드 샘플이 제공됩니다. Android Studio에서 샘플을 +다운로드하려면 File > Import + Samples 메뉴 옵션을 선택합니다. +
+ ++ 참고: 이러한 다운로드 가능한 프로젝트는 Gradle 및 Android Studio와 함께 사용하도록 +고안되었습니다. +
+ + ++ 이 샘플은 앱으로 다중 창 사용자 인터페이스를 활용하는 +방법을 보여줍니다. +
++ +GitHub에서 가져오기 +
+ + ++ NotificationCompat를 사용하여 +알림을 발송하는 간단한 서비스를 보여주는 기존 샘플입니다. 각각의 읽지 않은 사용자 대화는 +고유한 알림으로 발송됩니다. +
++ 이 샘플은 Android N에서 사용할 수 있는 새로운 알림 기능을 +활용하도록 업데이트되었습니다. +
++ +GitHub에서 가져오기 +
+ + ++ NotificationManager를 +사용하여 현재 애플리케이션이 표시할 알림 개수를 지시하는 +방법을 보여주는 기존 샘플입니다. +
++ 이 샘플은 Android N에서 사용할 수 있는 새로운 알림 기능을 +활용하도록 업데이트되었습니다. +
++ +GitHub에서 가져오기 +
+ + ++ 이 샘플은 기기 암호화된 저장소에 데이터를 저장하고 액세스하는 방법을 보여줍니다. +이 저장소는 기기가 부팅된 동안 항상 사용할 수 있습니다. +
++ +GitHub에서 가져오기 +
+ + ++ 이 샘플은 적은 권한을 요구하면서도 +특정 디렉터리에서 데이터를 읽고 쓰는 방법을 보여줍니다. +
++ +GitHub에서 가져오기 +
\ No newline at end of file diff --git a/docs/html-intl/intl/ko/preview/setup-sdk.jd b/docs/html-intl/intl/ko/preview/setup-sdk.jd new file mode 100644 index 000000000000..91c68a64ebd8 --- /dev/null +++ b/docs/html-intl/intl/ko/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=Preview 설정 +meta.keywords="프리뷰", "android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +Android N Preview용 앱을 개발하려면, 이 페이지의 설명에 따라 +개발자 환경을 약간 업데이트해야 합니다.
+ +Android N 시스템 이미지에서 앱의 호환성을 간단히 +테스트하려면, 가이드에 따라 Android N 기기에서 테스트를 수행하세요.
+ + + + +Android N 플랫폼에서는 Java 8 언어 기능을 지원하며 +여기에는 Jack이라는 새로운 컴파일러가 필요합니다. 현재는 +Android Studio 2.1에서만 최신 버전의 Jack이 지원됩니다. 따라서 Java 8 언어 기능을 +사용하려면, Android Studio 2.1을 사용하여 앱을 빌드해야 합니다. 그렇지 않은 경우, +Jack 컴파일러를 사용할 필요가 없지만 Android N 플랫폼에 +대해 컴파일하려면 아래의 설명에 따라 JDK 8로 +업데이트해야 합니다. +
+ + + +현재 Android Studio 2.1은 Canary 릴리스 채널에서 프리뷰로 +제공됩니다. +Android Studio가 이미 있고 Canary Channel로 업데이트하지 않으려면, +Android Studio 2.1을 별도의 설치로 다운로드한 후, Android N을 +사용한 개발에 이것을 사용할 수 있습니다. +이 경우 기본 Android Studio 환경은 영향을 받지 않습니다.
+ +Android Studio 2.1을 별도의 설치로 다운로드하려면 다음 +단계를 따르세요(또는 기존 설치의 업데이트로 Android Studio 2.1을 +받으려면 4단계로 건너뛰세요).
+ +다음 단계를 위해 이 설정 창을 열어둡니다.
+ + +Android N API를 사용한 개발을 시작하려면, +다음과 같이 Android N Preview SDK를 Android Studio에 설치해야 합니다.
+ ++ Android N API에 대한 자세한 내용은 N Preview +참조 문서에서 볼 수 있으며, 이 문서는 다음 표에서 다운로드할 수 있습니다. +이 패키지에는 요약된 오프라인 버전의 Android 개발자 +웹사이트가 있고 Android N API용의 업데이트된 +API 참조와 API 차이점 보고서가 포함되어 있습니다. +
+ +문서 | +체크섬 | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
Dispositivo | +Download / Checksums | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ O Preview pode ser desinstalado de um dispositivo de uma das + seguintes maneiras:
++ O dispositivo receberá uma atualização por OTA para a versão de produção mais recente + disponível do Android para o dispositivo em questão (por exemplo, o Android 6.0 Marshmallow). + Essa atualização exige que o dispositivo seja totalmente redefinido, portanto, os dados do usuário serão + removidos. Não deixe de fazer o backup de dados importantes antes + de cancelar a inscrição de um dispositivo. +
+Observação: + para desinstalar uma imagem de sistema do Developer Preview antes do + fim do programa, é preciso redefinir o dispositivo por completo e remover todos os dados + do usuário no dispositivo. +
+ + +Para usar o emulador do Android para executar o Android N Preview, você deve +fazer o download do Android N Preview SDK e criar um dispositivo virtual para o +emulador.
+ +Primeiro, faça o download do Android N Preview SDK da seguinte maneira (se você +já adquiriu esse recurso ao se preparar +para desenvolver para o Android N, pule esta etapa): + +
Agora, você deve ter o Android SDK Built-Tools 24.0 0 rc1, +o Platform-Tools 24.0.0 rc1 e o SDK Tools +25.0.9. Se você não atualizar o SDK Tools para a versão 25.0.9, não será +possível executar as imagens de sistema x86_64 para o Android N.
+ + +Agora, crie um dispositivo virtual com a imagem de sistema do Android N:
+ +Agora, é possível iniciar o emulador do Android com o AVD Android N Preview.
+ ++Para ter a melhor experiência possível com o emulador do Android, instale o +Android Studio 2.1 Preview, que oferece suporte ao Android Emulator 2.0 Beta, +cujo desempenho é muito superior ao do emulador no +Android Studio 1.5.
+ +Observação: + se você está usando o Android Studio 2.0 Beta, há um problema conhecido + que impede a criação de AVDs com imagens de sistema do N Preview, portanto, + é preciso usar o Android Studio 2.1 Preview para criar AVDs. +
+ +Para saber mais sobre como criar dispositivos virtuais para teste, consulte Gerenciamento de dispositivos virtuais. +
+ + + + + + + + + + + + + + ++ Os processos em segundo plano podem fazer uso intensivo de memória e bateria. Por exemplo, uma + transmissão implícita poderá iniciar diversos processos em segundo plano registrados + para escutá-la, mesmo se esses processos não forem muito usados. Isso pode afetar + substancialmente o desempenho do dispositivo e a experiência de usuário. +
+ ++ Para aliviar esse problema, o N Developer Preview aplica as seguintes + restrições: +
+ ++ A estrutura do Android oferece diversas soluções para reduzir a necessidade dessas + transmissões implícitas. Por exemplo, {@link android.app.job.JobScheduler} + e +{@code GcmNetworkManager} oferecem mecanismos robustos para agendar operações + de rede quando ocorrem condições especificadas, como conexão a uma + rede ilimitada. Agora, você também pode usar {@link android.app.job.JobScheduler} + para reagir a mudanças em provedores de conteúdo. Os objetos {@link android.app.job.JobInfo} + encapsulam os parâmetros usados por {@link android.app.job.JobScheduler} + para agendar o seu trabalho. Quando as condições do trabalho forem atendidas, o sistema + executará o trabalho no {@link android.app.job.JobService} do seu aplicativo. +
+ ++ Neste documento, veremos como usar métodos alternativos, como + {@link android.app.job.JobScheduler}, para adaptar seu aplicativo a essas novas + restrições. +
+ ++ Os aplicativos direcionados ao N Developer Preview não receberão transmissões {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} se estiverem + registrados para recebê-las no seu manifesto e os processos que dependerem dessas + transmissões não serão iniciados. Isso pode ser um problema para aplicativos que quiserem + escutar mudanças de rede ou executar atividades de rede em massa quando o + dispositivo se conectar a uma rede ilimitada. Já existem várias soluções para contornar essa + restrição na estrutura do Android, mas a escolha da solução correta + depende do que o aplicativo pretende realizar. +
+ ++ Observação: um {@link android.content.BroadcastReceiver} registrado em + {@link android.content.Context#registerReceiver Context.registerReceiver()} + continuará a receber essas transmissões enquanto o aplicativo estiver em primeiro plano. +
+ ++ Ao usar a classe {@link android.app.job.JobInfo.Builder JobInfo.Builder} + para compilar o objeto {@link android.app.job.JobInfo}, aplique o método {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} e passe {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} como parâmetro do trabalho. O código a seguir + agendará a execução de um serviço quando o dispositivo se conectar a uma rede + ilimitada e estiver carregando: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ Quando as condições para o trabalho forem atendidas, o aplicativo receberá um retorno de chamada para executar + o método {@link android.app.job.JobService#onStartJob onStartJob()} na + {@code JobService.class} especificada. Para ver mais exemplos da implementação de {@link + android.app.job.JobScheduler}, consulte o aplicativo de exemplo do JobScheduler. +
+ ++ Os aplicativos que usarem serviços do GMSCore e forem direcionados ao Android 5.0 (nível da API 21) + ou anterior poderão usar + {@code GcmNetworkManager} e especificar {@code Task.NETWORK_STATE_UNMETERED}. +
+ ++ Aplicativos executados em primeiro plano ainda poderão escutar {@code + CONNECTIVITY_CHANGE} com um {@link + android.content.BroadcastReceiver} registrado. No entanto, a API {@link + android.net.ConnectivityManager} oferece um método mais robusto para solicitar + um retorno de chamada apenas quando condições de rede especificadas são atendidas. +
+ ++ Os objetos {@link android.net.NetworkRequest} definem os parâmetros do + retorno de chamada de rede em termos de {@link android.net.NetworkCapabilities}. Objetos + {@link android.net.NetworkRequest} são criados com a classe {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder}. Em seguida, {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} + passa o objeto {@link android.net.NetworkRequest} ao sistema. Quando + as condições de rede forem atendidas, o aplicativo receberá um retorno de chamada para executar o + método {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} definido em sua classe {@link + android.net.ConnectivityManager.NetworkCallback}. +
+ ++ O aplicativo continuará a receber retornos de chamada até que o aplicativo encerre ou chame + {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()}. +
+ ++ No N Developer Preview, os aplicativos não conseguem enviar nem receber transmissões {@link + android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link + android.hardware.Camera#ACTION_NEW_VIDEO}. Essa restrição ajuda a + aliviar os impactos no desempenho e na experiência de usuário quando vários aplicativos devem + despertar para processar uma nova imagem ou vídeo. O N Developer Preview + estende {@link android.app.job.JobInfo} e {@link + android.app.job.JobParameters} para oferecer uma solução alternativa. +
+ ++ Para acionar trabalhos em mudanças de URI de conteúdo, o N Developer Preview estende + a API {@link android.app.job.JobInfo} com os seguintes métodos: +
+ ++ Observação: não é possível usar {@code TriggerContentUri()} + juntamente com {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} ou {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()}. Para monitorar continuamente mudanças de conteúdo, agende um novo + {@link android.app.job.JobInfo} antes que o {@link + android.app.job.JobService} do aplicativo encerre o processamento do retorno de chamada mais recente. +
+ ++ O exemplo de código a seguir agenda um trabalho que será acionado quando o sistema indicar + uma mudança no URI de conteúdo {@code MEDIA_URI}: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ Quando o sistema indicar uma mudança nos URIs de conteúdo especificados, o aplicativo + receberá um retorno de chamada e um objeto {@link android.app.job.JobParameters} será + passado para o método {@link android.app.job.JobService#onStartJob onStartJob()} + na {@code MediaContentJob.class}. +
+ ++ O N Developer Preview também estende {@link android.app.job.JobParameters} para + permitir que o aplicativo receba informações úteis sobre quais autoridades de conteúdo + e URIs acionaram o trabalho: +
+ ++ O exemplo de código a seguir substitui o método {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} e + registra as autoridades de conteúdo e URIs que acionaram o trabalho: +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ A otimização dos aplicativos para execução em dispositivos com pouca memória ou em + condições de pouca memória pode melhorar o desempenho e a experiência do usuário. A remoção de + dependências de serviços em segundo plano e receptores de transmissão + implícita registrados estatisticamente podem aprimorar a execução do aplicativo nesses dispositivos. Embora + o N Developer Preview avance na redução de alguns desses problemas, + recomendamos que você otimize os aplicativos para execução sem o uso desses + processos em segundo plano. +
+ ++ O N Developer Preview introduz alguns comandos adicionais do Bridge de Debug Android (ADB) que + podem ser usados para testar o comportamento do aplicativo de teste com esses processos em segundo plano desativados: +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
O Android N é executado em um modo seguro de inicialização direta +quando o dispositivo é ligado, mas o usuário não o +desbloqueia. Para isso, o sistema oferece dois locais de armazenamento para dados:
+ +Por padrão, aplicativos não são executados no modo de inicialização direta. +Se seu aplicativo precisa executar ações durante esse modo, você pode registrar os +componentes que devem ser executados. Alguns casos comuns +para aplicativos que precisam ser executados no modo de inicialização direta:
+ +Se seu aplicativo precisar acessar dados enquanto estiver no modo de inicialização direta, use +o armazenamento criptografado do dispositivo. O armazenamento criptografado do dispositivo contém dados +criptografados com uma chave que só é disponibilizada depois que o dispositivo realizou +uma inicialização verificada com sucesso.
+ +Para dados que devem ser criptografados com uma chave associada às credenciais +do usuário, como um PIN ou uma chave, use o armazenamento criptografado de credenciais. +Esse armazenamento só é disponibilizado depois que o usuário +desbloquear o dispositivo com sucesso e até que ele reinicie o dispositivo novamente. Se o +usuário ativar a tela de bloqueio após desbloquear o dispositivo, isso não bloqueará +o armazenamento criptografado de credenciais.
+ +Aplicativos devem registrar seus componentes com o sistema antes de
+poderem ser executados no modo de inicialização direta ou acessar o armazenamento criptografado
+do dispositivo. Os aplicativos são registrados com o sistema ao marcar os componentes como
+tendo reconhecimento de criptografia. Para marcar seu componente como tendo reconhecimento de criptografia, defina o atributo
+android:encryptionAware
como true no manifesto.
+ +
Componentes com reconhecimento de criptografia podem se registrar para receber uma mensagem de transmissão
+LOCKED_BOOT_COMPLETED
do
+sistema quando o dispositivo for reiniciado. Nesse momento, o armazenamento criptografado do
+dispositivo é disponibilizado e pode executar tarefas
+necessárias durante o modo de inicialização, como o acionamento de um alarme programado.
O fragmento de código a seguir é um exemplo de como registrar um
+{@link android.content.BroadcastReceiver} como tendo reconhecimento de criptografia e adicionar um
+filtro de intenção para LOCKED_BOOT_COMPLETED
no manifesto do aplicativo:
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
Quando o usuário desbloquear o dispositivo, todos os componentes poderão acessar o armazenamento +criptografado do dispositivo e o armazenamento criptografado de credenciais.
+ +Para acessar o armazenamento criptografado do dispositivo, crie uma segunda instância de
+{@link android.content.Context} chamando
+Context.createDeviceEncryptedStorageContext()
. Todas as chamadas da API
+de armazenamento que usam esse contexto acessam o armazenamento criptografado do dispositivo. O
+exemplo a seguir acessa o armazenamento criptografado do dispositivo e abre um
+arquivo de dados existente do aplicativo:
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
Use o armazenamento criptografado do dispositivo somente para +informações que precisem ser acessadas durante o modo de inicialização direta. +Não use o armazenamento criptografado do dispositivo como um repositório criptografado para fins gerais. +Para informações particulares do usuário ou dados criptografados que não são necessários durante +o modo de inicialização direta, use o armazenamento criptografado de credenciais.
+ +Quando o usuário desbloquear o dispositivo após a reinicialização, seu aplicativo poderá voltar +a acessar o armazenamento criptografado de credenciais e usar serviços regulares do sistema que +dependem das credenciais do usuário.
+ +Para receber uma notificação quando o usuário desbloquear o dispositivo após uma reinicialização,
+registre um {@link android.content.BroadcastReceiver} do componente em execução
+para ouvir a mensagem ACTION_USER_UNLOCKED
. Você também pode
+receber a mensagem {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} existente, que agora indica que o dispositivo foi inicializado e que
+o usuário o desbloqueou.
Você pode enviar uma consulta diretamente se o usuário desbloquear o dispositivo chamando
+UserManager.isUserUnlocked()
.
Se um usuário atualizar o dispositivo para usar o modo de inicialização direta, você poderá ter dados
+existentes que precisem ser migrados para o armazenamento criptografado do dispositivo. Use
+Context.migrateSharedPreferencesFrom()
e
+Context.migrateDatabaseFrom()
para migrar dados de preferências e do banco de
+dados entre o armazenamento criptografado de credenciais e o armazenamento criptografado do dispositivo.
Tenha bom senso ao decidir quais dados migrar do armazenamento +criptografado de credenciais para o armazenamento criptografado do dispositivo. Não migre +informações particulares do usuário, como senhas ou tokens de autorização, para o +armazenamento criptografado do dispositivo. Em alguns casos, pode ser necessário gerenciar +conjuntos separados de dados nos dois repositórios criptografados.
+ +Teste seu aplicativo com reconhecimento de criptografia usando o novo modo de inicialização direta. Existem duas +maneiras de ativar a inicialização direta.
+ +Cuidado: ao ativar a inicialização direta, +você apaga todos os dados do usuário no dispositivo.
+ +Em dispositivos compatíveis com o Android N instalado, ative a +inicialização direta seguindo um destes procedimentos:
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
Um modo de inicialização direta emulado também está disponível, caso você precise trocar +de modo nos dispositivos de teste. O modo emulado só deve ser usado durante +o desenvolvimento e pode causar perda de dados. Para ativar o modo de inicialização direta, +defina um padrão de bloqueio no dispositivo, escolha "No thanks", caso seja solicitada +uma tela de inicialização segura ao definir esse padrão, e, em seguida, use o +seguinte comando de shell adb:
+ ++$ adb shell sm set-emulate-fbe true ++ +
Para desativar o modo de inicialização direta emulado, use o seguinte comando:
+ ++$ adb shell sm set-emulate-fbe false ++ +
O uso desses comandos faz com que o dispositivo seja reinicializado.
diff --git a/docs/html-intl/intl/pt-br/preview/features/icu4j-framework.jd b/docs/html-intl/intl/pt-br/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..290ea0df6b56 --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=APIs de estrutura do Android para ICU4J + +@jd:body + ++ O ICU4J é um conjunto de bibliotecas Java de código aberto e amplamente usadas que fornecem suporte para Unicode + e globalização para aplicativos de software. O Android N + expõe um subconjunto de APIs do ICU4J na estrutura do Android para uso dos desenvolvedores de aplicativos + no pacote {@code android.icu}. Essas APIs usam + dados de localização presentes no dispositivo. Consequentemente, você pode reduzir o uso de APK + ao não compilar as bibliotecas do ICU4J no seu APK. Em vez disso, pode + simplesmente chamá-las na estrutura. (Neste caso, pode ser conveniente fornecer + várias versões + do seu APK para que os usuários que tenham versões inferiores ao Android N + possam fazer o download de uma versão do aplicativo que contenha as bibliotecas do ICU4J.) +
+ ++ Este documento começa fornecendo informações básicas sobre os níveis mínimos da + Android API necessários para oferecer suporte a essas bibliotecas. Em seguida, ele explica o que + você deve saber sobre a implementação do ICU4J específica do Android. Por fim, + ele informa como usar as APIs do ICU4J na estrutura do Android. +
+ +
+ O Android N expõe um subconjunto de APIs do ICU4J por meio do pacote
+ android.icu
, não do com.ibm.icu
. A
+ estrutura do Android pode optar por não
+ expor as APIs do ICU4J por diversos motivos. Por exemplo, o Android N não expõe
+ algumas APIs obsoletas ou APIs que a equipe do ICU ainda não declarou como
+ estáveis. Conforme a equipe do ICU torna APIs obsoletas, o Android também as marcará
+ como obsoletas, mas continuará incluindo-as.
+
Nível da Android API | +Versão ICU | +Versão CLDR | +
---|---|---|
Android N | +56 | +28 | +
Algumas observações importantes:
+ +
+ Se você já estiver usando as APIs do ICU4J no seu aplicativo e as APIs
+ android.icu
atenderem aos seus requisitos, a migração para
+ as APIs de estrutura exigirão que você altere as importações Java
+ de com.ibm.icu
para android.icu
. Você, então, poderá
+ remover sua própria cópia dos arquivos do ICU4J do APK.
+
+ Observação: As APIs de estrutura do ICU4J usam o espaço de nome {@code android.icu} + em vez de {@code com.ibm.icu}. Isso ocorre para evitar conflitos + de espaço de nome em APKs que contêm as próprias bibliotecas {@code com.ibm.icu}. +
+ +
+ Algumas classes dos pacotes java
e android
têm
+ equivalentes para as encontradas no ICU4J. No entanto, o ICU4J frequentemente fornece um suporte
+ mais amplo para padrões e linguagens.
+
Alguns exemplos para você começar:
+Classe | +Alternativas | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ O ICU4J é liberado sob a licença do ICU. Para saber mais, consulte o Guia do usuário do + ICU. +
diff --git a/docs/html-intl/intl/pt-br/preview/features/multi-window.jd b/docs/html-intl/intl/pt-br/preview/features/multi-window.jd new file mode 100644 index 000000000000..31fa01205aff --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=Suporte a várias janelas +page.metaDescription=Novo suporte à exibição de mais de um aplicativo ao mesmo tempo no Android N. +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ O Android N adiciona suporte à exibição de mais de um aplicativo ao + mesmo tempo. Em dispositivos portáteis, dois aplicativos podem ser executados lado a lado ou + um acima do outro no modo de tela dividida. Em dispositivos de TV, os aplicativos podem + usar o modo de imagem em imagem para continuar a reprodução do vídeo enquanto os usuários + interagem com outro aplicativo. +
+ ++ Se você compilar o aplicativo com o N Preview SDK, poderá configurar como o aplicativo + processa a exibição de várias janelas. Por exemplo, você pode especificar as dimensões +mínimas permitidas para a atividade. Você também pode desativar a exibição de várias janelas para + o aplicativo, garantindo que o sistema mostre o aplicativo apenas +em modo de tela inteira. +
+ ++ O Android N permite que diversos aplicativos compartilhem a tela ao mesmo tempo. Por + exemplo, um usuário pode dividir a tela para visualizar uma página da web no lado esquerdo + e compor um e-mail no lado direito. A experiência do usuário depende do + dispositivo: +
+ ++ O usuário pode mudar para o modo de várias janelas das seguintes maneiras: +
+ ++ Os usuários podem arrastar e + soltar dados de uma atividade para outra enquanto as atividades compartilham + a tela. (Anteriormente, os usuários podiam apenas arrastar e soltar dados em uma única + atividade.) +
+ ++ O modo de várias janelas não altera o ciclo de vida + da atividade. +
+ ++ No modo de várias janelas, somente a atividade com a qual o usuário interagiu mais recentemente + fica ativa em um determinado momento. Essa atividade é considerada a atividade superior. + Todas as outras atividades ficam no estado pausado, mesmo se visíveis. + No entanto, o sistema atribui a essas atividades pausadas, mas visíveis, uma prioridade maior + que a das atividades não visíveis. Se o usuário interagir com uma das + atividades pausadas, ela será retomada e a atividade previamente superior + será pausada. +
+ ++ Observação: em modo de suporte a várias janelas, um aplicativo pode estar no estado + pausado e continuar visível ao usuário. Pode ser necessário que um aplicativo continue com suas + atividades, mesmo se pausado. Por exemplo, um aplicativo que reproduz vídeo e que está no + modo pausado, mas visível, deve continuar a exibir o vídeo. Por esse + motivo, recomendamos que atividades que reproduzem vídeo não pausem o + vídeo nos manipuladores {@link android.app.Activity#onPause onPause()}. + Em vez disso, o vídeo deve ser pausado em {@link android.app.Activity#onStop + onStop()} e a reprodução retomada em {@link android.app.Activity#onStart + onStart()}. +
+ ++ Quando o usuário coloca um aplicativo no modo de várias janelas, o sistema notifica a + atividade sobre a mudança de configuração, como especificado em Processamento de alterações + no tempo de execução. Essencialmente, essa alteração afeta + o ciclo de vida da atividade da mesma forma que quando o sistema notifica o aplicativo de que o dispositivo mudou + do modo de retrato para paisagem, exceto que as dimensões do dispositivo são + alteradas, em vez de simplesmente permutadas. Como discutido em Processamento de alterações + no tempo de execução, a sua atividade pode processar ela mesma a mudança de configuração ou + permitir que o sistema destrua a atividade e recrie-a com as novas + dimensões. +
+ +
+ Se o usuário redimensionar uma janela e aumentar uma de suas dimensões, o
+ sistema redimensionará a atividade para corresponder à ação do usuário e emitirá mudanças de tempo de execução
+ conforme necessário. Se o aplicativo demorar a desenhar nas áreas recém-expostas, o
+ sistema preencherá temporariamente essas áreas com a cor especificada pelo atributo {@link
+ android.R.attr#windowBackground windowBackground} ou pelo atributo de estilo padrão
+ windowBackgroundFallback
.
+
+ Se o seu aplicativo for direcionado ao Android N, você poderá configurar como + e se as atividades do aplicativo suportam a exibição em várias janelas. Você pode definir + atributos no manifesto para controlar o tamanho e o layout. + As definições de atributos de uma atividade raiz se aplicam a todas as atividades + em sua pilha de tarefas. +
+ ++ Observação: se você compilar um aplicativo com várias orientações usando uma versão + do SDK anterior ao Android N e o usuário usar o aplicativo em + modo de suporte a várias janelas, o sistema redimensionará forçosamente o aplicativo. O sistema apresenta uma + caixa de diálogo avisando o usuário de que o aplicativo pode se comportar de forma inesperada. O sistema + não redimensiona aplicativos de orientação fixa; se + o usuário tentar abrir um aplicativo de orientação fixa no modo de várias janelas, + o aplicativo ocupará toda a tela. +
+ +
+ Defina esse atributo no nó <activity>
ou
+ <application>
em seu manifesto para ativar ou desativar a exibição em
+ várias telas:
+
+android:resizeableActivity=["true" | "false"] ++ +
+ Se esse atributo for definido como verdadeiro, a atividade poderá ser inicializada nos + modos de tela dividida e forma livre. Se o atributo for definido como falso, a + atividade não oferecerá suporte ao modo de várias janelas. Se esse valor for falso e o + usuário tentar iniciar a atividade no modo de várias janelas, a atividade ocupará + a tela inteira. +
+ ++ Se o aplicativo for direcionado ao Android N, mas o valor desse atributo não for + especificado, o atributo assumirá o valor padrão de verdadeiro. +
+ +
+ Defina esse atributo no nó <activity>
ou no seu manifesto para
+ indicar se a atividade oferece suporte à exibição no modo de imagem em imagem. Esse
+ atributo será ignorado se android:resizeableActivity
for falso.
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ No Android N, o elemento de manifesto <layout>
+ oferece suporte a diversos atributos que afetam o comportamento da atividade no
+ modo de várias janelas:
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + Por exemplo, o código a seguir mostra como especificar um tamanho e uma localização + padrão para a atividade, bem como o tamanho mínimo, quando a atividade é exibida no + modo de forma livre: +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ O Android N oferece nova funcionalidade para dar suporte a aplicativos que podem ser executados + no modo de várias janelas. +
+ ++ Alguns recursos são desativados ou ignorados quando um dispositivo está no modo de + várias janelas, pois não fazem sentido para uma atividade que pode estar compartilhando a + tela do dispositivo com outras atividades ou aplicativos. Esses recursos incluem: + +
android:screenOrientation
.
+ + Os novos métodos a seguir foram adicionados à classe {@link android.app.Activity} + para oferecer suporte à exibição em várias janelas. Para obter detalhes sobre cada método, consulte a + Referência do N Preview SDK. +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ Observação: o modo de imagem em imagem é um caso especial do
+ modo de várias janelas. Se myActivity.inPictureInPicture()
+ retornar verdadeiro, myActivity.inMultiWindow()
também retornará
+ verdadeiro.
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ Existem também versões de {@link android.app.Fragment} para cada um desses
+ métodos como, por exemplo, Fragment.inMultiWindow()
.
+
+ Para colocar uma atividade no modo de imagem em imagem, chame o novo método
+ Activity.enterPictureInPicture()
. Esse método não terá efeito se
+ o dispositivo não oferecer suporte ao modo de imagem em imagem. Para obter mais informações,
+ consulte a documentação do modo imagem em imagem.
+
+ Quando você iniciar uma nova atividade, poderá indicar ao sistema que a
+ a nova atividade deverá ser exibida adjacente à atual, se possível. Para fazer
+ isso, use o sinalizador
+ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
. A passagem
+ desse sinalizador solicita o seguinte comportamento:
+
+ Se um dispositivo estiver no modo de forma livre e você iniciar uma nova atividade, poderá
+ especificar as dimensões e a posição na tela da nova atividade chamando
+ ActivityOptions.setLaunchBounds()
. Esse método não terá efeito se
+ o dispositivo não estiver no modo de várias janelas.
+
+ Observação: se você iniciar uma atividade em uma pilha de tarefas, essa + atividade substituirá a atividade na tela, herdando todas as + propriedades de suporte a várias janelas. Se você quiser iniciar a nova atividade como janela + separada no modo de várias janelas, inicie essa atividade em uma nova pilha de tarefas. +
+ ++ Os usuários podem arrastar e + soltar dados de uma atividade para outra enquanto as duas atividades + compartilham a tela. (Anteriormente, os usuários podiam apenas arrastar e soltar dados em uma + única atividade.) Por esse motivo, se o aplicativo não tem a funcionalidade de arrastar e soltar, + pode ser uma boa ideia adicioná-la. +
+ +
+ O N Preview SDK estende o pacote android.view
+ para oferecer suporte ao recurso arrastar e soltar entre aplicativos. Para obter detalhes sobre os seguintes
+ métodos e classes, consulte a Referência
+ do Preview SDK.
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
. Se você precisar conceder permissões de URI à
+ atividade de destino, passe os novos sinalizadores,
+ View.DRAG_FLAG_GLOBAL_URI_READ
ou
+ View.DRAG_FLAG_GLOBAL_URI_WRITE
, conforme o caso.
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + Atualizando ou não o seu aplicativo para o Android N, você deve + verificar como ele se comporta no modo de várias janelas, pois um usuário pode tentar iniciá-lo + no modo de várias janelas em um dispositivo executando o Android N. +
+ ++ Se você instalar o Android N em um dispositivo, o modo de tela dividida + será instalado automaticamente. +
+ ++ Se você não compilou o aplicativo com o N Preview SDK e o usuário tentar usar + o aplicativo no modo de várias janelas, o sistema redimensionará obrigatoriamente o aplicativo, a menos que este + declare uma orientação fixa. +
+ ++ Se o aplicativo não declarar uma orientação fixa, inicie o aplicativo + em um dispositivo executando Android N e tente colocar o aplicativo no modo + de tela dividida. Verifique se a experiência de usuário é + aceitável quando o aplicativo é redimensionado obrigatoriamente. +
+ ++ Se o aplicativo declarar uma orientação fixa, você deverá tentar colocá-lo no + modo de várias janelas. Verifique se, ao fazê-lo, o aplicativo continua + no modo de tela cheia. +
+ ++ Se você compilar o aplicativo com o N Preview SDK e não tiver desativado o + suporte a várias janelas, verifique o comportamento a seguir nos modos de tela dividida + e forma livre. +
+ ++ Para verificar o desempenho do aplicativo no modo de várias janelas, experimente as operações + a seguir. Você deve tentar essas operações nos modos de tela dividida e + várias telas, exceto onde houver instruções diferentes. +
+ +
+ Se você desativou o suporte a várias janelas definindo
+ android:resizableActivity="false"
, inicie o aplicativo em
+ um dispositivo executando Android N e tente colocá-lo nos modos
+ de forma livre e tela dividida. Verifique se, ao fazê-lo, o aplicativo continua
+ no modo de tela cheia.
+
O Android N oferece suporte avançado para usuários multilíngues, +permitindo que eles selecionem várias localidades nas configurações. O Android N +fornece esse recurso ao expandir significativamente a quantidade de localidades com suporte +e mudando a forma como o sistema resolve recursos. O novo método para resolver +recursos é mais robusto e foi projetado para ser compatível com APKs existentes, mas +tenha cuidado adicional para identificar comportamentos inesperados. Por exemplo, você +deve testar para garantir que seu aplicativo assuma o idioma esperado por padrão. Além disso, +se seu aplicativo oferecer suporte a vários idiomas, você deverá garantir que esse suporte funcione da maneira +esperada. Por fim, garanta que seu aplicativo possa lidar corretamente +com idiomas que ele não tenha sido explicitamente projetado para suportar.
+ +Este documento começa explicando a estratégia de resolução de recursos anterior ao +Android N. Em seguida, ele descreve a estratégia +de resolução de recursos aprimorada do Android N. Por fim, ele explica como aproveitar as vantagens +do maior número de localidades para oferecer suporte a usuários multilíngues.
+ +Antes do Android N, o Android nem sempre conseguia + corresponder aplicativos e localidades de sistema corretamente. Por exemplo, supondo que o idioma padrão do seu aplicativo + seja o inglês americano, mas que ele também tenha strings em espanhol em arquivos de recurso {@code es_ES} +.
+Quando seu código Java fizesse referência a strings, ele resolveria os idiomas das strings da +seguinte maneira:
+Esses problemas de resolução surgiram porque o sistema removia o código de país + da localidade se não encontrasse uma correspondência exata. Por exemplo:
+ +Configurações do usuário | +Recursos do aplicativo | +Resolução do recurso | +
---|---|---|
fr_CH | +
+padrão (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Tentativa de fr_CH => Falha +Tentativa de fr => Falha +Usar o padrão (en) + |
+
Neste exemplo, o sistema exibe strings em inglês sem saber +se o usuário entende inglês. Esse comportamento é bastante comum +hoje em dia. O Android N deverá reduzir de forma significativa a frequência de +resultados como esse.
+ +O Android N proporciona uma resolução de recurso mais robusta e
+encontra soluções alternativas melhores. No entanto, para agilizar a resolução e melhorar
+ a capacidade de manutenção, você deve armazenar os recursos no dialeto pai mais comum.
+ Por exemplo, se você estava armazenando recursos em espanhol no diretório {@code es-US}
+ antes, mova-os para o diretório {@code es-419}, que contém o espanhol latino-americano.
+ Da mesma maneira, se você tiver strings de recurso em uma pasta {@code en-GB}, renomeie
+ essa pasta para {@code en-001} (inglês internacional), pois o pai mais comum
+ para strings en-GB
é {@code en-001}.
+ O exemplo a seguir explica por que essas práticas melhoram o desempenho e
+a confiabilidade da resolução de recursos.
Com o Android N, o caso descrito na Tabela 1 é resolvido +de forma diferente:
+ + +Configurações do usuário | +Recursos do aplicativo | +Resolução do recurso | +
---|---|---|
|
+
+padrão (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Tentativa de fr_CH => Falha +Tentativa de fr => Falha +Tentativa de filhos de fr => fr_FR +Usar fr_FR + |
+
Agora o usuário obtém recursos em francês em vez de inglês. Esse exemplo também mostra + por que você deve armazenar strings em francês em {@code fr} em vez de em {@code fr_FR} + para o Android N. Nesse caso, a ação necessária é fazer a correspondência com o dialeto pai mais próximo, + tornando a resolução mais rápida e mais previsível.
+ +Além dessa lógica de resolução melhorada, agora o Android oferece mais + idiomas de usuário dentre os quais escolher. Vamos experimentar o exemplo acima novamente com o italiano + especificado como um idioma de usuário adicional, mas sem suporte para francês no aplicativo.
+ + +Configurações do usuário | +Recursos do aplicativo | +Resolução do recurso | + +
---|---|---|
|
+
+padrão (en) +de_DE +es_ES +it_IT + |
+
+Tentativa de fr_CH => Falha +Tentativa de fr => Falha +Tentativa de filhos de fr => Falha +Tentativa de it_CH => Falha +Tentativa de it => Falha +Tentativa de filhos de it => it_IT +Usar it_IT + |
+
+
O usuário obtém um idioma que ele compreende, mesmo que o aplicativo não tenha suporte para +o francês.
+ + +O Android N adiciona uma nova API {@code LocaleList.GetDefault()} +que permite que os aplicativos façam uma consulta direta na lista de idiomas especificados por um usuário. Essa API +permite que você crie um comportamento mais sofisticado + para o aplicativo e uma exibição de conteúdo mais otimizada. Por exemplo, uma pesquisa + pode mostrar resultados em vários idiomas com base nas configurações do usuário. Aplicativos de navegador + podem evitar ofertas de tradução de páginas em um idioma que o usuário conhece + e os aplicativos de teclado também podem ativar todos os layouts apropriados automaticamente.
+ +Até o Android 6.0 (nível da API 23), o Android oferecia suporte para apenas uma ou duas localidades + para muitos idiomas comuns +(en, es, ar, fr, ru). Como só existiam poucas variantes de cada idioma, +os aplicativos podiam armazenar alguns números e datas como strings no código +nos arquivos de recurso. No entanto, com o conjunto mais amplo de localidades suportadas do Android, +podem existir +diferenças significativas nos formatos de data, hora, moeda e informações +similares dentro da mesma localidade. Colocar formatos no código podem produzir uma +experiência confusa para os usuários. Portanto, ao desenvolver para o Android N, +não deixe de usar formatadores em vez de strings no código para números e datas.
+ +Um bom exemplo é o árabe, cujo suporte no Android N foi expandido de +uma {@code ar_EG} para 27 localidades de árabe. Essas localidades podem compartilhar a maioria dos recursos, +mas algumas preferem dígitos ASCII, enquanto outras preferem dígitos nativos. Por exemplo, +quando você quer criar uma frase com uma variável em dígito, como +“Choose a 4 digit pin”, use formatadores como mostrado abaixo:
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/pt-br/preview/features/notification-updates.jd b/docs/html-intl/intl/pt-br/preview/features/notification-updates.jd new file mode 100644 index 000000000000..a714abb796db --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=Notificações +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + +
O Android N introduz diversas APIs novas que permitem que aplicativos publiquem + notificações altamente visíveis e interativas.
+ +O Android N estende a API de notificação {@link android.support.v4.app.RemoteInput} + atual para permitir respostas em linha em celulares. Esse recurso permite que os usuários + respondam rapidamente na aba de notificações sem acessar o aplicativo.
+ ++ O Android N permite empacotar notificações semelhantes para + exibição como única notificação. Para que isso seja possível, o Android N usa o método {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} existente. Os usuários podem expandir todas as + notificações, executando ações como responder e descartar em cada uma + delas individualmente na aba de notificações. +
+ +Por fim, o Android N também adiciona várias APIs que permitem usar decorações + do sistema nas visualizações de notificação personalizadas do aplicativo. Essas APIs ajudam + a garantir que as visualizações de notificação compartilhem uma apresentação consistente com os + modelos padrão.
+ +Este documento destaca algumas principais mudanças que você deve considerar + ao usar os novos recursos de notificação em aplicativos.
+ +Com o recurso de resposta direta no Android N, os usuários podem responder + rapidamente a mensagens de texto ou atualizar listas de tarefas diretamente na interface de + notificação. Em um dispositivo portátil, a ação de resposta em linha aparece como botão adicional + anexado à notificação. Quando um usuário responde pelo teclado, o sistema anexa + a resposta de texto à intenção + especificada como ação de notificação e envia a intenção ao + aplicativo no dispositivo. + + + +
+ +Para criar uma ação de notificação com suporte à resposta direta: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
.
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
O sistema solicita que o usuário informe uma resposta quando acionar a + ação de notificação.
+ + + + +Para receber a entrada do usuário da interface de notificação para a atividade + declarada na intenção de ação de resposta:
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
O fragmento de código a seguir mostra como um método recupera o texto de entrada + de um pacote:
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
Os aplicativos podem aplicar lógica para decidir as ações a serem executadas para o texto + recuperado. + Para aplicativos interativos (como bate-papos), forneça mais contexto na própria notificação + (por exemplo, várias linhas de histórico de bate-papo, incluindo as mensagens do próprio usuário) + para que o usuário possa responder de forma adequada. + Quando o usuário responde via {@link android.support.v4.app.RemoteInput}, + inclua o texto no histórico de resposta com o método +{@code setRemoteInputHistory()}.
+ +O Android N oferece aos desenvolvedores uma nova forma de representar + uma fila de notificações: notificações empacotadas. Essa forma é semelhante ao recurso + Pilhas + de Notificações no Android Wear. Por exemplo, se o aplicativo criar notificações + para mensagens recebidas, quando mais de uma mensagem for recebida, empacote as + notificações como um único grupo. Você pode + usar o método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} para empacotar notificações semelhantes.
+ ++ Um grupo de notificações impõe uma hierarquia nas notificações que o compõe. + Na parte superior dessa hierarquia, está a notificação pai, que exibe informações + resumidas para o grupo. O usuário pode expandir + progressivamente o grupo de notificações e o sistema mostra mais informações à medida que o + usuário aumenta o detalhamento. Quando o usuário expande o pacote, o sistema revela + mais informações para todas as notificações filhas. Quando o usuário + expande uma das notificações, o sistema revela todo o seu conteúdo. +
+ + + + +Para saber como adicionar notificações a um grupo, consulte +Adicionar +cada notificação a um grupo.
+ + +Esta seção oferece diretrizes sobre quando usar grupos de notificações em vez + de notificações {@link android.app.Notification.InboxStyle InboxStyle} + que foram disponibilizadas em versões anteriores da + plataforma Android.
+ +Você deve usar grupos de notificações apenas quando todas as condições a seguir forem + verdadeiras para o seu caso de uso:
+ +Os exemplos de bons casos de uso para grupos de notificações incluem: um aplicativo de mensagens + exibindo uma lista de mensagens recebidas ou um aplicativo de e-mail exibindo uma lista de + e-mails recebidos.
+ ++Os exemplos de casos em que uma única notificação é preferível + incluem mensagens individuais de uma única pessoa ou uma representação em lista + de itens de texto com uma única linha. Você pode usar +({@link android.app.Notification.InboxStyle InboxStyle} ou + {@link android.app.Notification.BigTextStyle BigTextStyle}) para + isso. +
+ ++ O aplicativo deve sempre publicar um resumo do grupo, mesmo se o grupo tiver apenas uma + única filha. O sistema suprimirá o resumo e exibirá diretamente a + notificação filha se ela contiver apenas uma única notificação. Isso garante + que o sistema possa oferecer uma experiência consistente quando o usuário deslizar por + filhas de um grupo. +
+ ++ Observação: esta versão do Android N ainda não + elimina o resumo de grupos de notificações contendo uma única filha. Essa + funcionalidade será adicionada em uma versão posterior do Android N. +
+ +Embora o sistema normalmente exiba notificações filhas como grupo, você pode + configurá-las para exibição temporária como + + notificações heads-up. Esse recurso é particularmente útil porque permite + acesso imediato à filha mais recente e a suas ações associadas. +
+ + ++ Os grupos de notificações e as entradas remotas fazem parte da API {@link + android.app.Notification} desde o Android 5.0 (nível da API 21) para oferecer suporte a + dispositivos Android Wear. Se você já criou notificações com essas APIs, + a única ação necessária é verificar se o comportamento do aplicativo corresponde + às diretrizes descritas acima e considerar a implementação de {@code + setRemoteInputHistory()}. +
+ ++ Para compatibilidade com versões anteriores, as mesmas APIs estão disponíveis com + a classe {@link android.support.v4.app.NotificationCompat} da biblioteca de suporte +, permitindo criar notificações que funcionem em versões anteriores do + Android. Em celulares e tablets, os usuários somente visualizam as notificações resumidas. + Portanto, um aplicativo deve ter uma notificação no estilo de caixa de entrada ou equivalente, + representativa de todo o conteúdo de informações do grupo. Como dispositivos Android + Wear permite que os usuários vejam todos as notificações filhas, mesmo em níveis + de plataforma antigos, você deve criar notificações filhas independentemente do nível + da API. +
+ +Começando com o Android N, é possível personalizar visualizações de notificação e + continuar obtendo decorações de sistema, como cabeçalhos de notificação, ações e layouts + expansíveis.
+ +Para ativar esses recursos, o Android N adiciona as seguintes APIs para aplicar estilo à + visualização personalizada:
+ +Para usar essa nova API, chame o método {@code setStyle()}, passando o + estilo de visualização personalizada desejado.
+ +Este fragmento mostra como construir um objeto de notificação personalizada com o método + {@code DecoratedCustomViewStyle()}.
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/pt-br/preview/features/picture-in-picture.jd b/docs/html-intl/intl/pt-br/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..ec75fa3a4ad7 --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=Imagem em imagem +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
No Android N, os usuários do Android TV agora podem assistir a um vídeo +em uma janela fixada em um canto da tela enquanto navegam em +aplicativos. O modo de imagem em imagem (PIP) permite que os aplicativos executem uma atividade de vídeo +na janela fixada enquanto outra atividade continua em +segundo plano. A janela do PIP permite que os usuários realizem várias tarefas enquanto usam seu aplicativo, o que os +ajuda a ser mais produtivos.
+ +Seu aplicativo pode decidir quando acionar o modo de PIP. Veja alguns exemplos de +quando entrar no modo de PIP:
+ +A janela do modo de PIP tem 240x135 dp e é mostrada na camada superior de um dos +quatro cantos da tela, escolhido pelo sistema. O usuário pode exibir um +menu de PIP que permite que coloque a janela do PIP em tela inteira ou feche-a +ao pressionar o botão Home do controle remoto. Se outro +vídeo começar a ser reproduzido na tela principal, a janela do PIP será fechada +automaticamente. Os usuários também podem fechar a janela do PIP em Recents.
+ + + + +O PIP utiliza as APIs de várias janelas disponíveis no Android N para +fornecer a janela sobreposta de vídeo fixo. Para adicionar o modo de PIP ao seu aplicativo, você deve +registrar as atividades que oferecem suporte a PIP, alternar a atividade para o modo de PIP conforme +a necessidade e garantir que os elementos de interface sejam ocultados e que a reprodução do vídeo continue quando +a atividade estiver no modo de PIP.
+ +Por padrão, o sistema não oferece suporte ao modo de PIP automaticamente para seus aplicativos.
+Se quiser esse suporte para seu aplicativo, registre a atividade
+de vídeo no manifesto definindo
+android:supportsPictureInPicture
e
+android:resizeableActivity
como true
. Além disso, especifique
+que a atividade processa alterações na configuração de layout de forma que a atividade
+não seja reiniciada quando ocorrem essas alterações durante as transições do modo de PIP.
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
Ao registrar a atividade, lembre-se de que, no modo de PIP, ela +é mostrada em uma pequena janela sobreposta em uma tela de TV. Atividades de reprodução de +vídeo com uma quantidade mínima de itens de interface oferecem a melhor experiência para o usuário. Atividades que contêm +pequenos elementos de interface podem não oferecer uma boa experiência para o usuário +no modo de PIP, pois ele não conseguirá enxergar os detalhes desses elementos +na janela do PIP.
+ +Activity.enterPictureInPicture()
. Os exemplos a seguir entram
+no modo de PIP quando o usuário seleciona um botão dedicado ao PIP em uma barra de controle
+de mídia:
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
Adicionar um botão de PIP à sua barra de controle de mídia permite que o usuário entre no +modo de PIP com facilidade ao controlar a reprodução de um vídeo.
+ + + + +O Android N inclui uma nova classe
+PlaybackControlsRow.PictureInPictureAction
que define ações do PIP
+para a barra de controle e usa o ícone do PIP.
Quando a atividade entra no modo de PIP, ela deve mostrar apenas a reprodução do
+vídeo. Remova elementos de interface antes que a atividade entre no modo de PIP
+e restaure esses elementos quando a atividade voltar ao modo de tela inteira.
+Substitua Activity.onPictureInPictureChanged()
ou
+Fragment.onPictureInPictureChanged()
e ative ou
+desative os elementos de interface conforme for necessário. Por exemplo:
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
Quando a atividade entra no modo de PIP, o sistema a considera
+pausada e chama o método onPause()
da atividade. A reprodução
+de vídeos não deverá ser pausada se a atividade
+for pausada devido ao modo de PIP. Verifique o PIP no método
+onPause()
da atividade e realize a reprodução da forma apropriada. Por
+exemplo:
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
Quando a atividade sai do modo de PIP e volta à tela inteira, o
+sistema retoma a atividade e chama o método onResume()
.
O PIP é destinado a atividades que reproduzem vídeos em tela inteira. Ao passar +a atividade para o modo de PIP, evite mostrar qualquer coisa que não seja o conteúdo do vídeo. +Rastreie quando a atividade entrar no modo de PIP e oculte os elementos de interface, conforme descrito +em Lidar com a interface durante o modo de imagem em imagem.
+ +Como a janela do PIP é mostrada como uma janela flutuante no canto da +tela, você deve evitar exibir informações essenciais em qualquer área +da janela principal que possa ser ocultada pela janela do PIP.
+ +Quando uma atividade está no modo de PIP, ela não recebe foco de entrada por padrão. Para
+receber eventos de entrada no modo de PIP, use
+MediaSession.setMediaButtonReceiver()
.
Aplicativos, como aplicativos de fotos, normalmente só precisam acessar diretórios específicos de um
+armazenamento externo, como o diretório Pictures
. As abordagens
+existentes para o acesso de armazenamentos externos não foram desenvolvidas para fornecer com facilidade
+acesso direcionado a diretórios para esses tipos de aplicativos. Por exemplo:
O Android N fornece uma nova API simplificada para acessar +diretórios de armazenamento externo comuns.
+ +Use a classe StorageManager
para obter a instância
+StorageVolume
apropriada. Em seguida, crie uma intenção chamando o método
+StorageVolume.createAccessIntent()
dessa instância.
+Use essa intenção para acessar os diretórios de armazenamento externo. Para obter uma lista de
+todos os volumes disponíveis, incluindo volumes de mídias removíveis, use
+StorageManager.getVolumesList()
.
O fragmento de código a seguir é um exemplo de como abrir o diretório
+Pictures
no armazenamento compartilhado principal:
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
O sistema tenta conceder acesso ao diretório externo e, +se necessário, confirma o acesso com o usuário usando uma interface simplificada:
+ + + + +Se o usuário conceder o acesso, o sistema chamará sua substituição de
+onActivityResult()
com um código de resultado de
+Activity.RESULT_OK
e os dados de intenção que contêm o URI. Use
+o URI fornecido para acessar as informações do diretório, o que é semelhante a usar URIs
+retornados pela
+Estrutura de
+acesso ao armazenamento.
Se o usuário não conceder o acesso, o sistema chamará sua substituição de
+onActivityResult()
com um código de resultado de
+Activity.RESULT_CANCELED
e dados de intenção nulos.
Observação: Ao obter acesso a um diretório externo específico, +você também obtém acesso aos subdiretórios dentro do diretório em questão.
+ +Para usar o Acesso a diretórios com escopo para acessar diretórios em uma mídia removível, +primeiro adicione um {@link android.content.BroadcastReceiver} que escute a notificação +{@link android.os.Environment#MEDIA_MOUNTED}. Por exemplo:
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
Quando o usuário monta uma mídia removível, como um cartão SD, o sistema envia uma notificação
+{@link android.os.Environment#MEDIA_MOUNTED}. Essa notificação
+fornece um objeto StorageVolume
nos dados de intenção que
+você pode usar para acessar os diretórios na mídia removível. O exemplo a seguir
+acessa o diretório Pictures
na mídia removível:
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Quando possível, mantenha o URI de acesso a diretórios externos para que você não precise
+solicitar acesso ao usuário várias vezes. Quando o usuário conceder o acesso, chame
+getContentResolver().takePersistableUriPermssion()
com o
+URI de acesso ao diretório. O sistema manterá o URI e as solicitações de acesso
+subsequentes retornarão RESULT_OK
e não mostrarão a mensagem de confirmação para o
+usuário.
Se o usuário negar acesso a um diretório externo, não repita a +solicitação imediatamente. Insistir em solicitações de acesso repetidas vezes gera uma experiência +negativa para o usuário.
diff --git a/docs/html-intl/intl/pt-br/preview/features/security-config.jd b/docs/html-intl/intl/pt-br/preview/features/security-config.jd new file mode 100644 index 000000000000..673de0f58009 --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=Configurações de segurança de rede +page.keywords=preview,security,network + +@jd:body + ++ O Android N inclui um recurso de configurações de segurança de rede + que permite que os aplicativos personalizem as configurações de segurança de rede em um arquivo de configurações declarativo e seguro + sem modificar o código do aplicativo. Essas configurações podem + ser definidas para domínios específicos e para um aplicativo específico. Os principais + recursos são: +
+ ++ O recurso de configurações de segurança de rede usa um arquivo XML no qual você especifica + as configurações do seu aplicativo. Inclua uma entrada no manifesto do seu + aplicativo para apontar para esse arquivo. Este trecho de código de um manifesto + demonstra como criar essa entrada: +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ Um aplicativo pode querer confiar em um conjunto personalizado de CAs em vez de no padrão + da plataforma. Os motivos mais comuns para isso são: +
+ ++ Por padrão, conexões seguras (por exemplo, TLS, HTTPS) de todos os aplicativos confiam + nas CAs pré-instaladas do sistema e os aplicativos direcionados ao nível da API 23 + (Android M) e inferior também confiam no repositório de CAs adicionadas pelo usuário por padrão. Um + aplicativo pode personalizar as próprias conexões usando {@code base-config} (para + personalização em todo o aplicativo) ou {@code domain-config} (para personalização + por domínio). +
+ + ++ Suponhamos que você queira se conectar a um host que use um certificado SSL autoassinado + ou a um host cujo certificado SSL foi emitido por uma CA não pública + na qual confia, como a CA interna da sua empresa. +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Adicione o certificado da CA autoassinada ou não pública em formato PEM ou DER em + {@code res/raw/my_ca}. +
+ + ++ Um aplicativo que não queira confiar em todas as CAs nas quais o sistema confia + pode especificar o próprio conjunto limitado de CAs confiáveis. Isso protege o + aplicativo contra certificados fraudulentos emitidos por qualquer outra CA. +
+ ++ A configuração para limitar o conjunto de CAs confiáveis é semelhante a confiar em uma CA personalizada para um domínio específico, mas + fornecendo várias CAs no recurso. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Adicione as CAs confiáveis em formato PEM ou DER em {@code res/raw/trusted_roots}.
+ Observe que, ao usar o formato PEM, o arquivo deve conter somente dados PEM,
+ sem texto adicional. Você também pode fornecer vários elementos
+ <certificates>
+em vez de um.
+
+ Um aplicativo pode querer confiar em CAs adicionais nas quais o sistema não confia. + Isso pode ocorrer se o sistema ainda não incluiu a CA ou se a CA + não atender aos requisitos de inclusão no sistema Android. O + aplicativo pode fazer isso ao especificar várias fontes de certificados para uma + configuração. +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ Ao depurar um aplicativo conectado por HTTPS, você pode querer + se conectar a um servidor de desenvolvimento local que não tenha o certificado SSL + do seu servidor de produção. Para fazer isso sem + modificar o código do aplicativo, você pode especificar CAs somente de depuração que + sejam confiáveis apenas quando +android:debuggable + for {@code true} ao usar {@code debug-overrides}. Normalmente, IDEs e ferramentas de compilação + definem esse sinalizador automaticamente para compilações de não lançamento. +
+ ++ Isso é mais seguro do que o código condicional normal, pois, como medida + de segurança, os repositórios do aplicativo não aceitam aplicativos marcados como + depuráveis. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ Aplicativos que pretendem se conectar a destinos usando apenas conexões + seguras podem cancelar o uso de texto simples de suporte (usando o protocolo HTTP não criptografado + em vez de HTTPS) para esses destinos. Essa opção ajuda a evitar + regressões acidentais em aplicativos devido a alterações nos URLs fornecidos por fontes externas, + como servidores de back-end. + Consulte {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()} para saber mais. +
+ ++ Por exemplo, um aplicativo pode querer garantir que todas as conexões com {@code + secure.example.com} sejam sempre realizadas por HTTPS para proteger o tráfego confidencial + de redes hostis. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ Normalmente, um aplicativo confia em todas as CAs pré-instaladas. Se qualquer uma dessas CAs + emitir um certificado fraudulento, o aplicativo estará em risco de ataques + MiTM. Alguns aplicativos optam por limitar o conjunto de certificados que aceitam + restringindo o conjunto de CAs ou fixando certificados. +
+ ++ A fixação de certificados é realizada ao fornecer um conjunto de certificados pelo hash da + chave pública (SubjectPublicKeyInfo do certificado X.509). Uma cadeia de certificados + é válida somente se contiver pelo menos uma + das chaves públicas fixadas. +
+ ++ Observe que, ao usar a fixação de certificados, você deve sempre incluir uma chave de backup + para que, se você for forçado a alternar para novas chaves ou alterar as CAs (ao + fixar um certificado de CA ou um intermediário dessa CA), a + conectividade do seu aplicativo não seja afetada. Caso contrário, você precisará enviar + uma atualização ao aplicativo para restaurar a conectividade. +
+ ++ Além disso, é possível definir um tempo de expiração para as fixações, após o qual + elas não sejam mais realizadas. Isso ajuda a evitar problemas de conectividade + em aplicativos que não foram atualizados. No entanto, definir um tempo de expiração + para fixações pode permitir que as fixações sejam ignoradas. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ Valores não definidos em uma configuração específica são herdados. Esse comportamento permite + configurações mais complexas, mantendo o arquivo de configuração legível. +
+ ++ Se um valor não for definido em uma entrada específica, o valor da próxima entrada + mais genérica será usado. Valores não definidos em um {@code domain-config} são + obtidos pelo {@code domain-config} pai, se aninhados, ou, caso contrário, pelo {@code + base-config}. Valores não definidos no {@code base-config} usam os + valores padrão da plataforma. +
+ ++ Por exemplo, considere um caso no qual todas as conexões para subdomínios de {@code + example.com} devem usar um conjunto personalizado de CAs. Além disso, o tráfego de texto simples para esses + domínios é permitido exceto ao se conectar com {@code + secure.example.com}. Ao aninhar a configuração para {@code + secure.example.com} dentro da configuração para {@code example.com}, o + {@code trust-anchors} não precisa ser duplicado. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ O recurso de configurações de segurança de rede usa um arquivo no formato XML. + A estrutura geral desse arquivo é mostrada no seguinte exemplo de código: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ As seções a seguir descrevem a sintaxe e outros detalhes do formato do + arquivo. +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
.
+
++ Qualquer valor não definido usa os valores padrão da plataforma. A configuração padrão + para aplicativos direcionados a níveis de API acima do 24: +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++A configuração padrão para aplicativos direcionados a níveis de API 23 e inferiores: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
aninhadosObserve que, se vários elementos {@code domain-config} cobrirem um destino, a configuração com a regra de domínio correspondente +mais específica (mais longa) será usada.
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ Especifica se as CAs dessa fonte ignoram a fixação de certificados. Se {@code + “true”} e forem certificadas cadeias de certificados que incluam uma das CAs dessa + fonte, a fixação não será realizada. Isso pode ser útil para depurar CAs + ou permitir que o usuário execute ataques MiTM no tráfego seguro do seu aplicativo. +
+ ++ O padrão é {@code "false"} a não ser que seja especificado em um elemento {@code debug-overrides} +. Nesse caso, o padrão será {@code "true"}. +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
para saber mais sobre o formato das fixações.
+ + A expiração ajuda a evitar problemas de conectividade em aplicativos que não + recebem atualizações para o conjunto de fixações, por exemplo, porque o usuário + desativou as atualizações do aplicativo. +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
Serviços de entrada de TV permitem que o usuário pause e retome a reprodução do canal por meio de +APIs de time-shifting. O Android N expande o time-shifting +ao permitir que o usuário salve várias sessões gravadas.
+ +Os usuários podem programar gravações antecipadamente ou iniciar uma gravação enquanto assistem a +um programa. Quando o sistema salvar a gravação, o usuário poderá navegar, gerenciar +e reproduzir a gravação usando o aplicativo de TV do sistema.
+ +Se quiser fornecer recursos de gravação para seu serviço de entrada de TV, +indique para o sistema que seu aplicativo oferece suporte a gravação, implemente +a capacidade de gravar programas, solucione e comunique erros ocorridos +durante a gravação e gerencie as sessões gravadas.
+ +Para informar ao sistema que seu serviço de entrada de TV oferece suporte a gravação, siga +estas etapas:
+ +TvInputService.onCreate()
, crie um novo objeto
+TvInputInfo
usando a classe TvInputInfo.Builder
+.TvInputInfo
, chame
+setCanRecord(true)
antes de chamar build()
para
+indicar que seu serviço oferece suporte a gravação.TvInputInfo
com o sistema chamando
+TvInputService.updateTvInputInfo()
.Depois que o serviço de entrada de TV registrar que oferece suporte ao recurso
+de gravação, o sistema chamará seu
+TvInputService.onCreateRecordingSession()
quando precisar acessar
+a implementação de gravação do seu aplicativo. Implemente sua própria subclasse
+TvInputService.RecordingSession
e retorne-a
+quando o retorno de chamada onCreateRecordingSession()
+for acionado. Essa subclasse é responsável por alternar para os dados de canal corretos,
+gravando os dados solicitados e comunicando o status de gravação e os erros ao
+sistema.
Quando o sistema chamar RecordingSession.onTune()
, passando um
+URI de canal, acesse o canal especificado pelo URI. Notifique o sistema de que
+seu aplicativo acessou o canal desejado ao chamar notifyTuned()
+ou, se o aplicativo não conseguiu acessar o canal correto, chame
+notifyError()
.
Em seguida, o sistema invoca o retorno de chamada RecordingSession.onStartRecording()
+. O aplicativo deve iniciar a gravação imediatamente. Quando o sistema invoca
+esse retorno de chamada, ele pode fornecer um URI que contenha informações sobre o programa
+que será gravado. Quando a gravação for concluída, você deverá copiar esses
+dados para a tabela de dados RecordedPrograms
.
Por fim, o sistema chama RecordingSession.onStopRecording()
.
+Nesse momento, o aplicativo deve interromper a gravação imediatamente. Também é preciso
+criar uma entrada na tabela RecordedPrograms
. Essa entrada deve
+incluir o URI dos dados da sessão gravada na coluna
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
e qualquer informação
+sobre o programa fornecida pelo sistema na chamada inicial em
+onStartRecording()
.
Para saber mais sobre como acessar a tabela RecordedPrograms
,
+consulte Gerenciar sessões gravadas.
Se um erro ocorrer durante a gravação, inutilizando os dados gravados,
+notifique o sistema chamando RecordingSession.notifyError()
.
+Também é possível chamar notifyError()
depois que uma sessão de gravação é
+criada para informar ao sistema que seu aplicativo não pode mais gravar sessões.
Se um erro ocorrer durante a gravação, mas você quiser fornecer uma gravação
+parcial que pode ser usada pelos usuários para reprodução, chame
+RecordingSession.notifyRecordingStopped()
para permitir que o sistema
+use a sessão parcial.
O sistema mantém as informações de todas as sessões gravadas de todos
+os aplicativos de canais com recursos de gravação na tabela de provedor de conteúdo TvContract.RecordedPrograms
+. Essas informações podem ser acessadas pelo URI de conteúdo
+RecordedPrograms.Uri
. Use APIs de provedores de conteúdos para
+ler, adicionar e excluir entradas dessa tabela.
Para saber mais sobre como trabalhar com dados de provedores de conteúdo, consulte + +Fundamentos do provedor de conteúdo .
+ +Dispositivos de TV podem ter armazenamento limitado, então tenha bom senso ao
+alocar armazenamento para salvar sessões gravadas. Use
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
quando
+não houver espaço suficiente para salvar uma sessão gravada.
Quando o usuário iniciar a gravação, comece a gravar os dados assim
+que possível. Para facilitar esse processo, realize qualquer tarefa demorada imediatamente,
+como acessar e alocar o espaço de armazenamento, quando o sistema invocar o retorno de chamada
+onCreateRecordingSession()
. Isso permite que você comece
+a gravar imediatamente após o acionamento do retorno de chamada onStartRecording()
+.
O Android N introduz o suporte aos recursos de linguagem do Java 8 + que podem ser usados ao desenvolver aplicativos direcionados ao Android N. + Esta página descreve os novos recursos de linguagem com suporte no Android N + Preview, como configurar seu projeto para usá-los e os + problemas conhecidos que você poderá encontrar. +
+ +Para começar a usar esses recursos, primeiro faça o download e instale o Android +Studio 2.1 (preview) e o Android N Preview SDK, que inclui a +cadeia de ferramentas Jack obrigatória e o Android Plugin for Gradle atualizado. Se você ainda não +instalou o Android N Preview SDK, consulte Preparação para desenvolver para o Android N.
+ + + ++ Observação: o uso dos novos recursos de linguagem do Java 8 não é + obrigatório para desenvolver aplicativos direcionados à plataforma Android N. Se + não quiser escrever código com os recursos de linguagem do Java 8, você poderá manter + os valores de compatibilidade de origem e destino do seu projeto definidos para o Java 7, mas ainda + será necessário compilar com o JDK 8 para desenvolver para a plataforma Android N. +
+ ++ Atualmente, o Android não oferece suporte a todos os recursos de linguagem do Java 8. No entanto, os + recursos a seguir agora estão disponíveis para o desenvolvimento de aplicativos direcionados ao + Android N Preview: +
+ ++ Além disso, as seguintes APIs de recursos de linguagem do Java 8 agora estão disponíveis: +
+ ++ Observação: o Android N baseia a implementação de + expressões lambda em classes anônimas. Essa abordagem permite que elas + sejam compatíveis e possam ser executadas em versões anteriores do Android. Para testar as + expressões lambda em versões mais antigas, lembre-se de acessar o arquivo {@code +build.gradle} e definir{@code compileSdkVersion} e {@code +targetSdkVersion} como 23 ou menos. +
+ ++ Para usar os novos recursos de linguagem do Java 8, você também deve usar a + nova cadeia de ferramentas Jack. Essa nova + cadeia de ferramentas Android compila o código-fonte de linguagem Java em um código de bytes dex que pode ser lido no Android +, tem o próprio formato de biblioteca {@code .jack} e fornece a maioria dos recursos + de uma cadeia de ferramentas em uma só ferramenta: reempacotamento, redução, ofuscação e + multidex. +
+ +Veja uma comparação entre duas cadeias de ferramentas usadas para compilar arquivos DEX Android:
++ Para ativar os recursos de linguagem do Java 8 e o Jack para seu projeto, insira + o seguinte no arquivo {@code build.gradle} específico do módulo: +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ O Instant Run, introduzido no Android Studio 2.0 (Beta), não funciona com o + Jack e será desativado enquanto a nova cadeia de ferramentas estiver em uso. +
+ +Como o Jack não gera arquivos de classe intermediária ao compilar um +aplicativo, ferramentas que dependem desses arquivos não funcionam com o Jack. Alguns +exemplos dessas ferramentas:
+ +Se encontrar outros problemas ao usar o Jack, envie um relatório de erros.
\ No newline at end of file diff --git a/docs/html-intl/intl/pt-br/preview/overview.jd b/docs/html-intl/intl/pt-br/preview/overview.jd new file mode 100644 index 000000000000..be4e43f5d76f --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=Visão geral do programa +page.metaDescription=Prepare seus aplicativos para a próxima versão do Android. +page.image=images/cards/card-n-overview_2x.png +meta.tags="preview", "developer", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ Bem-vindo ao Android N Developer Preview, um programa que + oferece tudo de que você precisa para testar e otimizar seus aplicativos para a próxima + versão do Android. Ele é gratuito e você pode começar imediatamente ao + fazer o download das ferramentas do N Developer Preview. +
+ + + + + + + ++ Execute e teste seus aplicativos em diversos dispositivos ou em um emulador. + +
++ Forneceremos atualizações mensais durante o Preview. Portanto, você testará de acordo com as alterações mais recentes da plataforma. +
++ Durante as primeiras semanas, nós daremos prioridade aos problemas informados + por desenvolvedores. Portanto, teste e forneça-nos feedback o quanto antes. +
++ Comece a trabalhar mais cedo para oferecer suporte aos novos comportamentos da plataforma e desenvolver seus aplicativos com novos recursos. +
++ Atualizações OTA eficientes para qualquer dispositivo compatível por meio do + programa beta do Android. Não é preciso atualizar manualmente. +
++ Informe problemas e envie feedback usando nosso +issue tracker. Conecte-se com outros + desenvolvedores na + Comunidade N Developer. +
++ O N Developer Preview será executado a partir de 3 de março de 2016 até o último lançamento público do Android N + para AOSP e OEMs, planejado para o terceiro trimestre de 2016. +
+ ++ Nos marcos mais importantes do desenvolvimento, fornecedores atualizações para seu ambiente de teste e + desenvolvimento. De modo geral, você pode esperar atualizações mensais (intervalo de + 4 a 6 semanas). Os marcos estão listados abaixo. +
+ ++ Cada atualização inclui ferramentas do SDK, imagens de sistema do Preview, emuladores, documentação de + referência e diferenças entre as APIs. +
+ ++ Os três primeiros marcos do Preview oferecem um ambiente + de teste e desenvolvimento antecipado para ajudar você a identificar + problemas de compatibilidade em seus aplicativos atuais e planejar a migração ou o trabalho em recursos + necessários para desenvolver para a nova plataforma. Esse é o período prioritário no qual você deve + fornecer feedback sobre os recursos e as APIs e informar problemas de compatibilidade + — para isso, use o issue + tracker. As APIs sofrerão algumas alterações nessas atualizações. +
+ ++ Nos Previews 4 e 5, você terá acesso às versões finais + das APIs e do SDK do N, com as quais poderá desenvolver, além de imagens de sistema quase finalizadas + para testar comportamentos e recursos do sistema. O Android N fornecerá uma API de nível + padrão no momento. Você poderá iniciar os testes finais de compatibilidade dos seus aplicativos + legados e refinar códigos novos que usem as APIs ou os recursos do N. +
+ ++ Também a partir do Preview 4, você poderá publicar aplicativos + para dispositivos que executem o Android N no nível da API oficial, como + dispositivos de consumidor que optaram pelo programa beta do Android. Será possível + publicar nos canais alfa e beta do Google Play primeiro para testar + seus aplicativos com clientes beta do Android antes de distribuir para os demais clientes + da loja. +
+ ++ Ao testar e desenvolver no Android N, recomendamos que você mantenha + o ambiente de desenvolvimento atualizado à medida que atualizações do Preview são + lançadas. Para facilitar o processo, você pode inscrever seus dispositivos de teste no + programa beta do Android e receber atualizações por OTA durante + cada marco. Como alternativa, imagens atualizadas do Preview estão disponíveis para + download e atualização manual. +
+ ++ Notificaremos você quando as atualizações do Preview estiverem disponíveis por meio do Android Developers Blog, além + deste site e da Comunidade + Android N Developer. +
+ + ++ O N Developer Preview inclui tudo o que é necessário para testar seus aplicativos existentes + em uma variedade de tamanhos de tela, tecnologias de rede, chipsets de CPU/GPU + e arquiteturas de hardware. +
+ +É possível fazer o download desses componentes pelo SDK Manager no Android Studio:
+ ++ Forneceremos atualizações para essas ferramentas de desenvolvimento em cada marco, conforme a necessidade. +
+ ++ O N Developer Preview inclui imagens do Nexus e de outros sistemas de hardware que podem ser usadas ao + testar e desenvolver em dispositivos físicos. Consulte a página Imagens de dispositivo para ver a lista completa + de imagens de hardware. +
+ ++ Forneceremos imagens de sistema atualizadas para esses dispositivos em cada marco. Você + pode fazer o download e atualizar as imagens de sistema manualmente + em seus dispositivos de teste com a frequência necessária. Isso é especialmente útil para ambientes + de teste automatizados nos quais seja preciso atualizar o dispositivo várias + vezes. +
+ +Observação: + dispositivos atualizados manualmente não receberão atualizações por OTA como no + Preview do ano anterior. Neste ano, você recebe OTAs ao inscrever os dispositivos no + programa beta do Android — veja detalhes na próxima seção. +
+ ++ Uma novidade do Android N é um programa de atualização por OTA que automaticamente + fornece as últimas atualizações do Preview do Android N diretamente para os dispositivos inscritos + no programa. O programa é gratuito e está aberto a todos que tenham + um dispositivo compatível registrado na conta do Google. +
+ ++ Para se inscrever no programa, acesse o site do programa beta do Android +. Você + verá uma lista de todos os dispositivos registrados em sua conta que estejam qualificados para inscrição no + programa beta do Android. +
+ ++ Seu dispositivo receberá uma atualização pouco tempo depois da inscrição. Na maioria dos casos, + não é necessário fazer uma redefinição completa para migrar para o Android N, mas + é recomendável fazer o backup de qualquer dado que você não queira perder antes de + inscrever o dispositivo. +
+ ++ Conforme as atualizações são enviadas ao seu dispositivo, recomendamos que elas sejam baixadas e + instaladas assim que possível. Mantenha-se atualizado com as + últimas mudanças na interface, no comportamento, nas APIs e nos recursos do sistema. +
+ ++ Quando o Developer Preview for concluído, os dispositivos inscritos + receberão uma atualização para a versão oficial do Android N. +
+ ++ É possível cancelar a inscrição dos seus dispositivos no programa beta do Android a qualquer momento no + site do programa. Antes de cancelar a inscrição, não deixe de fazer o backup dos dados + no dispositivo. +
+ +Observação: + ao cancelar a inscrição, seu dispositivo será redefinido para as configurações de fábrica +, recebendo a última versão + do Android 6.0 Marshmallow (não necessariamente a versão instalada + antes da inscrição do dispositivo). Para garantir uma instalação limpa, + seus dados serão apagados do dispositivo, incluindo contatos, mensagens, + fotos etc. +
+ ++ Estes recursos de documentação estão disponíveis no site do Developer Preview para + ajudar você a saber mais sobre o Android N: +
+ ++ Durante as primeiras atualizações do Preview, você pode fazer o download da + referência da API + mais recente para a plataforma Android N como um arquivo zip separado. Esse download + também inclui um relatório de diferenças que ajuda você a identificar as mudanças da API em relação à + API 23 e à atualização anterior. +
+ ++ Quando as APIs do Android N forem finalizadas e um nível de API oficial for atribuído, + forneceremos a referência da API on-line em https://developer.android.com. +
+ ++ Ao testar e desenvolver no N Developer Preview, use estes canais para + informar problemas e enviar feedback. +
+ +
+ O N Developer Preview fornece um sistema apenas para desenvolvimento e uma biblioteca Android
+ que não tem um nível de API padrão. Se desejar
+ optar por não utilizar comportamentos de compatibilidade para testar seu aplicativo (o que é altamente
+ recomendável), será possível direcionar seus esforços para a versão Preview do Android N ao definir
+ o targetSdkVersion
+ do seu aplicativo para “N”
.
+
+ O Android N Developer Preview fornece APIs do Preview + — as APIs não serão oficiais até o lançamento do SDK final, + atualmente planejado para o terceiro trimestre de 2016. Isso significa que você pode + esperar pequenas mudanças na API ao longo do tempo, especialmente durante + as semanas iniciais do programa. Forneceremos um resumo das alterações com + cada atualização do Android N Developer Preview. +
+ ++ Observação: apesar de as APIs do Preview poderem ser alteradas, os + comportamentos essenciais do sistema são estáveis e estão prontos para + serem testados. +
+ ++ O Google Play impede a publicação de aplicativos direcionados ao N Developer + Preview. Quando o SDK final do Android N estiver disponível, você poderá + direcionar seus esforços para o nível de API oficial do Android N e publicar seu aplicativo no Google + Play pelos canais de lançamento alfa e beta. Enquanto isso, caso queira + distribuir um aplicativo direcionado ao Android N para testadores, poderá fazê-lo por e-mail ou + por download direto pelo seu site. +
+ ++ No lançamento completo do Android N para AOSP e OEMs, planejado para o terceiro trimestre de 2016, + você poderá publicar seus aplicativos direcionados ao Android N no canal de lançamento + público do Google Play. +
+ + ++ Para começar o teste do seu aplicativo com o Android N: +
+ ++ Agradecemos sua participação no programa Android N Developer Preview! +
diff --git a/docs/html-intl/intl/pt-br/preview/samples.jd b/docs/html-intl/intl/pt-br/preview/samples.jd new file mode 100644 index 000000000000..c4c421f08dff --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=Exemplos +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ Os exemplos de código a seguir são fornecidos para o Android N. Para + fazer o download dos exemplos no Android Studio, selecione a opção de menu File > Import + Samples. +
+ ++ Observação: estes projetos disponíveis para download foram criados + para uso com o Gradle e o Android Studio. +
+ + ++ Este exemplo demonstra como aproveitar as vantagens de interfaces de usuário com várias janelas + com seu aplicativo. +
++ +Obter no GitHub +
+ + ++ Este é um exemplo pré-existente que mostra um serviço simples que envia + notificações usando NotificationCompat. Cada conversa não lida de um usuário + é enviada como uma notificação distinta. +
++ Este exemplo foi atualizado para utilizar os novos recursos de notificação + disponíveis no Android N. +
++ +Obter no GitHub +
+ + ++ Este é um exemplo pré-existente que demonstra como usar o + NotificationManager para identificar quantas notificações um aplicativo está mostrando + no momento. +
++ Este exemplo foi atualizado para utilizar os novos recursos de notificação + disponíveis no Android N. +
++ +Obter no GitHub +
+ + ++ Este exemplo demonstra como armazenar e acessar dados no armazenamento criptografado de um dispositivo + que está sempre disponível enquanto o dispositivo é inicializado. +
++ +Obter no GitHub +
+ + ++ Este exemplo demonstra como ler e gravar dados de diretórios + específicos exigindo menos permissões. +
++ +Obter no GitHub +
\ No newline at end of file diff --git a/docs/html-intl/intl/pt-br/preview/setup-sdk.jd b/docs/html-intl/intl/pt-br/preview/setup-sdk.jd new file mode 100644 index 000000000000..4766a88251c8 --- /dev/null +++ b/docs/html-intl/intl/pt-br/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=Configurar o Preview +meta.keywords="preview", "android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +Para desenvolver aplicativos para o Android N Preview, você precisa fazer algumas atualizações +no ambiente de desenvolvedor, conforme é descrito nesta página.
+ +Para simplesmente testar a compatibilidade do seu aplicativo na imagem do sistema +Android N, siga o guia para Testar em um dispositivo Android N.
+ + + + +A plataforma Android N adiciona suporte para os recursos de linguagem do Java 8, +que exigem um novo compilador chamado Jack. A versão mais recente do Jack +só é compatível com o Android Studio 2.1 no momento. Portanto, se quiser +usar os recursos de linguagem do Java 8, será preciso usar o Android Studio 2.1 para +compilar seu aplicativo. Caso contrário, não será preciso usar o Jack, mas ainda será +necessário atualizar para o JDK 8 para desenvolver para a plataforma Android N, +conforme é descrito abaixo. +
+ + + +No momento, o Android Studio 2.1 está disponível como prévia no canal da versão canary +. Se já tiver +o Android Studio e não quiser atualizar para o canal canary, poderá +fazer o download do Android Studio 2.1 como uma instalação separada e usá-lo +para desenvolvimento com o Android N, não afetando o ambiente principal do Android Studio +.
+ +Para fazer o download do Android Studio 2.1 como uma instalação separada, siga as etapas +abaixo (ou, se quiser receber o Android Studio 2.1 como uma atualização da sua +instalação existente, pule para a etapa 4):
+ +Mantenha essa janela aberta para a próxima etapa.
+ + +Para começar a desenvolver com as APIs do Android N, instale o +Android N Preview SDK no Android Studio da seguinte maneira:
+ ++ Informações detalhadas sobre as APIs do Android N são disponibilizadas na documentação de referência do N Preview +, que pode ser baixada pela tabela a seguir. + Este pacote contém uma versão off-line resumida do site de desenvolvedores do Android + e inclui uma referência atualizada para as APIs do Android N, além de um relatório + das diferenças entre as APIs. +
+ +Documentação | +Checksums | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
Устройство | +Файлы для загрузки и контрольные суммы | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ Удаление предварительной версии с устройства можно выполнить одним из +следующих способов.
++ Устройство будет получать по беспроводной связи последнюю версию +Android, доступную для устройства (например, Android 6.0 Marshmallow). + Для обновления требуется полный сброс настроек устройства в целях удаления с устройства +всех данных пользователя. Поэтому перед отменой регистрации устройства выполните резервное копирование наиболее важных данных. + +
+Примечание. +Удаление системного образа Developer Preview до +завершения программы требует полного сброса настроек устройства и приводит к удалению всех данных пользователя +на этом устройстве. +
+ + +Чтобы использовать эмулятор Android для запуска Android N Preview, необходимо +загрузить Android N Preview SDK и создать виртуальное устройство для +эмулятора.
+ +Сначала загрузите Android N Preview SDK, сделав это следующим образом (если вы получили его +во время настройки +в целях разработки для Android N, этот шаг можно пропустить). + +
У вас должны быть пакеты Android SDK Built-Tools 24.0 0 rc1, +Platform-Tools 24.0.0 rc1 и SDK Tools +25.0.9. Если вы не обновите SDK Tools до версии 25.0.9, вы не сможете +запустить системный образ x86_64 для Android N.
+ + +Теперь необходимо создать виртуальное устройство с системным образом Android N.
+ +Теперь можно запустить эмулятор Android с Android N Preview AVD.
+ ++Для обеспечения эффективной работы эмулятора Android установите +Android Studio 2.1 Preview с поддержкой Android Emulator 2.0 Beta, +который обеспечивает более высокую производительность по сравнению с эмулятором в +Android Studio 1.5.
+ +Примечание. +Если вы используете Android Studio 2.0 Beta, в нем есть известная неисправность, +которая не позволяет создавать AVD с системными образами N Preview, поэтому вам потребуется +использовать Android Studio 2.1 Preview для создания AVD. +
+ +Для получения дополнительной информации о создании виртуальных устройств см. страницу Управление виртуальными устройствами. +
+ + + + + + + + + + + + + + ++ Фоновые процессы могут потреблять много памяти и заряда аккумулятора. Например, +неявное широковещательное сообщение может запускать множество фоновых процессов, +которые его прослушивают, даже если они сами не выполняют полезной работы. Это +может значительно снизить производительность устройства и быстродействие пользовательского интерфейса. +
+ ++ Чтобы устранить подобные проблемы, в N Developer Preview применяются следующие +ограничения. +
+ ++ Платформа Android предоставляет несколько решений, позволяющих отказаться +от таких неявных рассылок. Например, в {@link android.app.job.JobScheduler} +и +{@code GcmNetworkManager} реализованы надежные механизмы для планирования сетевых +операций, которые запускаются при выполнении определенных условий, таких как наличие безлимитной +сети. Теперь вы также можете использовать {@link android.app.job.JobScheduler} +, чтобы реагировать на изменения поставщиков контента. В объектах {@link android.app.job.JobInfo} +инкапсулированы параметры, которые {@link android.app.job.JobScheduler} +использует для планирования заданий. Если условия задания выполнены, система +выполняет его через {@link android.app.job.JobService} вашего приложения. +
+ ++ Здесь мы рассмотрим, как использовать альтернативные методы, такие как +{@link android.app.job.JobScheduler}, для адаптации приложения к новым +ограничениям. +
+ ++ Приложения для N Developer Preview не получают широковещательные сообщения {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION}, если они +зарегистрированы для их получения в своем манифесте. При этом процессы, которые зависят от этого +широковещательного сообщения, не запускаются. Это может вызвать проблемы для приложений, которым необходимо +прослушивать изменения сети или выполнять +массовые сетевые операции, когда устройство подключается к безлимитной сети. Платформа Android уже предоставляет ряд способов обойти +это ограничение, но выбор нужного метода +зависит от того, чего вы хотите добиться от приложения. +
+ ++ Примечание. Объект {@link android.content.BroadcastReceiver}, зарегистрированный с помощью метода +{@link android.content.Context#registerReceiver Context.registerReceiver()}, +продолжает получать такие рассылки, если приложение работает в активном режиме. +
+ ++ При использовании класса {@link android.app.job.JobInfo.Builder JobInfo.Builder} для создания +объекта {@link android.app.job.JobInfo} примените метод {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} и передайте {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} в качестве параметра задания. В следующем примере кода +служба запускается, если устройство подключается к безлимитной +сети и заряжается: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ Если условия задания выполнены, приложение получает обратный вызов для запуска +метода {@link android.app.job.JobService#onStartJob onStartJob()} в указанном +классе {@code JobService.class}. Другие примеры реализации {@link + android.app.job.JobScheduler} см. в примере приложения JobScheduler. +
+ ++ В приложениях, использующих службы GMSCore и предназначенных для Android 5.0 (уровень API 21) +или предыдущих версий, можно воспользоваться + {@code GcmNetworkManager} и указать {@code Task.NETWORK_STATE_UNMETERED}. +
+ ++ Приложения в активном режиме по-прежнему могут прослушивать {@code + CONNECTIVITY_CHANGE} с помощью зарегистрированного объекта {@link + android.content.BroadcastReceiver}. Однако в API-интерфейсе {@link + android.net.ConnectivityManager} есть более надежный метод для запроса +обратного вызова только при выполнении указанных сетевых условий. +
+ ++ В объектах {@link android.net.NetworkRequest} параметры +сетевого обратного вызова задаются с помощью {@link android.net.NetworkCapabilities}. Объекты {@link android.net.NetworkRequest} создаются +с использованием класса {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder}. Затем метод {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} + передает объект {@link android.net.NetworkRequest} системе. Если +сетевые условия выполнены, приложение получает обратный вызов для выполнения метода + {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()}, определенного в своем классе {@link + android.net.ConnectivityManager.NetworkCallback}. +
+ ++ Приложение продолжает получать обратные вызовы, пока оно не будет закрыто или не будет вызван метод + {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()}. +
+ ++ В N Developer Preview приложения не могут отправлять или получать широковещательные сообщения {@link + android.hardware.Camera#ACTION_NEW_PICTURE} и {@link + android.hardware.Camera#ACTION_NEW_VIDEO}. Это ограничение + позволяет улучшить производительность, если для обработки нового изображения или видео должны + активироваться несколько приложений. N Developer Preview + расширяет классы {@link android.app.job.JobInfo} и {@link + android.app.job.JobParameters}, что дает разработчикам альтернативное решение. +
+ ++ Для активации заданий при изменении URI контента в N Developer Preview + были добавлены следующие методы для API-интерфейса {@link android.app.job.JobInfo}. +
+ ++ Примечание. Метод {@code TriggerContentUri()} не может использоваться + вместе с {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} или {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()}. Чтобы непрерывно отслеживать изменения контента, запланируйте новый объект задания + {@link android.app.job.JobInfo}, прежде чем {@link + android.app.job.JobService} завершит обработку последнего обратного вызова. +
+ ++ В следующем примере кода планируется задание, которое активируется, когда система сообщает + об изменении URI контента {@code MEDIA_URI}: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ Если система сообщает об изменении указанных URI контента, приложение + получает обратный вызов, а объект {@link android.app.job.JobParameters} передается + методу {@link android.app.job.JobService#onStartJob onStartJob()} + в {@code MediaContentJob.class}. +
+ ++ В N Developer Preview также расширен класс {@link android.app.job.JobParameters}, чтобы + приложения могли получать полезные сведения о том, какие источники контента + и URI инициировали задание. +
+ ++ В следующем примере кода перегружается метод {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} и + записываются источники и URI контента, вызвавшие задание: +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ Оптимизация приложений для устройств с малым объемом памяти + или для условий с ограниченным объемом памяти помогает улучшить производительность и удобство работы пользователей. Удаление + зависимостей от фоновых служб и статически зарегистрированных приемников неявных широковещательных сообщений + способно помочь приложению более эффективно работать на таких устройствах. Хотя + на платформе N Developer Preview приняты меры для устранения некоторых из этих проблем, + рекомендуется оптимизировать приложения, полностью отказавшись + от подобных фоновых процессов. +
+ ++ В N Developer Preview представлен ряд дополнительных команд Android Debug Bridge (ADB), с помощью + которых можно тестировать поведение приложения с отключенными фоновыми процессами. +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N работает в защищенном режиме Direct Boot, когда +устройство было включено, но не разблокировано пользователем. + Для поддержки такого режима работы в системе имеется два хранилища данных:
+ +По умолчанию в режиме Direct Boot приложения не работают. +Если вашему приложению требуется выполнять какие-то действия в режиме Direct Boot, вы можете зарегистрировать +компоненты приложения, которые должны быть запущены в этом режиме. Некоторые распространенные примеры использования +приложений, выполняющих операции в режиме Direct Boot:
+ +Если вашему приложению требуется доступ к данным в режиме Direct Boot, используйте +шифрованное хранилище устройства. Шифрованное хранилище устройства содержит данные, +зашифрованные с помощью ключа, доступного только после +успешной подтвержденной загрузки устройства.
+ +Если данные следует шифровать с помощью ключа, связанного с учетными данными +пользователя (например, с PIN-кодом или паролем), используйте хранилище, требующее ввода учетных данных. +Такое хранилище доступно только после успешной +разблокировки устройства пользователем и до тех пор, пока пользователь не перезапустит устройство. Если +пользователь включает экран блокировки после разблокировки устройства, шифрованное хранилище, +требующее ввода учетных данных, не блокируется.
+ +Прежде
+чем работать в режиме Direct Boot или получать доступ к шифрованному
+хранилищу устройства, приложения должны зарегистрировать свои компоненты в системе. Приложения регистрируются в системе, помечая компоненты как
+поддерживающие шифрование. Чтобы пометить компонент как поддерживающий шифрование, нужно установить для атрибута
+android:encryptionAware
в манифесте значение true.
+ +
Компоненты, поддерживающие шифрование, можно регистрировать для получения
+LOCKED_BOOT_COMPLETED
широковещательных сообщений от
+системы после перезапуска устройства. В этот момент шифрованное хранилище устройства
+доступно, и компонент может выполнять необходимые задачи в режиме
+Direct Boot, например, включать будильник по расписанию.
В следующем фрагменте кода приведен пример регистрации компонента
+{@link android.content.BroadcastReceiver} как поддерживающего шифрование и добавления
+фильтра намерения LOCKED_BOOT_COMPLETED
в манифест приложения:
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
После разблокировки устройства пользователем все компоненты имеют доступ к шифрованному хранилищу устройства +и к шифрованному хранилищу, требующему ввода учетных данных.
+ +Для получения доступа к шифрованному хранилищу устройства следует создать второй экземпляр
+{@link android.content.Context} посредством вызова
+Context.createDeviceEncryptedStorageContext()
. Все вызовы API
+системы хранения данных с использованием этого контекста получают доступ к шифрованному хранилищу устройства. В
+следующем примере показано, как получить доступ к шифрованному хранилищу устройства и открыть существующий
+файл данных приложения:
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
Шифрованное хранилище устройства следует использовать только для +информации, которая должна быть доступна в режиме Direct Boot. +Шифрованное хранилище устройства не следует использовать в качестве шифрованного хранилища общего назначения. +Для хранения данных пользователя или шифрованных данных, которые не требуются в режиме +Direct Boot, следует использовать шифрованное хранилище, требующее ввода учетных данных.
+ +Когда после перезагрузки устройства пользователь разблокирует его, ваше приложение может переключиться на +шифрованное хранилище, требующее ввода учетных данных, и использовать обычные системные службы, +зависящие от учетных данных пользователя.
+ +Чтобы приложение получало уведомления о разблокировке устройства пользователем после перезагрузки,
+необходимо зарегистрировать {@link android.content.BroadcastReceiver} работающего компонента
+для отслеживания сообщения ACTION_USER_UNLOCKED
. Также приложение может
+получать существующее сообщение {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED}, которое теперь указывает, что устройство загружено и разблокировано
+пользователем.
Приложение может направлять запрос напрямую, если пользователь разблокирует устройство посредством вызова
+UserManager.isUserUnlocked()
.
Если пользователь обновит свое устройство для использования режима Direct Boot, вашему приложению может потребоваться перенести
+имеющиеся данные в шифрованное хранилище устройства. Используйте
+Context.migrateSharedPreferencesFrom()
и
+Context.migrateDatabaseFrom()
для переноса данных о настройках и содержимого баз данных
+между шифрованным хранилищем, требующим ввода учетных данных, и шифрованным хранилищем устройства.
Хорошо обдумайте, какие данные следует перенести из +шифрованного хранилища, требующего ввода учетных данных, в шифрованное хранилище устройства. Не следует переносить в +шифрованное хранилище устройства личные данные пользователя, такие как +пароли или токены авторизации. В некоторых случаях вашему приложению может потребоваться работать +с отдельными наборами данных в двух шифрованных хранилищах.
+ +Протестируйте свое приложение с поддержкой шифрования в новом режиме Direct Boot. Существуют +два способа включить режим Direct Boot.
+ +Внимание! При включении режима Direct Boot +с устройства удаляются все данные пользователя.
+ +Чтобы включить режим +Direct Boot на поддерживаемых устройствах с Android N, выполните одну из следующих последовательностей действий.
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
Если вам требуется переключать +режимы на тестовых устройствах, вы можете использовать эмуляцию режима Direct Boot. Режим эмуляции следует использовать только для целей +разработки, в нем возможна потеря данных. Чтобы включить эмуляцию режима Direct Boot, +установите режим блокировки устройства, выберите пункт "No thanks", если система предлагает открыть +защищенный экран запуска при установке режима блокировки, а затем используйте +следующую команду оболочки adb:
+ ++$ adb shell sm set-emulate-fbe true ++ +
Для отключения эмуляции режима Direct Boot нужно использовать следующую команду:
+ ++$ adb shell sm set-emulate-fbe false ++ +
При использовании этих команд устройство перезагружается.
diff --git a/docs/html-intl/intl/ru/preview/features/icu4j-framework.jd b/docs/html-intl/intl/ru/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..8d92dd4fd193 --- /dev/null +++ b/docs/html-intl/intl/ru/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=API-интерфейсы ICU4J в платформе Android + +@jd:body + ++ ICU4J — широко используемый набор библиотек Java с открытым кодом, обеспечивающий для приложений поддержку формата Unicode +и глобализации. Android N +открывает в платформе Android частичный набор API-интерфейсов ICU4J, который разработчики приложений +могут использовать в составе пакета {@code android.icu}. Эти API используют +данные локализации, присутствующие на устройстве. Это позволяет уменьшить размеры APK +, не компилируя библиотеки ICU4J в APK, а +просто вызывая их в платформе. (В этом случае может оказаться удобно предоставлять +несколько версий +вашего APK, чтобы пользователи с версиями Android ниже Android N +могли загружать версию приложения, содержащую библиотеки ICU4J.) +
+ ++ В начале этого документа предоставляется базовая информация по минимальным уровням +Android API, которые требуются для поддержки этих библиотек. Далее приводятся необходимые пояснения +о реализации ICU4J в Android. В заключение +в нем рассказывается, как использовать API-интерфейсы ICU4J в платформе Android. +
+ +
+ В Android N частичный набор API-интерфейсов ICU4J открывается через пакет
+ android.icu
, а не через com.ibm.icu
. Для платформы
+Android может быть принято решение не
+открывать API-интерфейсы ICU4J по различным причинам. Например, Android N не открывает
+некоторые устаревшие API-интерфейсы, а также те, которые рабочая группа ICU еще не объявила
+стабильными. По мере того, как рабочая группа ICU будет объявлять API-интерфейсы устаревшими, они будут так же помечаться и в Android,
+но при этом будут и дальше входить в состав платформы.
+
Уровень Android API | +Версия ICU | +Версия CLDR | +
---|---|---|
Android N | +56 | +28 | +
Следует отметить несколько важных моментов:
+ +
+ Если вы уже используете в своем приложении API-интерфейсы ICU4J, и если API
+ android.icu
соответствуют вашим требованиям, то для перехода на
+API-интерфейсы платформы вам нужно будет изменить импорт Java
+с com.ibm.icu
на android.icu
. После этого вы сможете
+удалить свои копии файлов ICU4J из APK.
+
+ Примечание. API-интерфейсы ICU4J в платформе используют пространство имен {@code android.icu} +вместо {@code com.ibm.icu}. Это позволяет избежать конфликтов пространств имен +в пакетах APK, содержащих собственные библиотеки {@code com.ibm.icu}. +
+ +
+ Некоторые классы в пакетах java
и android
имеют
+эквиваленты в ICU4J. Однако ICU4J обычно обеспечивает более широкую
+поддержку стандартов и языков.
+
Ниже приведены несколько примеров для начала работы:
+Класс | +Альтернативы | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J выпускается по лицензии ICU. Более подробную информацию можно найти в Руководстве пользователя +ICU. +
diff --git a/docs/html-intl/intl/ru/preview/features/multi-window.jd b/docs/html-intl/intl/ru/preview/features/multi-window.jd new file mode 100644 index 000000000000..f1a8ea603ddd --- /dev/null +++ b/docs/html-intl/intl/ru/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=Поддержка многооконного режима +page.metaDescription=Новые возможности в Android N для одновременного отображения нескольких приложений. +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ В Android N добавлена поддержка отображения нескольких приложений + одновременно. На мобильных устройствах два приложения могут быть запущены рядом + или друг над другом в режиме разделения экрана. На телевизорах приложения могут + использовать режим "картинка в картинке", чтобы воспроизводить видео, + пока пользователи работают с другим приложением. +
+ ++ Если вы создаете приложение с использованием N Preview SDK, вы можете указать, как оно + будет действовать в многооконном режиме. Например, можно задать минимальные + допустимые размеры окна приложения. Также можно отключить многооконный режим для приложения, + чтобы оно отображалось только в полноэкранном + режиме. +
+ ++ В Android N несколько приложений могут одновременно находиться на экране. Например, + пользователь может разделить экран, чтобы просматривать веб-страницу + слева и писать сообщение электронной почты справа. Возможности пользователя зависят от + устройства. +
+ ++ Пользователь может перейти в многооконный режим следующими способами. +
+ ++ Пользователи могут перетаскивать +данные между окнами операций в режиме + совместного отображения. (Ранее перетаскивать данные можно было только в рамках + одной операции). +
+ ++ Многооконный режим не меняет жизненный + цикл операции. +
+ ++ В этом режиме в каждый момент времени активной + является только последняя операция, с которой взаимодействовал пользователь. Такая операция считается самой верхней. + Все другие операции приостановлены, даже если они отображаются. + Однако система отдает приостановленным, но видимым операциям более + высокий приоритет, чем невидимым. Если пользователь взаимодействует с + одной из приостановленных операций, она возобновляется, а прежняя самая верхняя + операция приостанавливается. +
+ ++ Примечание. В многооконном режиме приложение может быть приостановлено + и по-прежнему видимо для пользователя. Приложению может потребоваться + продолжать свои операции, даже если оно приостановлено. Например, видимое приостановленное приложение, + воспроизводящее видео, будет по-прежнему показывать видео. Поэтому + мы не рекомендуем приостанавливать воспроизведение + в обработчиках {@link android.app.Activity#onPause onPause()} таких приложений. + Вместо этого следует приостановить видео в {@link android.app.Activity#onStop + onStop()} и возобновить воспроизведение в {@link android.app.Activity#onStart + onStart()}. +
+ ++ Если пользователь переводит приложение в многооконный режим, система + уведомляет операцию об изменении конфигурации, как указано в документе Обработка изменений + во время выполнения. По сути это изменение так же действует +на жизненный цикл операции, как уведомление приложения системой +о переходе устройства из вертикальной ориентации в + горизонтальную, только изменяются размеры экрана, а не ориентация. Как описано в документе Обработка изменений + во время выполнения, операция может обработать изменение + конфигурации самостоятельно или может позволить системе + удалить окно операции и создать его заново с новыми размерами. +
+ +
+ Если пользователь увеличивает одну из сторон окна, система меняет
+ размер окна операции в соответствии с действием пользователя и применяет изменения в режиме выполнения
+ по мере необходимости. Если приложение не успевает отрисовать новые области, система
+ временно заполняет их цветом, заданным атрибутом {@link
+ android.R.attr#windowBackground windowBackground} или атрибутом стиля
+ windowBackgroundFallback
по умолчанию.
+
+ Если ваше приложение предназначено для Android N, вы + можете указать, каким образом поддерживают (и поддерживают ли) операции вашего приложения многооконный режим. Атрибуты управления размером и макетом устанавливаются + в манифесте. + Настройки атрибутов корневой операции применяются + ко всем операциям в ее стеке задач. +
+ ++ Примечание. Если приложение с поддержкой различной + ориентации было создано с версией SDK, + более ранней, чем Android N, и пользователь запустит это приложение в многооконном режиме, система принудительно изменит размер приложения. Система отображает диалоговое окно + с предупреждением о том, что приложение может работать непредвиденным образом. Система + не меняет размер окна для приложений с + фиксированной ориентацией. Если пользователь попытается открыть такое приложение + в многооконном режиме, оно займет весь экран. +
+ +
+ Установите этот атрибут в узле <activity>
или
+ <application>
манифеста, чтобы включить или отключить многооконный
+ режим:
+
+android:resizeableActivity=["true" | "false"] ++ +
+ Если для этого атрибута задано значение true, операцию можно запускать + в режимах разделения экрана и произвольной формы. Если для атрибута задано значение false, + операция не поддерживает многооконный режим. Если значение равно false и + пользователь пытается запустить операцию в многооконном режиме, она + занимает весь экран. +
+ ++ Если приложение предназначено для Android N, но +значение для этого атрибута не было указано, то по умолчанию используется значение true. +
+ +
+ Установите этот атрибут в узле <activity>
манифеста,
+ чтобы указать, поддерживает ли операция режим "картинка в картинке". Этот
+ атрибут не принимается во внимание, если для android:resizeableActivity
установлено значение false.
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ В Android N элемент манифеста <layout>
поддерживает
+ несколько атрибутов, которые определяют поведение
+ операции в многооконном режиме.
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + В следующем примере кода показано, как задать размер и + позицию окна операции по умолчанию, а также ее минимальный размер в + режиме произвольной формы: +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N предоставляет новые возможности для поддержки + приложений в многооконном режиме. +
+ ++ Некоторые возможности отключены или игнорируются в многооконном + режиме, потому что они не имеют смысла для операции, которая отображается + на экране устройства одновременно с другими операциями или приложениями. Ниже приведены примеры таких возможностей. + +
android:screenOrientation
.
+ + Для поддержки многооконного режима в класс {@link android.app.Activity} + были добавлены следующие методы. Подробнее о каждом из них см. в + справочнике по N Preview SDK. +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ Примечание. Режим "картинка в картинке" — это частный
+ случай многооконного режима. Если метод myActivity.inPictureInPicture()
+ возвращает значение true, myActivity.inMultiWindow()
также возвращает
+ true.
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ Также существуют версии {@link android.app.Fragment} для этих методов,
+например, Fragment.inMultiWindow()
.
+
+ Чтобы перевести операцию в режим "картинка в картинке",
+ вызовите новый метод Activity.enterPictureInPicture()
. Этот метод игнорируется, если
+ устройство не поддерживает режим "картинка в картинке". Дополнительная информация содержится в документации
+ Режим "картинка в картинке".
+
+ При запуске новой операции можно сообщить системе, что окно новой
+ операции следует показать рядом с текущим, если это возможно. Для этого
+ используйте флаг
+ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
. Этот
+ флаг запрашивает следующее поведение.
+
+ Если при запуске
+ новой операции устройство находится в режиме произвольной формы, вы можете задать размеры и позицию окна новой операции,
+ вызвав метод ActivityOptions.setLaunchBounds()
. Этот метод игнорируется, если
+ устройство не находится в многооконном режиме.
+
+ Примечание. Если запустить операцию в стеке задач, + она заменит операцию на экране, унаследовав все ее + свойства многооконного режима. Чтобы запустить новую операцию в отдельном + окне в многооконном режиме, ее следует запустить в новом стеке задач. +
+ ++ Пользователи могут перетаскивать данные + между окнами операций в режиме + совместного отображения. (Ранее перетаскивать данные можно было только в рамках + одной операции). Поэтому вы можете реализовать функции перетаскивания + в своем приложении, если оно еще их не поддерживает. +
+ +
+ В N Preview SDK пакет android.view
+ расширен для поддержки перетаскивания между приложениями. Дополнительная информация о нижеприведенных классах
+ и методах содержится в справочнике по N
+ Preview SDK.
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
. Если вам нужно предоставить принимающей операции разрешения на чтение или запись URI,
+ передайте новый флаг
+ View.DRAG_FLAG_GLOBAL_URI_READ
или
+ View.DRAG_FLAG_GLOBAL_URI_WRITE
соответственно.
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + Независимо от того, обновляете ли вы свое приложение для Android N, вам необходимо + подтвердить его поведение в многооконном + режиме на тот случай, если пользователь попытается запустить его в этом режиме на устройстве с Android N. +
+ ++ Если установить Android N на устройстве, режим разделения + экрана будет поддерживаться автоматически. +
+ ++ Если вы не применяли N Preview SDK для создания приложения и пользователь + попытается запустить его в многооконном режиме, система принудительно + изменит размер окна приложения, если его ориентация не зафиксирована. +
+ ++ Если для приложения не задана фиксированная ориентация, вам + следует запустить его на устройстве с Android N и попытаться + перевести его в режим разделения экрана. Убедитесь, что приложение + работает нормально после принудительного изменения размера. +
+ ++ Если для приложения задана фиксированная ориентация, попытайтесь + перевести его в многооконный режим. Убедитесь, что при этом + приложение остается в полноэкранном режиме. +
+ ++ Если вы использовали N Preview SDK для создания приложения и не + отключили поддержку многооконного режима, проверьте работу + приложения, как описано далее, в режимах разделения экрана и произвольной формы. +
+ ++ Для проверки производительности приложения в многооконном режиме + выполните следующие операции. Попытайтесь выполнить их в режиме разделения экрана и + в многооконном режиме, если не указано иное. +
+ +
+ Если вы отключили поддержку многооконного режима,
+ установив атрибут android:resizableActivity="false"
, запустите
+ приложение на устройстве с Android N и
+ попытайтесь перевести его в режимы произвольной формы и разделения экрана. Убедитесь, что при этом
+ приложение остается в полноэкранном режиме.
+
Android N обеспечивает расширенную поддержку многоязычных пользователей, +позволяя им выбирать в настройках из нескольких языковых стандартов. Эта возможность реализована в Android N +за счет значительного увеличения числа поддерживаемых языковых стандартов +и изменения способа разрешения ресурсов в системе. Новый метод разрешения +ресурсов более надежен и разработан с учетом совместимости с существующими APK. Тем не менее, +при его использовании следует очень внимательно следить за признаками непредвиденного поведения приложения. Например, при его использовании +следует провести тесты и убедиться, что приложение по умолчанию использует ожидаемый язык. Если +ваше приложение поддерживает несколько языков, нужно убедиться, что поддержка работает +ожидаемым образом. Также следует попытаться обеспечить корректную работу приложения с +языками, поддержка которых не предусматривалась явным образом в его коде.
+ +В начале этого документа рассказывается о стратегии разрешения ресурсов, которая использовалась до появления +Android N. Далее в нем описывается улучшенная стратегия +разрешения ресурсов в Android N. В последней части документа рассказывается о том, как использовать +дополнительные языковые стандарты для поддержки большего числа многоязычных пользователей.
+ +До выпуска Android N в Android не всегда удавалось успешно сопоставлять + языковые стандарты приложений и системы. Допустим, по умолчанию в вашем приложении используется английский язык + (США), но оно также содержит строки на испанском, локализованные в файлах ресурсов {@code es_ES}. +
+В коде Java разрешение языков строк происходило следующим +образом:
+Проблемы с разрешением возникали из-за того, что система удаляла код страны + из строки языкового стандарта при отсутствии точного совпадения. Например:
+ +Пользовательские настройки | +Ресурсы приложения | +Разрешение ресурсов | +
---|---|---|
fr_CH | +
+по умолчанию (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Попытка использования fr_CH => Отказ +Попытка использования fr => Отказ +Использование языка по умолчанию (en) + |
+
В этом примере система отображает строки на английском, +не зная, понимает ли пользователь английский язык. Такое поведение приложений сейчас довольно +распространено. С выпуском Android N подобные ситуации +будут возникать намного реже.
+ +В Android N используется более надежная система разрешения ресурсов,
+которая автоматически находит более подходящие альтернативные варианты. Однако для ускорения процесса разрешения и упрощения
+ обслуживания ресурсы следует хранить на наиболее распространенном языке верхнего уровня.
+ Например, если вы хранили ресурсы на испанском в каталоге{@code es-US}
+, их следует переместить в каталог {@code es-419}, где содержатся ресурсы на латиноамериканском диалекте испанского языка.
+ Аналогичным образом, если вы хранили строки ресурсов в папке {@code en-GB}, вам следует изменить название папки
+ на {@code en-001} (международная версия английского языка), поскольку {@code en-001} — наиболее распространенный
+ язык верхнего уровня для строк en-GB
.
+ В следующих примерах объясняется, почему такая практика повышает производительность и
+надежность процесса разрешения ресурсов.
В Android N ситуация, описанная в Таблице 1, разрешается +иначе:
+ + +Пользовательские настройки | +Ресурсы приложения | +Разрешение ресурсов | +
---|---|---|
|
+
+по умолчанию (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Попытка использования fr_CH => Отказ +Попытка использования fr => Отказ +Попытка использования диалекта fr => fr_FR +Использование fr_FR + |
+
В этом примере пользователь получает ресурсы на французском языке, а не на английском. В этом примере также показано, почему для Android N + следует хранить строки на французском языке в каталоге {@code fr}, а не в каталоге {@code fr_FR}. +Здесь целью разрешения является нахождение наиболее близкого диалекта верхнего уровня, + что ускоряет процесс разрешения и делает его более предсказуемым.
+ +Помимо улучшенной логики разрешения в Android добавлены + дополнительные языки. Рассмотрим предыдущий пример в ситуации, когда итальянский + указан как дополнительный язык пользователя, а приложение не поддерживает французский язык.
+ + +Пользовательские настройки | +Ресурсы приложения | +Разрешение ресурсов | + +
---|---|---|
|
+
+по умолчанию (en) +de_DE +es_ES +it_IT + |
+
+Попытка использования fr_CH => Отказ +Попытка использования fr => Отказ +Попытка использования диалекта fr => Отказ +Попытка использования it_CH => Отказ +Попытка использования it => Отказ +Попытка использования диалекта it => it_IT +Использование it_IT + |
+
+
Пользователь получает данные на понятном ему языке, хотя приложение и не +поддерживает французский язык.
+ + +В Android N добавлен новый API {@code LocaleList.GetDefault()}, + позволяющий приложениям напрямую запрашивать список языков, выбранных пользователем. Этот API +позволяет реализовать более сложное поведение + приложений и лучше оптимизировать отображение содержимого на экране. Например, результаты поиска + могут отображаться на разных языках в зависимости от пользовательских настроек. Приложения в браузере + могут не предлагать пользователю перевести приложения на знакомый ему язык, + а приложения, использующие клавиатуру, могут автоматически включать все подходящие раскладки.
+ +Версии Android до 6.0 включительно (уровень API 23) поддерживали только один или два языковых стандарта + для большинства распространенных языков +(en, es, ar, fr, ru). Поскольку у каждого языка имелось лишь немного вариантов, +приложения могли хранить числа и даты в виде жестко закодированных строк +в файлах ресурсов. Однако с расширением числа поддерживаемых Android языковых стандартов +могут возникнуть +значительные различия форматов даты, времени, валюты и другой подобной +информации даже в рамках одного языкового стандарта. Жесткое кодирование форматов может запутать +конечных пользователей. Поэтому при разработке приложений для Android N +следует использовать средства форматирования, а не жесткое кодирование строк с числами и датами.
+ +В качестве наглядного примера можно привести арабский язык, поддержка которого в Android N расширена +с одного {@code ar_EG} до 27 языковых стандартов. Большинство ресурсов этих языковых стандартов общие, но +в некоторых из них используются цифры формата ASCII, а в других — собственные цифры. Например, +если вы хотите создать предложение с числовой переменной +"Выберите ПИН-код из 4 цифр", вам нужно использовать средства форматирования следующим образом:
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/ru/preview/features/notification-updates.jd b/docs/html-intl/intl/ru/preview/features/notification-updates.jd new file mode 100644 index 000000000000..9c7cb9347719 --- /dev/null +++ b/docs/html-intl/intl/ru/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=Уведомления +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + +
В Android N представлено несколько новых API-интерфейсов, позволяющих +публиковать заметные и интерактивные уведомления.
+ +Существующий API-интерфейс уведомлений {@link android.support.v4.app.RemoteInput} +в Android N расширен для поддержки внутренних ответов на смартфонах. С помощью этой возможности + пользователи могут быстро отвечать на сообщения в панели уведомлений, не открывая приложение.
+ ++ Android N также позволяет группировать несколько похожих + уведомлений, чтобы они отображались как одно. Для этого в Android N используется существующий метод {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()}. Пользователи могут развернуть все + уведомления и выполнить различные действия, например ответить на сообщение + или закрыть каждое из уведомлений по отдельности в панели уведомлений. +
+ +Наконец, в Android N представлены новые API-интерфейсы, позволяющие +использовать системные элементы в собственных представлениях уведомлений вашего приложения. Благодаря им +уведомления отображаются единообразно на основе +стандартных шаблонов.
+ +В этом документе рассматриваются некоторые наиболее важные изменения, + которые следует учитывать при использовании новых уведомлений в приложениях.
+ +С помощью прямых ответов пользователи + Android N могут быстро отвечать на текстовые сообщения и обновлять списки задач непосредственно в интерфейсе +уведомлений. На мобильных устройствах действие внутреннего ответа обозначается + как дополнительная кнопка в уведомлении. Если пользователь набирает ответ на клавиатуре, система + прикрепляет текст ответа к намерению, + указанному для действия уведомления, и передает намерение в ваше + приложение. + + + +
+ +Создание действия уведомления, которое поддерживает прямой ответ: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
.
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
Система запрашивает у пользователя ввод ответа, если он инициирует +действие уведомления.
+ + + + +Получение введенного пользователем текста из интерфейса +уведомлений в операции, объявленной в намерении действия:
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
В следующем фрагменте кода показано, как метод извлекает введенный +текст из группы:
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
Приложения могут применять логику, чтобы определить, какие действия следует выполнить с полученным +текстом. +Для интерактивных приложений (например, чатов) предоставьте больше контекста в самом уведомлении + (например, несколько строк истории чата, в том числе собственные сообщения пользователя), + чтобы у пользователя было достаточно информации для ответа. +Когда пользователь отвечает через {@link android.support.v4.app.RemoteInput}, + добавьте текст в историю ответов, применив метод {@code setRemoteInputHistory()}. +
+ +Android N предоставляет разработчикам новый способ отображения + очереди уведомлений: группы уведомлений. Они похожи на + стеки + уведомлений в Android Wear. Например, если приложение создает уведомления + для входящих сообщений и получено несколько сообщений, объедините + уведомления в одну группу. Для группировки похожих уведомлений используйте + существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()}.
+ ++ Уведомления в группе формируют иерархию, + на вершине которой находится родительское уведомление, отображающее + сводную информацию о группе. Пользователь может постепенно + раскрывать группу уведомлений, при этом система показывает дополнительные + сведения. Если пользователь раскрывает группу, система отображает больше + информации о всех дочерних уведомлениях. Если же пользователь + развернет одно из уведомлений, его содержимое показывается полностью. +
+ + + + +Добавление уведомлений в группу описано в разделе +Добавление +каждого уведомления в группу.
+ + +В этом разделе описываются рекомендации по использованию групп +уведомлений вместо уведомлений {@link android.app.Notification.InboxStyle InboxStyle}, + которые были доступны в предыдущих версиях платформы + Android.
+ +Вам следует использовать группы уведомлений, только если выполняются +все следующие условия.
+ +Примером использования групп уведомлений может служить приложение +для обмена сообщениями, которое показывает список входящих сообщений, +или почтовое приложение, отображающее список полученных писем.
+ ++К примерам ситуаций, когда предпочтительнее использовать одно + уведомление, относятся отдельные сообщения от одного пользователя или + списочное представление однострочных текстовых элементов. Для них можно использовать +{@link android.app.Notification.InboxStyle InboxStyle} или +{@link android.app.Notification.BigTextStyle BigTextStyle}. + +
+ ++ Приложение всегда должно публиковать сводную информацию группы, даже если эта группа содержит + всего одно дочернее уведомление. В этом случае система не показывает сводную информацию, а + непосредственно отображает это уведомление. Это обеспечивает + единообразие интерфейса при + пролистывании дочернего элемента группы. +
+ ++ Примечание. Эта версия Android N пока еще не + блокирует отображение сводной информации для групп уведомлений, содержащих только один дочерний элемент. Эта + возможность будет добавлена в следующих версиях Android N. +
+ +Хотя система обычно отображает дочерние уведомления в виде группы, + их можно временно показывать в виде + всплывающих +уведомлений. Эта возможность очень удобна, так как позволяет + быстро получить доступ к последнему дочернему уведомлению и связанным с ним действиям. +
+ + ++ И группы уведомлений, и удаленный ввод входили в состав API {@link + android.app.Notification} для поддержки устройств + Android Wear, начиная с Android 5.0 (уровень API 21). Если вы уже использовали эти API-интерфейсы для создания уведомлений, + вам нужно только убедиться, что поведение приложения соответствует + описанным выше рекомендациям, и рассмотреть возможность реализации {@code + setRemoteInputHistory()}. +
+ ++ Для поддержки обратной совместимости те же API-интерфейсы доступны в + классе {@link android.support.v4.app.NotificationCompat} + вспомогательной библиотеки, что позволяет реализовать уведомления, работающие в предыдущих версиях Android. + На смартфонах и планшетах пользователи видят только сводное уведомление, + поэтому в приложении все равно должно быть уведомление + в стиле Inbox или аналогичное уведомление, содержащее всю информацию о группе. Так как устройства Android +Wear позволяют пользователям видеть все дочерние уведомления даже + на более ранних уровнях платформы, эти уведомления следует создавать независимо от уровня API. + +
+ +Начиная с Android N, вы можете настраивать представления уведомлений +и по-прежнему получать системные элементы, такие как заголовки уведомлений, действия и +расширяемые макеты.
+ +Для этого в Android N добавлены следующие API-интерфейсы, позволяющие + настраивать собственные представления.
+ +Чтобы воспользоваться этим новым API-интерфейсом, вызовите метод {@code setStyle()}, передав в него +нужный стиль собственного представления.
+ +В этом фрагменте показано, как создать собственный объект уведомления с помощью метода +{@code DecoratedCustomViewStyle()}.
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/ru/preview/features/picture-in-picture.jd b/docs/html-intl/intl/ru/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..5be0bffc505d --- /dev/null +++ b/docs/html-intl/intl/ru/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=Режим "картинка в картинке" +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
В Android N пользователи Android TV могут смотреть видео +в закрепленном окне в углу экрана во время работы в +приложениях. Режим "картинка в картинке" (PIP) позволяет приложениям отображать видео +в закрепленном окне одновременно с выполнением другой операции +фоновом режиме. Окно PIP обеспечивает возможность многозадачности внутри вашего приложения, что +повышает продуктивность работы пользователей.
+ +Ваше приложение может определить момент активации режима PIP. Ниже приведено несколько примеров +моментов перехода в режим PIP:
+ +Окно PIP имеет размеры 240x135 dp и отображается на самом верхнем слое в одном из +четырех углов экрана по выбору системы. Пользователь может вызвать +меню PIP, позволяющее переключать окно PIP в полноэкранный режим, или закрыть окно +PIP долгим нажатием кнопки Home на пульте дистанционного управления. Если на главном экране начнется воспроизведение другого +видео, окно PIP автоматически +закроется. Пользователи также могут закрыть окно PIP, используя экран последних задач.
+ + + + +Режим PIP использует многооконные API-интерфейсы в Android N для +отображения закрепленного окна с видео на верхнем слое. Чтобы добавить в приложение функцию PIP, вам нужно зарегистрировать +операции, поддерживающие PIP, добавить необходимые переключения операции в режим PIP, +а также обеспечить скрытие элементов пользовательского интерфейса и воспроизведение видео в то время, когда +операция находится в режиме PIP.
+ +По умолчанию в системе отсутствует автоматическая поддержка режима PIP для приложений.
+Если вы хотите, чтобы ваше приложение поддерживало режим PIP, зарегистрируйте операцию
+воспроизведения видео в манифесте приложения, установив для параметров
+android:supportsPictureInPicture
и
+android:resizeableActivity
значение true
. Также укажите, что
+ваша операция обрабатывает изменения конфигурации макета экрана, чтобы эта операция не
+запускалась заново в случае изменения макета при переходах в режиме PIP.
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
При регистрации операции помните, что в режиме PIP она +отображается в небольшом наложенном окне на экране телевизора. Для пользователей наиболее удобны операции +воспроизведения видео с минимальным пользовательским интерфейсом. Операции +с небольшими элементами пользовательского интерфейса могут оказаться неудобными для пользователей +в режиме PIP, потому что в окне PIP пользователи +не видят деталей этих элементов.
+ +Activity.enterPictureInPicture()
. В следующем примере показано переключение
+в режим PIP, когда пользователь нажимает кнопку PIP на панели
+управления мультимедиа:
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
Добавление кнопки PIP на панель управления мультимедиа позволяет пользователям легко переключаться +в режим PIP с сохранением возможностей управления воспроизведением видео.
+ + + + +В Android N входит новый класс
+PlaybackControlsRow.PictureInPictureAction
, который определяет действия PIP
+на панели управления и использует значок PIP.
Когда операция переходит в режим PIP, она должна отображать только воспроизведение
+видео. Уберите элементы пользовательского интерфейса перед переходом операции в режим PIP
+и восстановите их после возвращения операции в полноэкранный режим.
+Переопределите Activity.onPictureInPictureChanged()
или
+Fragment.onPictureInPictureChanged()
и включайте или
+отключайте элементы пользовательского интерфейса по мере необходимости, например:
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
Когда операция переключается в режим PIP, система видит ее в состоянии
+паузы и вызывает метод onPause()
этой операции. При этом воспроизведение видео
+должно продолжаться без паузы, если операция
+приостановлена в режиме PIP. Проверьте режим PIP в методе
+onPause()
своей операции и обеспечьте обработку воспроизведения соответствующим образом,
+например:
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
Когда операция возвращается из режима PIP в полноэкранный режим, система
+возобновляет выполнение операции и вызывает методonResume()
вашего приложения.
Режим PIP предназначается для операций, воспроизводящих видео в полноэкранном режиме. При переключении +операции в режим PIP следует избегать отображения любых элементов, кроме видео. +Отслеживайте моменты перехода операции в режим PIP и скрывайте элементы пользовательского интерфейса, как описано в +разделе Работа пользовательского интерфейса в режиме "картинка в картинке".
+ +Поскольку окно PIP отображается в виде плавающего окна в углу экрана, +следует избегать отображения критически важной информации на основном экране +в любой области, которая может быть закрыта окном PIP.
+ +По умолчанию фокус ввода не переключается на операцию, которая находится в режиме PIP. Для
+получения событий ввода в режиме PIP следует использовать
+MediaSession.setMediaButtonReceiver()
.
Некоторым приложениям (например, фотоприложениям) обычно требуется доступ только к отдельным каталогам
+внешнего хранилища, например, к каталогу Pictures
. Существующие
+методы доступа к внешним хранилищам не предназначены для обеспечения приложениям такого типа удобного
+доступа к выделенным каталогам. Например:
Android N предоставляет новый упрощенный API для доступа +к распространенным каталогам внешнего хранилища.
+ +Используйте класс StorageManager
для получения соответствующего экземпляра
+StorageVolume
. Затем создайте намерение, вызвав метод
+StorageVolume.createAccessIntent()
этого экземпляра.
+Используйте это намерение для доступа к каталогам внешнего хранилища. Чтобы получить список
+всех доступных томов, в том числе томов на съемных носителях, используйте
+StorageManager.getVolumesList()
.
В следующем фрагменте кода приведен пример того, как открывать каталог
+Pictures
в главном общем хранилище:
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Система пытается предоставить доступ к внешнему каталогу и, при необходимости, +запрашивает подтверждение доступа у пользователя с помощью упрощенного пользовательского интерфейса:
+ + + + +Если пользователь предоставляет доступ, система вызывает переопределенный метод
+onActivityResult()
с кодом результата
+Activity.RESULT_OK
, а также данные намерения, содержащие URI. Используйте
+предоставленный URI для доступа к данным каталога аналогично использованию URI,
+возвращаемых
+Storage
+Access Framework.
Если пользователь не предоставляет доступ, система вызывает переопределенный метод
+onActivityResult()
с кодом результата
+Activity.RESULT_CANCELED
и отсутствующими данными намерения.
Примечание. При получении доступа к определенному внешнему каталогу +приложение также получает доступ к вложенным в него каталогам.
+ +Чтобы использовать доступ к выделенным каталогам на съемном носителе, +сначала нужно добавить объект {@link android.content.BroadcastReceiver}, отслеживающий уведомления +{@link android.os.Environment#MEDIA_MOUNTED}, например:
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
Когда пользователь подключает съемный носитель, например SD-карту, система отправляет уведомление
+{@link android.os.Environment#MEDIA_MOUNTED}. Это уведомление
+предоставляет в данных намерения объект StorageVolume
, который вы можете использовать
+для доступа к каталогам на съемном носителе. В следующем примере показано,
+как осуществляется доступ к каталогу Pictures
на съемном носителе:
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
По возможности оставляйте постоянный URI для доступа к внешнему каталогу, чтобы приложению не
+приходилось многократно запрашивать у пользователя разрешение на доступ. После предоставления доступа пользователем вызовите метод
+getContentResolver().takePersistableUriPermssion()
для
+URI доступа к каталогу. Система сохранит постоянный URI и при последующих запросах
+доступа будет возвращать ответ RESULT_OK
. Таким образом, приложение не будет постоянно выводить
+окно с запросом подтверждения пользователя.
Если пользователь запрещает доступ к внешнему каталогу, не нужно сразу +же запрашивать доступ повторно. Пользователю может не понравиться, если приложение будет постоянно настаивать на +получении доступа.
diff --git a/docs/html-intl/intl/ru/preview/features/security-config.jd b/docs/html-intl/intl/ru/preview/features/security-config.jd new file mode 100644 index 000000000000..ff3494fd278e --- /dev/null +++ b/docs/html-intl/intl/ru/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=Конфигурация сетевой безопасности +page.keywords=preview,security,network + +@jd:body + ++ В Android N имеется функция "Конфигурация сетевой безопасности", + позволяющая приложениям настраивать свои параметры сетевой безопасности в защищенном + декларативном файле конфигурации без изменения программного кода приложения. Эти параметры можно + настроить для определенных областей и приложений. Основные + возможности этой функции: +
+ ++ Функция конфигурации сетевой безопасности использует файл XML, где вы можете указать + настройки своего приложения. Вы должны включить в манифест своего приложения + запись, указывающую на этот файл. В следующем отрывке кода из манифеста + показано, как создать такую запись: +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ Приложению может потребоваться возможность доверять пользовательскому набору центров сертификации (ЦС) вместо набора ЦС платформы, установленного по умолчанию. + Наиболее распространенные причины: +
+ ++ По умолчанию защищенные соединения всех приложений (например, TLS, HTTPS) доверяют + предустановленным системным ЦС, а приложения для API уровня 23 + (Android M) и ниже также по умолчанию доверяют ЦС, добавленным пользователем. Приложение + может настраивать свои соединения, используя {@code base-config} (для + настройки на уровне приложения) или {@code domain-config} (для настройки на уровне + доменов). +
+ + ++ Предположим, вы хотите подключиться к своему узлу, использующему самозаверенный сертификат SSL, + или к узлу, чей сертификат SSL был выпущен закрытым ЦС, + которому вы доверяете, например внутренним ЦС вашей компании. +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Добавьте самозаверенный сертификат или сертификат закрытого ЦС в формате PEM или DER в + {@code res/raw/my_ca}. +
+ + ++ Если приложению не нужно доверять всем ЦС, которым доверяет система, для него + можно указать сокращенный набор доверенных ЦС. Это позволит защитить + приложение от поддельных сертификатов, выпущенных любыми другими ЦС. +
+ ++ Настройка ограниченного набора доверенных ЦС похожа на настройку доверия пользовательскому ЦС для определенного домена, за тем исключением, + что в ресурсе указывается несколько ЦС. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Добавьте список доверенных ЦС в формате PEM или DER в {@code res/raw/trusted_roots}.
+ Обратите внимание, что файл в формате PEM должен содержать только данные PEM
+ без какого-либо дополнительного текста. Вы также можете указать несколько элементов
+ <certificates>
+вместо одного.
+
+ Приложению может потребоваться доверять дополнительным ЦС, которые не входят в список доверенных ЦС системы. + Это может быть связано с тем, что эти ЦС еще не добавлены в систему или + не соответствуют требованиям для включения в систему Android. Приложение + может добавить такие ЦС в доверенные, указав несколько источников сертификатов для + конфигурации. +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ При отладке приложения, которое использует для подключения протокол HTTPS, вам может потребоваться + подключение к локальному серверу разработки, у которого нет сертификата SSL + для рабочего сервера. Чтобы выполнить отладку без изменения кода + приложения, вы можете указать ЦС для отладки, + которые входят в число доверенных, только если для параметра +android:debuggable + установлено значение {@code true} с использованием {@code debug-overrides}. Обычно среды разработки и инструменты + сборки устанавливают этот флаг автоматически для всех сборок, кроме выпускаемой версии. +
+ ++ Такая схема работы более безопасна, чем использование обычного условного кода, поскольку в качестве + меры предосторожности магазины приложений не принимают приложения, помеченные + как доступные для отладки. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ Приложения, которым нужно подключаться к узлам только через защищенные соединения, + могут отказаться от поддержки передачи данных открытым текстом (с использованием нешифрованного протокола HTTP + вместо HTTPS) на эти узлы. Эта возможность помогает предотвратить + случайные неполадки в приложениях, связанные с изменениями URL-адресов, предоставленных внешними + источниками, например, инфраструктурными серверами. + Дополнительную информацию можно найти в описании метода {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()}. +
+ ++ Например, приложение может потребовать обязательное использование протокола HTTPS для всех соединений с {@code + secure.example.com}, чтобы защитить важный трафик + от небезопасных сетей. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ Обычно приложение доверяет всем предустановленным ЦС. Если любой из этих ЦС выпустит + поддельный сертификат, приложение подвергается риску атаки с перехватом данных. + Некоторым приложениям требуется ограничить принимаемый набор сертификатов + либо ограничением списка доверенных ЦС, либо прикреплением сертификатов. +
+ ++ Прикрепление сертификатов осуществляется путем предоставления набора сертификатов через хэш + открытого ключа (SubjectPublicKeyInfo сертификата X.509). В этом случае цепочка + сертификатов будет действительна, только если она содержит хотя бы один + прикрепленный открытый ключ. +
+ ++ При использовании прикрепления сертификатов всегда необходимо добавлять резервный + ключ, чтобы работа приложения не пострадала при необходимости перехода на новые ключи или смены ЦС (при + прикреплении сертификата ЦС или посредника этого ЦС). + Без резервного ключа для восстановления возможности подключения приложения потребуется срочно выпускать + его обновление. +
+ ++ Кроме того, существует возможность установить срок прикрепления, по истечении которого + прикрепление не выполняется. Это помогает предотвратить проблемы с подключением + приложений, которые не были обновлены. Однако установка срока действия + прикреплений позволяет обойти их ограничения. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ Значения, не установленные в определенной конфигурации, наследуются. Такое поведение позволяет создавать более + сложные конфигурации, сохраняя при этом файл конфигурации в читаемом виде. +
+ ++ Если в определенной записи не установлено значение, используется значение из следующей более общей записи. + Значения, не установленные в {@code domain-config}, + берутся из родительского элемента {@code domain-config} в многоуровневых конфигурациях или из элемента {@code + base-config} в простых конфигурациях. Для значений, не установленных в {@code base-config}, используются + значения по умолчанию для платформы. +
+ ++ Рассмотрим пример, где все соединения с доменами нижнего уровня {@code + example.com} должны использовать пользовательский набор ЦС. Кроме того, для этих доменов разрешена + передача данных открытым текстом, кроме случаев подключения к {@code + secure.example.com}. При вложении конфигурации {@code + secure.example.com} в конфигурацию {@code example.com} не требуется дублирование + {@code trust-anchors}. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ Функция конфигурации сетевой безопасности использует формат файлов XML. + Общая структура файла показана в следующем примере кода: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ В следующих разделах содержится описание синтаксиса и других деталей формата + файла. +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
.
+
+
++ Если значения не установлены, используются значения по умолчанию для платформы. Конфигурация по умолчанию + для приложений, использующих API уровня 24 или выше: +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++Конфигурация по умолчанию для приложений, использующих API уровня 23 или ниже: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
Если для узла назначения существует несколько элементов {@code domain-config}, используется правило для наиболее конкретного (самого длинного) совпадающего домена. +
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ Указывает, пропускается ли прикрепление сертификатов для ЦС из этого источника. Если значение равно {@code + "true"}, то прикрепление сертификатов не выполняется для цепочек сертификатов, проходящих через один из ЦС этого + источника. Это применяется для отладки ЦС + или для разрешения пользователю перехватывать защищенный трафик вашего приложения. +
+ ++ По умолчанию используется значение {@code "false"}, но если указан элемент {@code debug-overrides}, + то по умолчанию используется значение {@code "true"}. +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
.
+ + Истечение срока прикрепления помогает предотвратить проблемы с подключением в приложениях, которые + не получают обновления набора прикрепленных элементов, например в связи с тем, что пользователь + отключил обновления приложений. +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
Службы телевидения позволяют пользователю ставить воспроизведение телеканалов на паузу и возобновлять его, используя +для этого API-интерфейсы с временным сдвигом. Android N расширяет возможности временного сдвига, +позволяя пользователю сохранять несколько записанных сеансов.
+ +Пользователи могут планировать запись заранее или начинать ее во время просмотра +программы. После сохранения записей в системе пользователь может просматривать их в браузере, управлять ими +и воспроизводить их с помощью телевизионного приложения.
+ +Если вы хотите добавить функцию записи в службу ТВ, +вы должны указать системе, что ваше приложение поддерживает запись, и реализовать +возможности записи программ, обработки любых ошибок, возникающих +во время записи, вывода сообщений об ошибках, а также управления записанными сеансами.
+ +Чтобы сообщить системе, что ваша служба ТВ поддерживает запись, выполните +следующие шаги:
+ +TvInputService.onCreate()
создайте новый объект
+TvInputInfo
, используя класс TvInputInfo.Builder
.
+TvInputInfo
вызовите метод
+setCanRecord(true)
до вызова build()
,
+чтобы указать на то, что служба поддерживает запись.TvInputInfo
в системе посредством вызова метода
+TvInputService.updateTvInputInfo()
.Когда служба ТВ зарегистрирует поддержку записи,
+система будет вызывать ваш метод
+TvInputService.onCreateRecordingSession()
, когда ей потребуется доступ
+к функции записи в вашем приложении. Реализуйте собственный подкласс
+TvInputService.RecordingSession
и возвращайте его
+при получении обратного вызова onCreateRecordingSession()
.
+ Этот подкласс отвечает за переключение на данные нужного канала,
+запись запрошенных данных, а также передачу системе информации о состоянии записи
+и ошибках.
Когда система будет вызывать метод RecordingSession.onTune()
, передавая в него
+URI канала, приложение должно переключаться на канал, указанный URI. Сообщите системе о том, что
+приложение настроилось на желаемый канал, вызвав метод notifyTuned()
.
+Если приложению не удалось настроиться на желаемый канал, оно должно вызвать метод
+notifyError()
.
Затем система передает обратный вызов RecordingSession.onStartRecording()
.
+ После этого приложение должно сразу же начать запись. Когда система передает
+этот обратный вызов, она может указать URI с информацией о программе
+для записи. После завершения записи эти данные нужно
+скопировать в таблицу данных RecordedPrograms
.
Наконец, система вызывает метод RecordingSession.onStopRecording()
.
+В этот момент приложение должно сразу же прекратить запись. Также вам нужно будет
+создать запись в таблице RecordedPrograms
. Эта запись должна
+содержать URI записанных данных в столбце
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
, а также любую информацию
+о программе, которая была предоставлена системой в исходном вызове
+onStartRecording()
.
Более подробную информацию о доступе к таблице RecordedPrograms
+можно найти в разделе Управление записанными сеансами.
Если во время записи возникла ошибка, в результате которой записанные данные стали непригодными для использования,
+то об этом нужно сообщить системе, вызвав метод RecordingSession.notifyError()
.
+Аналогичным образом, вы можете вызвать метод notifyError()
после создания сеанса записи,
+чтобы сообщить системе, что приложение больше не может записывать сеансы.
Если в процессе записи возникла ошибка, но вы хотите предоставить пользователям
+приемлемую часть записи для воспроизведения, вызовите
+RecordingSession.notifyRecordingStopped()
, чтобы дать системе возможность
+использовать частичный сеанс.
Система хранит информацию обо всех записанных сеансах всех
+приложений, поддерживающих запись каналов, в таблице поставщиков контента TvContract.RecordedPrograms
.
+ Эта информация доступна через URI контента
+RecordedPrograms.Uri
. Используйте API-интерфейсы поставщиков контента для
+чтения, добавления и удаления записей из этой таблицы.
Дополнительную информацию о работе с данными поставщиков контента можно найти в разделе + +Основные сведения о поставщике контента.
+ +Объем хранилищ на телевизионных устройствах может быть ограничен, поэтому следует разумно
+распределять доступные хранилища для хранения записанных сеансов. Используйте
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
, когда для сохранения записанного сеанса
+недостаточно места.
Когда пользователь инициирует запись, приложение должно как можно скорее начать записывать
+данные. Для этого рекомендуется заранее выполнить все продолжительные задачи,
+такие как получение доступа к хранилищу и распределение свободного места, когда система передает обратный вызов
+onCreateRecordingSession()
. Это позволяет сразу же начать
+запись после получения обратного вызова onStartRecording()
.
+
В Android N появилась поддержка возможностей языка Java 8, +которые можно использовать при разработке приложений для Android N. +На данной странице приведены описания новых возможностей языка, поддерживаемых в Android N +Preview, объяснено как настроить проект для их использования, а также указаны известные +проблемы, с которыми можно столкнуться. +
+ +Для использования этих функций необходимо загрузить и установить Android +Studio 2.1 (предварительная версия) и Android N Preview SDK, который включает набор инструментов +Jack и обновленный подключаемый модуль Android для Gradle. Если вы еще не установили +Android N Preview SDK, см. Настройка среды разработки для Android N.
+ + + ++ Примечание. Использование новых возможностей языка Java 8 не является обязательным требованием +при разработке приложений для платформы Android N. Если вы не хотите +писать код с использованием возможностей языка Java 8, можно указать +Java 7 в качестве значения совместимости для проекта, однако все-равно +необходимо будет выполнить компиляцию с JDK 8 для осуществления сборки на платформе Android N. +
+ ++ В настоящее время Android поддерживает не все возможности языка Java 8. +Однако при разработке приложений для +Android N Preview доступны следующие функции. +
+ ++ Кроме того, доступны следующие API-интерфейсы для реализации возможностей языка Java 8. +
+ ++ Примечание. В Android N реализация +лямбда-выражений выполнена с помощью анонимных классов. Данный подход обеспечивает их +обратную совместимость и возможность выполнения в предыдущих версиях Android. При тестировании +лямбда-выражений в предыдущих версиях перейдите в файл {@code + build.gradle} и установите для параметров {@code compileSdkVersion} и {@code + targetSdkVersion} значения 23 или ниже. +
+ ++ Для использования новых возможностей языка Java 8 необходимо также использовать +новый набор инструментов Jack. С его помощью +Android компилирует языковой источник Java в считываемый Android байткод Dalvik Executable (dex). +В Jack предусмотрен собственный формат библиотеки {@code .jack}, большинство функциональных возможностей набора +инструментов предоставляется в рамках одного инструмента: перекомпоновка, сжатие, обфускация и +использование нескольких файлов DEX. +
+ +Ниже представлено сравнение двух наборов инструментов, используемых для сборки файлов DEX в Android.
++ Чтобы использовать возможности языка Java 8 и набор инструментов Jack для проекта, добавьте +в файл модуля {@code build.gradle} следующий код: +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Функция Instant Run, появившаяся в Android Studio 2.0 (Beta), не работает +с набором инструментов Jack и будет отключена при его использовании. +
+ +Поскольку набор инструментов Jack не создает промежуточные файлы классов при компиляции +приложения, инструменты, которые используют такие файлы, пока с Jack не работают. Примеры таких +инструментов приведены ниже.
+ +Если вы обнаружите другие проблемы во время использования набора инструментов Jack, сообщите о них.
\ No newline at end of file diff --git a/docs/html-intl/intl/ru/preview/overview.jd b/docs/html-intl/intl/ru/preview/overview.jd new file mode 100644 index 000000000000..e78af040f8ea --- /dev/null +++ b/docs/html-intl/intl/ru/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=Обзор программы +page.metaDescription=Подготовьте свои приложения к выходу следующей версии Android. +page.image=images/cards/card-n-overview_2x.png +meta.tags="предварительная версия", "разработчик", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ Добро пожаловать в программу Android N Developer Preview, участники +которой получают все необходимое для тестирования и оптимизации +своих приложений для следующей версии платформы Android. Участие в программе бесплатно, вам предоставляется возможность использовать +инструменты N Developer Preview сразу же после их загрузки. +
+ + + + + + + ++ Запустите и протестируйте свои приложения на широком спектре устройств или на эмуляторе. + +
++ Во время знакомства с предварительной версией платформы мы будем предоставлять ежемесячные обновления, поэтому вы сможете протестировать самые актуальные изменения в платформе. +
++ В течение первых нескольких недель мы будем рассматривать отчеты об ошибках, поступающие от разработчиков, в приоритетном порядке, +поэтому не теряйте времени и приступайте к тестированию и составлению отзывов как можно раньше. +
++ Заранее начните реализовывать в своих приложениях поддержку расширенной функциональности платформы. +
++ Простое и удобное получение обновлений по беспроводной связи для поддерживаемых устройств в рамках программы бета-тестирования +Android. Запись во флэш-память устройства не требуется. +
++ Отправляйте отзывы и сообщайте о проблемах с помощью нашей +системы отслеживания ошибок. Общайтесь с другими +разработчиками в +сообществе разработчиков для Android N. +
++ Срок действия программы N Developer Preview запланирован с 9 марта 2016 г. и до выпуска окончательной версии Android N +для AOSP и OEM, который состоится в третьем квартале 2016 г. +
+ ++ На ключевых этапах разработки платформы мы предоставим обновления для среды разработки и +тестирования. Выход обновлений запланирован каждый месяц (с интервалом +4-6 недель). Основные этапы показаны ниже. +
+ ++ Каждое обновление включает инструменты SDK, системные образы предварительной версии, эмуляторы, справочную +документацию и описание отличий в API. +
+ ++ На первых трех ключевых этапах предварительной версии предоставляется начальная среда +тестирования и разработки, которая позволяет выявить +проблемы совместимости в текущих приложениях и спланировать миграцию или доработку функций, +требуемых для новой платформы. В течение этого времени вы можете предоставлять +отзывы о функциях и API, а также проблемах совместимости файлов +с помощью системы отслеживания +ошибок. Обновления могут включать некоторые изменения API. +
+ ++ В предварительных версиях 4 и 5 вам будет предоставлен доступ к окончательным +версиям API-интерфейсов и SDK системы N, а также к практически готовым системным образам +для тестирования работоспособности и возможностей системы. Android N будет содержать API +стандартного уровня. Вы сможете начать заключительное тестирование совместимости старых +приложений и отладить новый код, в котором используются API-интерфейсы или возможности системы N. +
+ ++ Начиная с предварительной версии 4, вы сможете публиковать приложения на +устройствах под управлением Android N, используя API-интерфейсы официального уровня, например на +пользовательских устройствах, участвующих в программе бета-тестирования Android. Вы можете +выполнить публикацию сначала на альфа- и бета-каналах Google Play для тестирования +приложений с помощью пользователей бета-версии Android перед их размещением в +магазине для общего доступа. +
+ ++ Мы настоятельно рекомендуем вам в ходе тестирования и разработки приложений для Android N постоянно +обновлять вашу среду разработки по мере выхода обновлений +предварительной версии. Для упрощения процесса вы можете зарегистрировать тестовые устройства в программе +бета-тестирования Android и получать обновления по беспроводной связи на +каждом ключевом этапе. Кроме того, обновленные образы предварительной версии можно загрузить +и записать во флэш-память устройства вручную. +
+ ++ Мы будем сообщать о появлении обновлений предварительной версии в блоге разработчиков Android, а +также на этом сайте и в сообществе разработчиков для +Android N. +
+ + ++ N Developer Preview содержит все, что необходимо для тестирования ваших существующих +приложений на экранах различных размеров, тестирования с использованием различных сетевых технологий, наборов микросхем ЦП и графических процессоров, +а также различных архитектур оборудования. +
+ +С помощью менеджера SDK в Android Studio вы сможете загрузить следующие компоненты:
+ ++ При необходимости мы предоставляем обновления инструментов разработки на каждом ключевом этапе. +
+ ++ N Developer Preview включает системные образы для Nexus и других устройств, которые можно использовать при +тестировании и разработке на физических устройствах. См. полный список аппаратных образов на странице Образы устройств. + +
+ ++ Мы будем предоставлять обновленные системные образы для этих устройств на каждом ключевом этапе. Вы +также сможете загружать и записывать обновленные системные образы во флэш-память тестовых устройств +вручную всегда, когда это будет необходимо. Это особенно удобно для автоматических +сред тестирования, где может требоваться многократная перезапись в флэш-память +устройства. +
+ +Примечание. +В отличие от предварительной версии прошлого года, для устройств, запись во флэш-память которых выполнялась вручную, обновления по беспроводной связи предоставляться не будут. +В этом году вы можете получать обновления по беспроводной связи, зарегистрировав устройства в программе +бета-тестирования Android, см. подробные сведения в следующем разделе. +
+ ++ Новой функцией Android N является программа получения обновлений по сети, которая автоматически +предоставляет последние обновления предварительной версии Android N непосредственно на устройства, зарегистрированные +в программе тестирования. Участие в программе бесплатно и доступно всем, кто имеет поддерживаемые устройства, +привязанные к учетной записи Google. +
+ ++ Для регистрации посетите веб-сайт программы бета-тестирования +Android. Вы увидите +список всех устройств, привязанных к учетной записи, которые можно зарегистрировать +в программе бета-тестирования Android. +
+ ++ После регистрации на устройство придет обновление. В большинстве случаев +для перехода на Android N не требуется выполнять полный сброс конфигурационных данных, однако, +рекомендуется выполнить резервное копирование важных данных перед +регистрацией устройства в программе. +
+ ++ При получении устройством обновлений рекомендуется загружать и +устанавливать максимально быстро. Это требуется, чтобы быть в курсе +последних изменений системного интерфейса, возможностей системы, особенностей API-интерфейсов и функций. +
+ ++ По завершению программы тестирования Developer Preview на зарегистрированные устройства +будет отправлено обновление с официальной версией Android N. +
+ ++ Вы можете отменить регистрацию устройств в программе бета-тестирования Android в любое время на сайте +программы. Перед отменой регистрации выполните резервное копирование данных на +устройстве. +
+ +Примечание. +При отмене регистрации на вашем устройстве выполняется восстановление заводских настроек +для последней версии +Android 6.0 Marshmallow (не обязательно той версии, которая +была установлена до регистрации устройства). Для обеспечения правильности установки +ваши данные будут удалены с устройства, включая контакты, сообщения, +фотографии и др. +
+ ++ Для ознакомления с Android N на сайте программы Developer Preview +представлены следующие документы. +
+ ++ На этапе ранних обновлений предварительной версии вы сможете загрузить последний +Справочник по API +для платформы Android N в виде zip-архива. В нем также +содержится отчет о различиях, позволяющий легко определить изменения в API-интерфейсах между +API 23 и предыдущими версиями. +
+ ++ После окончательного утверждения API-интерфейсов Android N и назначения официального уровня API, +вам будет предоставлен онлайн-справочник по этому API-интерфейсу по адресу https://developer.android.com. +
+ ++ При тестировании и разработке приложений в рамках программы N Developer Preview используйте следующие каналы +для отправки отчетов о проблемах и отзывов. +
+ +
+ Платформа N Developer Preview предоставляет ориентированные на разработку систему и библиотеку Android,
+в которых отсутствуют API-интерфейсы стандартного уровня. Если вы не хотите
+проверять свое приложение на совместимость (хотя мы настоятельно
+рекомендуем сделать это), выберите целевую предварительную версию Android N, задав для
+параметра targetSdkVersion
+своего приложения значение “N”
.
+
+ В Android N Developer Preview представлены предварительные версии API-интерфейсов. +Они не будут официально публиковаться до выпуска окончательной версии пакета SDK, +намеченного на третий квартал 2016 г. Это значит, что в +API-интерфейсы могут вноситься небольшие изменения, особенно в первые недели после +запуска программы. Мы будем предоставлять вам сводку об изменениях с каждым +обновлением Android N Developer Preview. +
+ ++ Примечание. Несмотря на возможные изменения в предварительных версиях API-интерфейсов, +соответствующие функциональные возможности системы работают стабильно и уже готовы для +тестирования. +
+ ++ Политика Google Play однозначно запрещает публикацию приложений, разработанных для N Developer +Preview. Когда будет доступен окончательный SDK для Android N, вы сможете +установить в качестве целевого API-интерфейс Android N официального уровня и опубликовать приложение в Google +Play через альфа- и бета-каналы выпуска. Тем временем, если вы хотите распространить приложение, предназначенное для проверки под +Android N, используйте для этого электронную почту или разместите такие приложения на своем сайте +для прямой загрузки. +
+ ++ После выхода полной версии Android N для AOSP и OEM, запланированного на третий квартал 2016 г., +можно будет публиковать приложения для Android N в общем доступе на +Google Play. +
+ + ++ Чтобы приступить к тестированию своего приложения в Android N, выполните следующие действия. +
+ ++ Благодарим за участие в программе Android N Developer Preview! +
diff --git a/docs/html-intl/intl/ru/preview/samples.jd b/docs/html-intl/intl/ru/preview/samples.jd new file mode 100644 index 000000000000..1f674f38fe88 --- /dev/null +++ b/docs/html-intl/intl/ru/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=Примеры +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ Следующие примеры кода представлены для Android N. Чтобы +загрузить примеры в Android Studio, выберите в меню File > Import +Samples. +
+ ++ Примечание. Эти загружаемые проекты предназначены для +использования с Gradle и Android Studio. +
+ + ++ В данном примере показаны преимущества многооконного +интерфейса для вашего приложения. +
+ + + ++ В этом ранее созданном примере показана простая служба, которая отправляет +уведомления с помощью NotificationCompat. Каждое непрочитанное сообщение от пользователя +отправляется отдельным уведомлением. +
++ Этот пример был обновлен с использованием новых функций уведомлений, +доступных в Android N. +
+ + + ++ В этом предварительно созданном примере показано, как использовать +NotificationManager для определения количества уведомлений, +отображаемого приложением. +
++ Этот пример был обновлен с использованием новых функций уведомлений, +доступных в Android N. +
+ + + ++ В данном примере показано как сохранять и считывать данные в зашифрованном +хранилище, которое всегда доступно только на загруженном устройстве. +
+ + + ++ В данном примере показано, как выполнять чтение и запись данных из определенных +каталогов при уменьшении числа требуемых разрешений. +
+ \ No newline at end of file diff --git a/docs/html-intl/intl/ru/preview/setup-sdk.jd b/docs/html-intl/intl/ru/preview/setup-sdk.jd new file mode 100644 index 000000000000..1fcbc0ce2567 --- /dev/null +++ b/docs/html-intl/intl/ru/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=Установка предварительной +версииmeta.keywords="предварительная версия", "android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +Создание приложений для Android N Preview требует некоторых обновлений среды разработки, +описанных в этом документе.
+ +Чтобы просто протестировать совместимость вашего приложения на системном образе +Android N, следуйте рекомендациям руководства Тест на устройстве Android N.
+ + + + +Платформа Android N добавляет поддержку возможностей языка Java 8, +которые требуют наличия нового компилятора, именуемого Jack. Последняя версия Jack +в настоящее время поддерживается только в Android Studio 2.1. Поэтому если вы хотите использовать возможности +языка Java 8 для +разработки своего приложения, вам понадобится Android Studio 2.1. В противном случае вам не потребуется использовать компилятор Jack, +однако все равно придется выполнить обновление до JDK 8 для компиляции под платформу Android N, +как описано ниже. +
+ + + +Предварительная версия Android Studio 2.1 в настоящее время доступна на канале обновлений Canary. +Если у вас уже есть Android Studio +и вы не хотите обновлять ее до версии канала Canary, вы можете загрузить +Android Studio 2.1 для отдельной установки и использовать ее для разработки +под Android N, не затрагивая основную среду Android Studio. +
+ +Чтобы загрузить Android Studio 2.1 для отдельной установки, выполните следующие шаги +(если вы хотите обновить существующую установку Android Studio до версии 2.1, начните с шага 4). +
+ +Оставьте это окно настроек открытым для следующего шага.
+ + +Чтобы начать разработку с использованием API-интерфейсов Android N, необходимо установить +Android N Preview SDK в Android Studio, выполнив следующие шаги.
+ ++ Подробная информация по API-интерфейсам Android N содержится в справочной документации N Preview, +которую можно загрузить из следующей таблицы. +Этот пакет содержит сокращенную автономную версию веб-сайта для разработчиков Android +и включает в себя обновленный справочник по API-интерфейсам Android N, а также сведения о различиях +API. +
+ +Документация | +Контрольные суммы | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
Thiết bị | +Tải xuống / Tổng kiểm | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ Nếu bạn muốn gỡ cài đặt preview khỏi thiết bị, bạn có thể thực hiện điều đó bằng một trong + những cách sau:
++ Thiết bị sẽ nhận được bản cập nhật qua vô tuyến của phiên bản Android sản xuất + mới nhất có sẵn cho thiết bị đó (ví dụ, Android 6.0 Marshmallow). + Bản cập nhật yêu cầu thiết lập lại toàn bộ thiết bị, vì vậy dữ liệu người dùng trên thiết bị sẽ được + gỡ bỏ. Hãy đảm bảo rằng bạn đã sao lưu dữ liệu quan trọng trước khi + hủy đăng ký thiết bị. +
+Lưu ý: + Việc gỡ cài đặt ảnh hệ thống của Developer Preview trước khi + kết thúc chương trình yêu cầu phải thiết lập lại toàn bộ thiết bị và gỡ bỏ tất cả dữ liệu người dùng + trên thiết bị. +
+ + +Để sử dụng Bộ Giả Lập Android chạy Android N Preview, bạn cần +tải xuống Android N Preview SDK và tạo một thiết bị ảo cho +bộ giả lập.
+ +Đầu tiên, tải xuống Android N Preview SDK như sau (nếu bạn +đã có nó trong khi thiết lập +để phát triển dành cho Android N, bạn có thể bỏ qua phần này): + +
Giờ đây bạn sẽ có Android SDK Built-Tools 24.0 0 rc1, +Platform-Tools 24.0.0 rc1, và SDK Tools +25.0.9. Nếu bạn không cập nhật Các Công cụ SDK lên 25.0.9, bạn sẽ không +thể chạy ảnh hệ thống x86_64 cho Android N.
+ + +Bây giờ, hãy tạo một thiết bị ảo với ảnh hệ thống Android N:
+ +Giờ đây bạn có thể khởi chạy Bộ giả lập Android với AVD Preview Android N.
+ ++Để có trải nghiệm tốt nhất trong Bộ giả lập Android, hãy cài đặt +Android Studio 2.1 Preview, có hỗ trợ Bộ giả lập Android 2.0 Beta +với hiệu suất nhanh hơn nhiều so với Bộ giả lập trong +Android Studio 1.5.
+ +Lưu ý: + Nếu bạn hiện đang sử dụng Android Studio 2.0 Beta, một vấn đề đã được biết đến + sẽ ngăn cản bạn tạo AVD bằng ảnh hệ thống của N Preview, vì vậy + hiện bạn cần sử dụng preview của Android Studio 2.1 để tạo các AVD. +
+ +Để biết thêm thông tin về tạo thiết bị ảo, hãy xem Quản lý Thiết bị ảo. +
+ + + + + + + + + + + + + + ++ Các tiến trình chạy ngầm có thể tiêu tốn bộ nhớ và pin. Ví dụ, một + truyền phát không biểu thị có thể bắt đầu nhiều tiến trình chạy ngầm đã đăng ký + để theo dõi chúng, ngay cả khi các tiến trình đó có thể không làm việc nhiều. Điều này có thể có + ảnh hưởng lớn đến cả hiệu suất của thiết bị lẫn trải nghiệm của người dùng. +
+ ++ Để loại bỏ vấn đề này, N Developer Preview áp dụng các hạn chế + sau: +
+ ++ Khuôn khổ Android cung cấp một số giải pháp để giảm thiểu sự cần thiết đối với + các truyền phát không biểu thị. Ví dụ, {@link android.app.job.JobScheduler} + và + {@code GcmNetworkManager} cung cấp một cơ chế lên lịch hiệu quả + cho các hoạt động mạng khi đáp ứng các điều kiện được chỉ định, ví dụ như kết nối tới mạng + không đo lưu lượng. Bây giờ bạn cũng có thể sử dụng {@link android.app.job.JobScheduler} + để phản ứng lại với các thay đổi đối với các trình cung cấp nội dung. Các đối tượng {@link android.app.job.JobInfo} + gói gọn các tham số {@link android.app.job.JobScheduler} + dùng để lên lịch tác vụ của bạn. Khi đáp ứng được các điều kiện của tác vụ, hệ thống + sẽ thực thi tác vụ này trên {@link android.app.job.JobService} của ứng dụng của bạn. +
+ ++ Trong tài liệu này, chúng ta sẽ tìm hiểu cách sử dụng các phương thức thay thế, chẳng hạn như + {@link android.app.job.JobScheduler}, để thích ứng ứng dụng của bạn với các hạn chế + mới này. +
+ ++ Các ứng dụng nhắm đến N Developer Preview không nhận được truyền phát {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} nếu chúng + đăng ký nhận truyền phát trong bản kê khai của chúng, và các tiến trình phụ thuộc vào truyền phát này + sẽ không khởi động. Điều này cũng đặt ra một vấn đề cho ứng dụng + về việc theo dõi thay đổi mạng hoặc thực hiện các hoạt động mạng hàng loạt khi + thiết bị kết nối với một mạng không đo lưu lượng. Một số giải pháp để tránh khỏi hạn chế này + đã tồn tại trong khuôn khổ Android, nhưng chọn được một giải pháp phù hợp + phụ thuộc vào những gì bạn muốn ứng dụng của bạn hoàn thành. +
+ ++ Lưu ý: Một{@link android.content.BroadcastReceiver} có đăng ký + {@link android.content.Context#registerReceiver Context.registerReceiver()} + tiếp tục nhận các truyền phát này trong khi ứng dụng đang ở tiền cảnh. +
+ ++ Khi sử dụng lớp{@link android.app.job.JobInfo.Builder JobInfo.Builder} + để xây dựng đối tượng {@link android.app.job.JobInfo} của bạn, hãy áp dụng phương thức {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} và chuyển {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} dưới dạng một tham số tác vụ. Đoạn mã mẫu sau + lên lịch một dịch vụ để chạy khi thiết bị kết nối với một mạng + không đo lưu lượng và đang sạc: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ Khi các điều kiện cho tác vụ của bạn đã được đáp ứng, ứng dụng của bạn sẽ nhận được lệnh gọi lại để chạy + phương thức{@link android.app.job.JobService#onStartJob onStartJob()}trong + {@code JobService.class} được chỉ định. Để xem thêm các ví dụ về triển khai {@link + android.app.job.JobScheduler} , hãy xem ứng dụng mẫu JobScheduler. +
+ ++ Các ứng dụng sử dụng dịch vụ GMSCore, và nhắm đến Android 5.0 (API mức 21) + hoặc thấp hơn, có thể sử dụng + {@code GcmNetworkManager} và quy định {@code Task.NETWORK_STATE_UNMETERED}. +
+ ++ Các ứng dụng đang chạy ở tiền cảnh vẫn có thể theo dõi {@code + CONNECTIVITY_CHANGE} bằng một{@link + android.content.BroadcastReceiver} đã đăng ký. Tuy nhiên, API {@link + android.net.ConnectivityManager} cung cấp phương thức yêu cầu lệnh gọi lại hiệu quả hơn + chỉ khi đáp ứng được các điều kiện được chỉ định. +
+ ++ Các đối tượng {@link android.net.NetworkRequest} định nghĩa các tham số của + lệnh gọi lại mạng xét về {@link android.net.NetworkCapabilities}. Bạn + tạo các đối tượng {@link android.net.NetworkRequest} bằng lớp {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} + rồi chuyển đối tượng{@link android.net.NetworkRequest} sang hệ thống. Khi + đáp ứng được các điều kiện mạng, ứng dụng nhận lệnh gọi lại để thực thi phương thức + {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} như được định nghĩa trong lớp {@link + android.net.ConnectivityManager.NetworkCallback} của nó. +
+ ++ Ứng dụng tiếp tục nhận lệnh gọi lại cho đến khi ứng dụng tồn tại hoặc nó gọi + {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()}. +
+ ++ Trong N Developer Preview, ứng dụng không thể gửi hoặc nhận các truyền phát {@link + android.hardware.Camera#ACTION_NEW_PICTURE} hoặc {@link + android.hardware.Camera#ACTION_NEW_VIDEO}. Hạn chế này giúp + loại bỏ các tác động về hiệu suất và trải nghiệm của người dùng khi một số ứng dụng phải + thức dậy để xử lý một ảnh hoặc video mới. N Developer Preview + mở rộng {@link android.app.job.JobInfo} và {@link + android.app.job.JobParameters} để cung cấp một giải pháp thay thế. +
+ ++ Để kích hoạt tác vụ khi thay đổi URI nội dung, N Developer Preview sẽ mở rộng + API{@link android.app.job.JobInfo} bằng các phương thức sau: +
+ ++ Lưu ý: {@code TriggerContentUri()} không thể được sử dụng + kết hợp với {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} hoặc {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()}. Để tiếp tục theo dõi các thay đổi nội dung, hãy lên lịch một + {@link android.app.job.JobInfo} mới trước khi {@link + android.app.job.JobService} của ứng dụng hoàn thành xử lý lệnh gọi lại gần đây nhất. +
+ ++ Đoạn mã mẫu sau lên lịch kích hoạt một tác vụ khi hệ thống báo cáo + có sự thay đổi về URI nội dung, {@code MEDIA_URI}: +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ Khi hệ thống báo cáo có sự thay đổi trong (các) URI nội dung được chỉ định, ứng dụng của bạn + sẽ nhận được lệnh gọi lại và một đối tượng {@link android.app.job.JobParameters} được chuyển sang + phương thức {@link android.app.job.JobService#onStartJob onStartJob()} + trong {@code MediaContentJob.class}. +
+ ++ N Developer Preview cũng mở rộng {@link android.app.job.JobParameters} để + cho phép ứng dụng của bạn nhận thông tin hữu ích về những gì thẩm quyền nội dung + và các URI đã kích hoạt tác vụ: +
+ ++ Mã mẫu sau sẽ ghi đè lên phương thức {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} và + và ghi lại các thẩm quyền nội dung và URI đã kích hoạt tác vụ. +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ Tối ưu hóa ứng dụng của bạn để chạy trên các thiết bị có bộ nhớ ít, hoặc đang trong điều kiện + bộ nhớ ít có thể cải thiện hiệu suất và trải nghiệm của người dùng. Loại bỏ + các thành phần phụ thuộc trên các dịch vụ chạy ngầm và bộ thu truyền phát không biểu thị đã đăng ký tĩnh + có thể giúp ứng dụng của bạn chạy tốt hơn trên các thiết bị như vậy. Mặc dù + N Developer Preview thực hiện các bước để giảm bớt một vài trong số các vấn đề này, nhưng chúng tôi + khuyến nghị bạn nên tối ưu ứng dụng của bạn để chạy hoàn toàn không cần sử dụng + các tiến trình chạy ngầm này. +
+ ++ N Developer Preview giới thiệu một số lệnh Android Debug Bridge (ADB) bổ sung mà + bạn có thể sử dụng để kiểm thử hành vi của ứng dụng bằng các tiến trình chạy ngầm đã bị vô hiệu hóa đó: +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N chạy trong chế độ Khởi động Trực tiếp an toàn +khi thiết bị đã được bật nguồn nhưng người dùng chưa mở khóa +thiết bị. Để hỗ trợ chế độ này, hệ thống cung cấp hai vị trí lưu trữ dữ liệu:
+ +Theo mặc định, các ứng dụng không chạy trong quá trình chế độ Khởi động Trực tiếp. +Nếu ứng dụng của bạn cần thực hiện hành động trong chế độ Khởi động Trực tiếp thì bạn có thể đăng ký +các thành phần ứng dụng cần chạy trong chế độ này. Một số trường hợp sử dụng phổ biến +cho các ứng dụng cần chạy trong chế độ Khởi động Trực tiếp gồm:
+ +Nếu ứng dụng của bạn cần truy cập dữ liệu khi đang chạy trong chế độ Khởi động Trực tiếp thì hãy sử dụng +lưu trữ mã hóa thiết bị. Bộ nhớ lưu trữ được mã hóa của thiết bị có chứa dữ liệu +được mã hóa bằng một khóa chỉ khả dụng sau khi thiết bị đã thực hiện một +lần khởi động được xác thực thành công.
+ +Đối với dữ liệu cần được mã hóa bằng một khóa liên kết tới thông tin xác thực +của người dùng như mã PIN hoặc mật khẩu thì hãy sử dụng bộ nhớ lưu trữ mã hóa thông tin xác thực. +Bộ nhớ lưu trữ mã hóa thông tin xác thực chỉ khả dụng sau khi người dùng đã mở khóa +thành công thiết bị, tính đến khi người dùng khởi động lại thiết bị một lần nữa. Nếu +người dùng mở màn hình khóa sau khi mở khóa thiết bị thì thao tác này không khóa +bộ nhớ mã hóa thông tin xác thực.
+ +Các ứng dụng phải đăng ký các thành phần của chúng với hệ thống trước khi chúng
+có thể chạy trong chế độ Khởi động Trực tiếp hoặc truy cập bộ nhớ lưu trữ
+mã hóa thiết bị. Ứng dụng đăng ký với hệ thống bằng cách đánh dấu các thành phần là
+nhận biết mã hóa. Để đánh dấu các thành phần của bạn là nhận biết mã hóa, hãy đặt thuộc tính
+android:encryptionAware
thành true trong bản kê khai.
+ +
Các thành phần nhận biết mã hóa có thể đăng ký để nhận một thông điệp truyền phát
+LOCKED_BOOT_COMPLETED
từ
+hệ thống khi thiết bị được khởi động lại. Lúc này, bộ nhớ lưu trữ
+mã hóa thiết bị sẽ khả dụng và thành phần của bạn có thể thực thi các tác vụ cần được
+chạy trong chế độ Khởi động Trực tiếp, như kích hoạt báo thức đã đặt.
Đoạn mã sau là một ví dụ về cách đăng ký một
+{@link android.content.BroadcastReceiver} là nhận biết mã hóa và thêm một
+bộ lọc ý định cho LOCKED_BOOT_COMPLETED
trong bản kê khai của ứng dụng:
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
Khi người dùng đã mở khóa thiết bị thì mọi thành phần có thể truy cập +cả bộ nhớ lưu trữ mã hóa thiết bị lẫn bộ nhớ lưu trữ mã hóa thông tin xác thực.
+ +Để truy cập bộ nhớ lưu trữ mã hóa thiết bị, hãy tạo một thực thể
+{@link android.content.Context} thứ hai bằng cách gọi
+Context.createDeviceEncryptedStorageContext()
. Tất cả các lệnh gọi
+API bộ nhớ lưu trữ đều sử dụng bối cảnh này để truy cập bộ nhớ lưu trữ mã hóa thiết bị.
+Ví dụ sau sẽ truy cập bộ nhớ lưu trữ mã hóa của thiết bị và mở một tệp
+dữ liệu ứng dụng có sẵn:
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
Chỉ sử dụng bộ nhớ lưu trữ mã hóa của thiết bị +cho thông tin phải truy cập được trong chế độ Khởi động Trực tiếp. +Không sử dụng bộ nhớ lưu trữ mã hóa của thiết bị làm bộ lưu trữ mã hóa cho mục đích chung. +Đối với thông tin cá nhân của người dùng, hoặc dữ liệu được mã hóa không cần thiết +trong chế độ Khởi động Trực tiếp thì hãy sử dụng bộ nhớ lưu trữ mã hóa thông tin xác thực.
+ +Một khi người dùng mở khóa thiết bị sau khi khởi động lại, ứng dụng của bạn có thể chuyển sang +truy cập bộ nhớ lưu trữ mã hóa thông tin xác thực và sử dụng các dịch vụ thông thường của hệ thống +phụ thuộc vào thông tin xác thực người dùng.
+ +Để nhận thông báo khi người dùng mở khóa thiết bị sau khi khởi động lại,
+hãy đăng ký một {@link android.content.BroadcastReceiver} từ một thành phần đang chạy
+để lắng nghe thông báo ACTION_USER_UNLOCKED
. Hoặc bạn có thể
+nhận thông báo có sẵn {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} lúc này sẽ chỉ báo thiết bị đã khởi động xong và
+người dùng đã mở khóa thiết bị.
Bạn có thể truy vấn trực tiếp để biết người dùng đã mở khóa thiết bị hay chưa bằng cách gọi
+UserManager.isUserUnlocked()
.
Nếu người dùng cập nhật thiết bị của họ để sử dụng chế độ Khởi động Trực tiếp thì bạn có thể có dữ liệu
+hiện hữu cần được chuyển nhập sang bộ nhớ lưu trữ mã hóa của thiết bị. Sử dụng
+Context.migrateSharedPreferencesFrom()
và
+Context.migrateDatabaseFrom()
để chuyển nhập dữ liệu về tùy chọn và cơ sở dữ liệu
+giữa bộ nhớ lưu trữ mã hóa thông tin xác thực và bộ nhớ lưu trữ mã hóa thiết bị.
Hãy phán đoán hợp lý nhất khi quyết định dữ liệu nào nên chuyển nhập từ bộ nhớ lưu trữ mã hóa +thông tin xác thực sang bộ nhớ lưu trữ mã hóa thiết bị. Bạn không nên di chuyển +thông tin cá nhân của người dùng như mật khẩu hoặc các mã thông báo cấp quyền sang +bộ nhớ lưu trữ mã hóa thiết bị. Trong một số trường hợp, bạn có thể cần quản lý +các bộ dữ liệu riêng biệt trong hai bộ lưu trữ mã hóa.
+ +Kiểm thử ứng dụng nhận biết mã hóa bằng cách sử dụng chế độ Khởi động Trực tiếp mới. Có +hai cách để kích hoạt Khởi động Trực tiếp.
+ +Cẩn trọng: Kích hoạt Khởi động Trực tiếp +sẽ xóa sạch mọi dữ liệu người dùng trên thiết bị.
+ +Trên các thiết bị được hỗ trợ có Android N được cài đặt, kích hoạt +Khởi động Trực tiếp bằng cách thực hiện một trong các thao tác sau:
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
Cũng có một chế độ Khởi động Trực tiếp giả lập trong trường hợp bạn cần chuyển đổi +các chế độ trên thiết bị thử nghiệm. Chỉ nên sử dụng chế độ Giả lập trong quá trình +phát triển và có thể làm mất dữ liệu. Để kích hoạt chế độ Khởi động Trực tiếp giả lập, +hãy đặt mẫu hình khóa cho thiết bị, chọn "No thanks" nếu được yêu cầu + bật màn hình khởi động bảo mật khi đặt một mẫu hình khóa và sau đó sử dụng +lệnh shell adb sau:
+ ++$ adb shell sm set-emulate-fbe true ++ +
Hãy sử dụng lệnh sau để tắt chế độ Khởi động Trực tiếp giả lập:
+ ++$ adb shell sm set-emulate-fbe false ++ +
Sử dụng các lệnh này có thể khiến cho thiết bị khởi động lại.
diff --git a/docs/html-intl/intl/vi/preview/features/icu4j-framework.jd b/docs/html-intl/intl/vi/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..96316e989bfc --- /dev/null +++ b/docs/html-intl/intl/vi/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=API Khuôn khổ Android ICU4J + +@jd:body + ++ ICU4J là bộ thư viện Java mã nguồn mở được sử dụng rộng rãi để cung cấp hỗ trợ Unicode + và toàn cầu hóa cho các ứng dụng phần mềm. Android N + cung cấp một tập nhỏ các API ICU4J trong khuôn khổ Android cho các nhà phát triển ứng dụng + sử dụng trong gói {@code android.icu}. Các API này sử dụng + dữ liệu bản địa hóa có trong thiết bị. Do đó, bạn có thể giảm kích thước tệp APK + bằng cách không biên dịch các thư viện ICU4J vào tệp APK; thay vào đó bạn có thể + gọi chúng trong khuôn khổ một cách đơn giản. (Trong trường hợp này, bạn có thể muốn cung cấp + nhiều phiên bản + tệp APK để những người dùng chạy phiên bản Android thấp hơn Android N + có thể tải phiên bản ứng dụng có chứa các thư viện ICU4J.) +
+ ++ Tài liệu này sẽ bắt đầu bằng việc cung cấp thông tin cơ bản về các mức Android API + tối thiểu cần để hỗ trợ các thư viện này. Sau đó tài liệu sẽ giải thích những gì + bạn cần để hiểu được công việc triển khai ICU4J liên quan cụ thể đến Android. Cuối cùng, + tài liệu sẽ cho bạn biết cách sử dụng các API ICU4J trong khuôn khổ Android. +
+ +
+ Android N cung cấp một tập nhỏ các API ICU4J thông qua
+ gói android.icu
thay vì gói com.ibm.icu
.
+Khuôn khổ Android có thể chọn không
+ cung cấp các API ICU4J vì nhiều lý do; ví dụ, Android N không cung cấp
+ một số API bị loại bỏ hoặc những API chưa được đội ngũ ICU công bố là
+ bản ổn định. Vì nhóm ICU sẽ loại bỏ các API này trong tương lai do đó Android cũng sẽ đánh dấu
+ chúng là bị loại bỏ nhưng vẫn tiếp tục thêm vào.
+
Mức Android API | +Phiên bản ICU | +Phiên bản CLDR | +
---|---|---|
Android N | +56 | +28 | +
Sau đây là một vài lưu ý quan trọng:
+ +
+ Nếu bạn đã sử dụng các API ICU4J trong ứng dụng và
+ các API android.icu
đáp ứng yêu cầu của bạn thì việc chuyển nhập sang
+ các API của khuôn khổ đòi hỏi bạn phải thay đổi thành phần nhập vào của Java
+ từ com.ibm.icu
sang android.icu
. Khi đó bạn có thể
+ xóa các tệp ICU4J của bạn khỏi tệp APK.
+
+ Lưu ý: Các API khuôn khổ ICU4J sử dụng không gian tên {@code android.icu} + thay vì {@code com.ibm.icu}. Điều này là để tránh xung đột + không gian tên trong các tệp APK có chứa các thư viện {@code com.ibm.icu} của riêng chúng. +
+ +
+ Một số lớp trong gói java
vàandroid
có
+ các lớp tương ứng với các lớp trong ICU4J. Tuy nhiên, ICU4J thường cung cấp hỗ trợ
+ rộng hơn cho các tiêu chuẩn và ngôn ngữ.
+
Sau đây là một số ví dụ để giúp bạn bắt đầu:
+Lớp | +Thay thế | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J được phát hành theo giấy phép ICU. Hãy xem Hướng dẫn sử dụng + ICU để biết thêm chi tiết. +
diff --git a/docs/html-intl/intl/vi/preview/features/multi-window.jd b/docs/html-intl/intl/vi/preview/features/multi-window.jd new file mode 100644 index 000000000000..485bc284786f --- /dev/null +++ b/docs/html-intl/intl/vi/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=Hỗ trợ đa cửa sổ +page.metaDescription=Hỗ trợ mới trong Android N để hiển thị nhiều hơn một ứng dụng cùng lúc. +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N thêm hỗ trợ cho hiển thị đồng thời nhiều hơn một ứng dụng + vào cùng một thời điểm. Trên thiết bị cầm tay, hai ứng dụng có thể chạy song song hoặc + trên dưới nhau trong chế độ chia màn hình. Trên thiết bị TV, ứng dụng có thể + sử dụng chế độ ảnh trong ảnh để tiếp tục phát lại video trong khi người dùng + đang tương tác với ứng dụng khác. +
+ ++ Nếu bạn dựng ứng dụng của bạn bằng N Preview SDK, bạn có thể cấu hình cách ứng dụng của bạn + xử lý hiển thị đa cửa sổ. Ví dụ, bạn có thể quy định + các kích thước tối thiểu cho phép của hoạt động của bạn. Bạn cũng có thể vô hiệu hóa hiển thị đa cửa sổ cho + ứng dụng của bạn, đảm bảo rằng hệ thống chỉ hiển thị ứng dụng của bạn trong chế độ + toàn màn hình. +
+ ++ Android N cho phép một vài ứng dụng chia sẻ màn hình ngay lập tức. Ví + dụ, người dùng có thể chia đôi màn hình ra, xem một trang web ở bên trái màn hình + trong khi đang tạo email ở bên phải màn hình. Trải nghiệm này của người dùng phụ thuộc vào + thiết bị: +
+ ++ Người dùng có thể chuyển vào trong chế độ đa cửa sổ bằng các cách sau: +
+ ++ Người dùng có thể kéo và + thả từ một hoạt động sang một hoạt động khác trong khi các hoạt động này vẫn đang chia sẻ + cùng một màn hình. (Trước đó, người dùng chỉ có thể kéo và thả dữ liệu trong một hoạt động + đơn lẻ.) +
+ ++ Chế độ đa cửa sổ không thay đổi vòng đời + của hoạt động. +
+ ++ Trong chế độ đa cửa sổ, chỉ hoạt động mà người dùng đã tương tác gần đây nhất + mới hoạt động trong khoảng thời gian xác định. Hoạt động này được cân nhắc ở trên cùng. + Tất cả các hoạt động khác sẽ ở trong tình trạng tạm dừng, ngay cả khi chúng vẫn hiển thị. + Tuy nhiên, hệ thống sẽ cấp mức ưu tiên cao hơn cho hoạt động bị tạm dừng nhưng vẫn hiển thị này + so với các hoạt động không hiển thị. Nếu người dùng tương tác với một trong những + hoạt động bị tạm dừng, hoạt động đó sẽ được tiếp tục, và hoạt động trên cùng trước đó + sẽ bị tạm dừng. +
+ ++ Lưu ý: Trong chế độ đa cửa sổ, một ứng dụng có thể trong trạng thái + tạm dừng và vẫn hiển thị với người dùng. Ứng dụng có thể cần tiếp tục + các hoạt động của nó thậm chí trong khi đamg bị tạm dừng. Ví dụ, một ứng dụng phát video đang ở trong + chế độ tạm dừng nhưng vẫn hiển thị thì sẽ tiếp tục hiển thị video của nó. Vì lý do + này, chúng tôi đề nghị các hoạt động phát video không tạm dừng + video trong trình xử lý{@link android.app.Activity#onPause onPause()}. + Thay vào đó, các ứng dụng nên tạm dừng video trong {@link android.app.Activity#onStop + onStop()}, và tiếp tục phát lại trong {@link android.app.Activity#onStart + onStart()}. +
+ ++ Khi người dùng đặt một ứng dụng vào trong chế độ đa cửa sổ, hệ thống sẽ thông báo về + hoạt động thay đổi cấu hình đó, như được quy định trong Xử lý Thay đổi + Thời gian chạy. Về cơ bản, thay đổi này có ngụ ý về vòng đời hoạt động tương tự + vì khi hệ thống thông báo cho ứng dụng rằng thiết bị đã chuyển + từ chế độ hướng dọc sang chế độ ngang, ngoại trừ trường hợp các kích thước của thiết bị + đã được thay đổi thay vì chỉ bị hoán đổi. Như đã thảo luận trong phần Xử lý Thay đổi + Thời gian chạy, hoạt động của bạn có thể tự xử lý thay đổi cấu hình này, hoặc nó + có thể cho phép hệ thống hủy hoạt động này và tạo lại nó với + các kích thước mới. +
+ +
+ Nếu người dùng thay đổi kích thước của một cửa sổ và làm nó rộng hơn ở bất kỳ kích thước nào,
+ hệ thống sẽ thay đổi kích thước của hoạt động để khớp với hành động của người dùng và phát hành các thay đổi thời gian chạy
+ nếu cần. Nếu ứng dụng bị trễ lại trong khi vẽ các vùng mới được hiển thị,
+ hệ thống sẽ tạm thời lấp đầy các vùng đó bằng một màu được quy định bởi thuộc tính {@link
+ android.R.attr#windowBackground windowBackground} hoặc bằng thuộc tính kiểu
+ windowBackgroundFallback
mặc định.
+
+ Nếu ứng dụng của bạn nhắm đến Android N, bạn có thể cấu hình cách thức và + liệu các hoạt động của ứng dụng có hỗ trợ hiển thị đa cửa sổ không. Bạn có thể đặt + các thuộc tính trong bản kê khai của bạn để kiểm soát cả kích cỡ và bố trí. + Cài đặt thuộc tính của hoạt động gốc sẽ áp dụng cho tất cả các hoạt động + nằm trong ngăn xếp hoạt động của nó. +
+ ++ Lưu ý: Nếu bạn dựng một ứng dụng đa hướng bằng phiên bản + SDK thấp hơn Android N, và người dùng sử dụng ứng dụng đó trong + chế độ đa cửa sổ, hệ thống sẽ bắt buộc thay đổi kích thước của ứng dụng đó. Hệ thống sẽ hiển thị một + hộp hội thoại cảnh báo người dùng rằng ứng dụng này có thể có hành vi không như kỳ vọng. Hệ thống + không thay đổi kích cỡ của ứng dụng có hướng cố định; nếu + người dùng cố mở một ứng dụng có hướng cố định dưới chế độ đa cửa sổ, + ứng dụng này sẽ chiếm toàn bộ màn hình. +
+ +
+ Đặt thuộc tính này trong <activity>
của bản kê khai của bạn hoặc node
+ <application>
để kích hoạt hoặc vô hiệu hóa hiển thị
+ đa cửa sổ:
+
+android:resizeableActivity=["true" | "false"] ++ +
+ Nếu thuộc tính này được đặt thành true, hoạt động có thể được khởi chạy trong + chế độ chia màn hình và hình dạng tự do. Nếu thuộc tính này được đặt thành false, + hoạt động sẽ không hỗ trợ chế độ đa cửa sổ. Nếu giá trị này là false, và + người dùng cố khởi chạy hoạt động trong chế độ đa cửa sổ, hoạt động đó sẽ + chiếm toàn màn hình. +
+ ++ Nếu ứng dụng của bạn nhắm đến Android N, nhưng bạn chưa quy định giá trị + cho thuộc tính này, giá trị của thuộc tính sẽ mặc định đặt là true. +
+ +
+ Đặt thuộc tính này trong node <activity>
của bản kê khai của bạn để
+ cho biết liệu hoạt động này có hỗ trợ hiển thị ảnh trong ảnh hay không. Thuộc tính
+ này được bỏ qua nếu android:resizeableActivity
là false.
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ Với Android N, phần tử bản kê khai <layout>
+ có hỗ trợ một số thuộc tính sẽ ảnh hưởng đến cách hoạt động có hành vi như thế nào trong
+ chế độ đa cửa sổ:
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + Ví dụ, đoạn mã sau đây sẽ cho biết cách quy định kích thước và vị trí mặc định + của một hoạt động và kích thước tối thiểu của nó, khi hoạt động được hiển thị trong + chế độ hình dạng tự do: +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N có tính năng mới để hỗ trợ các ứng dụng có thể chạy + trong chế độ đa cửa sổ. +
+ ++ Một số tính năng bị vô hiệu hóa hoặc bỏ qua khi một thiết bị đang ở chế độ + đa cửa sổ bởi các tính năng này không có ý nghĩa đối với một hoạt động có thể đang chia sẻ + màn hình thiết bị với các hoạt động hoặc ứng dụng khác. Các tính năng đó bao gồm: + +
android:screenOrientation
.
+ + Các phương thức mới sau đây đã được thêm vào lớp {@link android.app.Activity} + để hỗ trợ hiển thị đa cửa sổ. Để biết chi tiết về mỗi phương thức, xem + Tham chiếu N Preview SDK. +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ Lưu ý: Chế độ Ảnh trong ảnh là trường hợp đặc biệt
+ của chế độ đa cửa sổ. Nếu myActivity.inPictureInPicture()
+ trả về là true, thì myActivity.inMultiWindow()
cũng trả về là
+ true.
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ Cũng có các phiên bản {@link android.app.Fragment} của từng phương thức
+ này, ví dụ như Fragment.inMultiWindow()
.
+
+ Để đặt một hoạt động vào trong chế độ ảnh trong ảnh, hãy gọi phương thức mới
+ Activity.enterPictureInPicture()
. Phương thức này sẽ không có ảnh hưởng nếu
+ thiết bị không hỗ trợ chế độ ảnh trong ảnh. Để biết thêm thông tin,
+ hãy xem tài liệu Ảnh trong ảnh.
+
+ Khi bạn khởi chạy một hoạt động mới, bạn có thể gợi ý cho hệ thống rằng hoạt động
+ mới sẽ được hiển thị liền kề hoạt động hiện tại, nếu có thể. Để thực hiện điều
+ này, hãy dùng cờ
+ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
. Việc chuyển
+ cờ này yêu cầu hành vi sau:
+
+ Nếu thiết bị đang ở chế độ hình dạng tự do và bạn đang khởi chạy một hoạt động mới, bạn có thể
+ quy định kích thước của hoạt động mới và vị trí màn hình bằng cách gọi
+ ActivityOptions.setLaunchBounds()
. Phương thức này sẽ không có ảnh hưởng nếu
+ thiết bị không ở chế độ đa cửa sổ.
+
+ Lưu ý: Nếu bạn khởi chạy một hoạt động trong một ngăn xếp tác vụ, hoạt động + này sẽ thay thế hoạt động trên màn hình, kế thừa tất cả các thuộc tính đa cửa sổ + của nó. Nếu bạn muốn khởi chạy hoạt động mới dưới dạng một cửa sổ + riêng trong chế độ đa cửa sổ, bạn phải khởi chạy nó trong một ngăn xếp tác vụ mới. +
+ ++ Người dùng có thể kéo và + thả dữ liệu từ một hoạt động này sang một hoạt động khác trong khi các hoạt động này vẫn đang + chia sẻ cùng một màn hình. (Trước đó, người dùng chỉ có thể kéo và thả dữ liệu trong một + hoạt động đơn lẻ.) Vì lý do này, bạn có thể muốn thêm tính năng kéo và thả + vào ứng dụng của bạn nếu ứng dụng của bạn hiện không hỗ trợ tính năng này. +
+ +
+ N Preview SDK mở rộng gói android.view
+ để hỗ trợ kéo và thả giữa các ứng dụng. Để biết chi tiết về các lớp và phương thức
+ sau, hãy xem Tham chiếu N
+ Preview SDK.
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
. Nếu bạn cần cấp quyền URI cho
+ hoạt động của đối tượng nhận, hãy chuyển các cờ mới
+ View.DRAG_FLAG_GLOBAL_URI_READ
hoặc
+ View.DRAG_FLAG_GLOBAL_URI_WRITE
, nếu phù hợp.
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + Dù cho bạn có cập nhật ứng dụng của mình lên Android N hay không, bạn cũng nên + xác minh cách thiết bị có hành vi như thế nào trong chế độ đa cửa sổ trong trường hợp người dùng cố khởi chạy nó + ở chế độ đa cửa sổ trên thiết bị chạy Android N. +
+ ++ Nếu bạn cài đặt Android N trên thiết bị, chế độ chia màn hình + sẽ được tự động hỗ trợ. +
+ ++ Nếu bạn dựng ứng dụng của mình bằng N Preview SDK, và người dùng cố sử dụng ứng dụng này + trong chế độ đa cửa sổ, hệ thống sẽ bắt buộc thay đổi kích thước của ứng dụng đó trừ khi ứng dụng này + khai báo hướng cố định. +
+ ++ Nếu ứng dụng không khai báo hướng cố định, bạn nên khởi chạy ứng dụng của bạn + trên thiết bị đang chạy Android N và cố đặt ứng dụng vào trong + chế độ chia màn hình. Xác minh rằng trải nghiệm người dùng là + chấp nhận được khi ứng dụng bị bắt buộc thay đổi kích cỡ. +
+ ++ Nếu ứng dụng khai báo hướng cố định, bạn nên cố đặt ứng dụng vào trong + chế độ đa cửa sổ. Xác minh xem khi bạn làm như vậy, ứng dụng vẫn giữ + ở chế độ toàn màn hình. +
+ ++ Nếu bạn dựng ứng dụng của bạn bằng N Preview SDK và chưa vô hiệu hóa + hỗ trợ đa cửa sổ, hãy xác minh hành vi sau dưới chế độ chia màn hình + và chế độ hình dạng tự do. +
+ ++ Để xác minh hiệu năng ứng dụng của bạn trong chế độ đa cửa sổ, hãy thử các thao tác + sau. Bạn nên thử các thao tác này trong cả chế độ chia màn hình và + chế độ đa cửa sổ, trừ khi có lưu ý khác. +
+ +
+ Nếu bạn đã vô hiệu hóa hỗ trợ đa cửa sổ bằng cách đặt
+ android:resizableActivity="false"
, bạn nên khởi chạy ứng dụng của mình trên
+ thiết bị chạy Android N và cố đặt ứng dụng này vào trong
+ cả chế độ hình dạng tự do và chế độ chia màn hình. Xác minh xem khi bạn làm như vậy, ứng dụng vẫn giữ
+ ở chế độ toàn màn hình.
+
Android N cung cấp hỗ trợ cải tiến cho người dùng sử dụng nhiều ngôn ngữ, +cho phép họ chọn nhiều bản địa trong phần cài đặt. Android N +cung cấp khả năng này bằng cách mở rộng số lượng lớn các bản địa được hỗ trợ +và thay đổi cách hệ thống phân giải tài nguyên. Phương thức phân giải tài nguyên +mới hoạt động mạnh mẽ hơn và được thiết kế để tương thích với các tệp APK có sẵn. Tuy nhiên +bạn cần kiểm tra thêm để phát hiện mọi hành vi không mong muốn. Ví dụ, bạn +cần kiểm thử để đảm bảo rằng ứng dụng của mình sẽ thiết lập mặc định cho ngôn ngữ mong muốn. Ngoài ra, +nếu ứng dụng của bạn hỗ trợ đa ngôn ngữ thì bạn cần đảm bảo rằng việc hỗ trợ này hoạt động như +dự kiến. Cuối cùng, bạn cần cố gắng đảm bảo rằng ứng dụng sẽ xử lý tinh tế +những ngôn ngữ mà bạn không có ý định thiết kế ứng dụng để hỗ trợ.
+ +Tài liệu này sẽ bắt đầu bằng việc giải thích về chiến lược phân giải tài nguyên trong phiên bản trước +Android N. Tiếp theo, tài liệu sẽ mô tả chiến lược phân giải tài nguyên +được cải tiến của Android N. Cuối cùng, tài liệu sẽ giải thích cách sử dụng +số lượng các bản địa được mở rộng để hỗ trợ thêm nhiều người dùng đa ngữ.
+ +Trước Android N, không phải lúc nào Android cũng có thể so khớp +thành công ứng dụng với các bản địa của hệ thống. Ví dụ, giả sử ngôn ngữ mặc định của ứng dụng của bạn + là Tiếng Anh (Mỹ) nhưng ứng dụng cũng có các xâu văn bản Tiếng Tây Ban Nha được bản địa hóa trong các tệp tài nguyên {@code es_ES} +.
+Khi mã nguồn Java tham chiếu đến các xâu đó thì nó sẽ phân giải các ngôn ngữ của xâu như +sau:
+Các vấn đề phân giải này phát sinh bởi vì hệ thống sẽ gỡ mã quốc gia + khỏi bản địa nếu nó không tìm thấy sự trùng khớp tuyệt đối. Ví dụ:
+ +Cài đặt Người dùng | +Tài nguyên Ứng dụng | +Phân giải tài nguyên | +
---|---|---|
fr_CH | +
+mặc định (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Thử fr_CH => Không được +Thử fr => Không được +Sử dụng mặc định (en) + |
+
Trong ví dụ này, hệ thống hiển thị các xâu Tiếng Anh mà không +xác định được liệu người dùng có biết Tiếng Anh hay không. Đây là hành vi khá phổ biến +ngày nay. Android N cần phải giảm bớt đáng kể tần suất +của những kết quả như vậy.
+ +Android N mang đến cách thức phân giải tài nguyên mạnh mẽ hơn, và
+tìm các giải pháp thay thế hiệu quả hơn một cách tự động. Tuy nhiên, để tăng tốc việc phân giải và nâng cao
+khả năng bảo trì, bạn cần lưu trữ các tài nguyên trong những nhánh ngôn ngữ mẹ phổ biến nhất.
+ Ví dụ, nếu trước đây lưu tài nguyên Tiếng Tây Ban Nha trong thư mục {@code es-US}
+ thì hãy chuyển chúng vào trong thư mục {@code es-419}, nơi chứa Tiếng Tây Ban Nha Mỹ La-tinh.
+ Tương tự, nếu bạn có các xâu tài nguyên trong một thư mục có tên {@code en-GB} thì hãy đổi tên
+ thư mục đó thành {@code en-001} (Tiếng Anh quốc tế) bởi vì nhánh mẹ
+phổ biến nhất cho chuỗi en-GB
là {@code en-001}.
+ Các ví dụ sau sẽ giải thích tại sao các thực hành này sẽ nâng cao hiệu năng và
+độ ổn định của việc phân giải tài nguyên.
Với Android N, trường hợp được mô tả trong Bảng 1 được phân giải +theo cách khác:
+ + +Cài đặt Người dùng | +Tài nguyên Ứng dụng | +Phân giải tài nguyên | +
---|---|---|
|
+
+mặc định (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+Thử fr_CH => Không được +Thử fr => Không được +Thử nhánh con của fr => fr_FR +Sử dụng fr_FR + |
+
Bây giờ thì người dùng sẽ nhận được tài nguyên Tiếng Pháp thay vì Tiếng Anh. Ví dụ này cũng cho thấy + lý do bạn nên lưu trữ các xâu Tiếng Pháp trong {@code fr} thay vì {@code fr_FR} + cho Android N. Phương pháp ở đây là ghép nhánh ngôn ngữ mẹ gần nhất, + giúp cho việc phân giải nhanh hơn và dễ dự đoán hơn.
+ +Ngoài lôgic phân giải được cải tiến này, Android giờ đây cung cấp thêm nhiều +ngôn ngữ cho người dùng lựa chọn. Chúng ta hãy thử lại ví dụ trên với Tiếng Ý + được xác định là một ngôn ngữ người dùng bổ sung nhưng không được ứng dụng hỗ trợ cho Tiếng Pháp.
+ + +Cài đặt Người dùng | +Tài nguyên Ứng dụng | +Phân giải tài nguyên | + +
---|---|---|
|
+
+mặc định (en) +de_DE +es_ES +it_IT + |
+
+Thử fr_CH => Không được +Thử fr => Không được +Thử nhánh con của fr => Không được +Thử it_CH => Không được +Thử it => Không được +Thử nhánh con của it => it_IT +Sử dụng it_IT + |
+
+
Người dùng vẫn nhận được ngôn ngữ họ biết mặc dù ứng dụng không +hỗ trợ Tiếng Pháp.
+ + +Android N bổ sung thêm một API {@code LocaleList.GetDefault()} + mới cho phép các ứng dụng truy vấn trực tiếp danh sách các ngôn ngữ mà người dùng đã chỉ định. API này +cho phép bạn tạo hành vi ứng dụng +phức tạp hơn và hiển thị nội dung được tối ưu hóa tốt hơn. Ví dụ, Tìm kiếm + có thể hiển thị các kết quả bằng nhiều ngôn ngữ dựa trên cài đặt của người dùng. Các ứng dụng trình duyệt + có thể tránh đề nghị dịch trang web sang một ngôn ngữ mà người dùng đó đã biết, + và các ứng dụng bàn phím có thể tự động bật tất cả các bố trí phù hợp.
+ +Tính tới Android 6.0 (API mức 23), Android 6.0 chỉ hỗ trợ một hoặc hai bản địa +cho nhiều ngôn ngữ phổ biến +(en, es, ar, fr, ru). Bởi vì chỉ có một vài biến thể của từng ngôn ngữ, +các ứng dụng không gặp vấn đề gì với việc lưu trữ một số chữ số và ngày tháng dưới dạng xâu được chèn trực tiếp khi viết mã +trong các tệp tài nguyên. Tuy nhiên, với tập hợp mở rộng các bản địa được hỗ trợ bởi Android, +có thể có +nhiều khác biệt lớn về các định dạng ngày tháng, thời gian, tiền tệ và thông tin +tương tự ngay cả trong một bản địa. Chèn trực tiếp các định dạng có thể khiến +người dùng cuối bối rối. Do đó, khi phát triển cho Android N +hãy đảm bảo sử dụng các bộ định dạng thay vì các xâu chữ số và ngày tháng được chèn trực tiếp khi viết mã.
+ +Một ví dụ điển hình là Tiếng Ả-rập với được Android N hỗ trợ mở rộng từ +một {@code ar_EG} tới 27 bản địa Tiếng Ả-rập. Các bản địa này có thể chia sẻ hầu hết các tài nguyên, +nhưng một số bản địa ưu tiên chữ số ASCII trong khi những bản địa khác lại ưu tiên con số truyền thống. Ví dụ, +khi bạn muốn soạn một câu có biến bằng số, như +"Choose a 4 digit pin" thì bạn hãy sử dụng bộ định dạng như sau:
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/vi/preview/features/notification-updates.jd b/docs/html-intl/intl/vi/preview/features/notification-updates.jd new file mode 100644 index 000000000000..d80cf6c08f5e --- /dev/null +++ b/docs/html-intl/intl/vi/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=Thông báo +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + +
Android N giới thiệu một số API mới cho phép ứng dụng đăng +các thông báo có khả năng hiển thị và tương tác cao.
+ +Android N mở rộng API thông báo {@link android.support.v4.app.RemoteInput} +hiện có để hỗ trợ trả lời giữa dòng trên thiết bị cầm tay. Tính năng này cho phép người dùng + phản hồi nhanh chóng từ khu vực hiển thị thông báo mà không cần truy cập ứng dụng của bạn.
+ ++ Android N cũng cho phép bạn gộp các thông báo tương tự nhau để + xuất hiện dưới dạng một thông báo đơn lẻ. Để điều này có thể xảy ra, Android N sử dụng phương thức {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} hiện có. Người dùng có thể mở rộng mỗi + thông báo, và thực hiện các hành động như trả lời và bỏ qua trên mỗi + thông báo, từng thông báo một từ khu vực hiển thị thông báo. +
+ +Cuối cùng, Android N cũng thêm các API mới cho phép bạn tận dụng các trang trí +của hệ thống trong các dạng xem thông báo tùy chỉnh của ứng dụng của bạn. Các API này giúp +đảm bảo rằng dạng xem thông báo có chung một cách trình bày nhất quán +với các mẫu tiêu chuẩn.
+ +Tài liệu này nêu bật một số các thay đổi chính mà bạn cần cân nhắc + khi sử dụng các tính năng thông báo mới trong ứng dụng của mình.
+ +Với tính năng Trả lời Trực tiếp trong Android N, người dùng có thể +phản hồi lại tin nhắn văn bản hoặc cập nhật danh sách tác vụ trực tiếp trong giao diện +của thông báo. Trên thiết bị cầm tay, hành động trả lời giữa dòng xuất hiện dưới dạng một nút bổ sung + được gắn kèm với thông báo đó. Khi người dùng trả lời qua bàn phím, hệ thống sẽ đính kèm + phản hồi bằng văn bản với ý định + bạn đã quy định cho hành động thông báo và gửi ý định đến ứng dụng cầm tay + của bạn. + + + +
+ +Để tạo một hành động thông báo hỗ trợ trả lời trực tiếp: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
.
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
Hệ thống sẽ nhắc người dùng nhập liệu một phản hồi khi chúng kích hoạt +hành động thông báo.
+ + + + +Để nhận mục nhập của người dùng từ giao diện thông báo đến hoạt động bạn +đã khai báo trong ý định của hành động trả lời:
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
Đoạn mã sau minh họa cách thức một phương thức truy xuất văn bản đầu vào +từ một gói:
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
Ứng dụng có thể áp dụng lô-gic để quyết định hành động nào nên lấy trên văn bản +được truy xuất. +Đối với các ứng dụng tương tác (chẳng hạn như trò chuyện), hãy cung cấp thêm ngữ cảnh trong chính thông báo + (ví dụ như nhiều dòng lịch sử trò chuyện, gồm có các tin nhắn của riêng người dùng) + để người dùng có thể phản hồi phù hợp. +Khi người dùng phản hồi qua {@link android.support.v4.app.RemoteInput}, + hãy bao gồm văn bản trong lịch sử trả lời bằng phương thức {@code setRemoteInputHistory()} +.
+ +Android N cung cấp cho các nhà phát triển một cách mới để hiển thị + hàng đợi thông báo: thông báo gộp. Cách hiển thị này tương tự với tính năng + Ngăn xếp + Thông báo có trong Android Wear. Ví dụ, nếu ứng dụng của bạn tạo thông báo + cho tin nhắn nhận được, khi có nhiều hơn một tin nhắn nhận được, hãy gói + các thông báo lại với nhau thành một nhóm đơn lẻ. Bạn có thể + sử dụng phương thức {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} hiện có để gói các thông báo tương tự.
+ ++ Nhóm thông báo sẽ quy định phân cấp trên các thông báo bao gồm nó. + Ở trên cùng của phân cấp là thông báo mẹ hiển thị tóm tắt + thông tin cho nhóm đó. Người dùng có thể mở rộng + nhóm thông báo tăng dần lên, và hệ thống sẽ hiển thị thêm thông tin khi + người dùng truy sâu hơn. Khi người dùng mở rộng gói này, hệ thống sẽ lộ ra thêm + thông tin cho tất cả các thông báo con của gói, khi người dùng + mở rộng một trong những thông báo đó, hệ thống sẽ lộ ra toàn bộ nội dung của nó. +
+ + + + +Để tìm hiểu cách thêm thông báo vào một nhóm, xem +Thêm +Mỗi Thông báo vào một Nhóm.
+ + +Mục này sẽ cung cấp hướng dẫn về việc khi nào sử dụng nhóm thông báo thay vì + các thông báo{@link android.app.Notification.InboxStyle InboxStyle} +có sẵn trong các phiên bản cũ hơn của +nền tảng Android.
+ +Bạn nên sử dụng các nhóm thông báo chỉ khi tất cả các điều kiện sau là +đúng đối với trường hợp sử dụng của bạn:
+ +Các ví dụ về các trường hợp sử dụng tốt nhóm thông báo bao gồm: ứng dụng nhắn tin +hiển thị danh sách các tin nhắn đến, hoặc ứng dụng email hiển thị danh sách +các email đã nhận được.
+ ++Ví dụ về các trường hợp trong đó một thông báo đơn lẻ được ưu tiên + bao gồm tin nhắn riêng từ một người đơn lẻ, hoặc biểu diễn danh sách + các mục văn bản một hàng. Bạn có thể sử dụng +({@link android.app.Notification.InboxStyle InboxStyle} hoặc +{@link android.app.Notification.BigTextStyle BigTextStyle}) để hoàn thành +việc này. +
+ ++ Ứng dụng sẽ luôn đăng tóm tắt nhóm, ngay cả khi nhóm chỉ chứa + một thông báo con duy nhất. Hệ thống này sẽ ngăn chặn tóm tắt và hiển thị trực tiếp + thông báo con nếu nó chỉ chứa một thông báo duy nhất. Điều này đảm bảo + rằng hệ thống có thể cung cấp một trải nghiệm nhất quán khi người dùng trượt nhanh khỏi + thông báo con của nhóm. +
+ ++ Lưu ý: Phiên bản Android N này không + ngăn chặn tóm tắt cho nhóm thông báo có chứa một thông báo con duy nhất. Chức năng + này sẽ được thêm vào trong phiên bản sau của Android N. +
+ +Trong khi hệ thống thường hiển thị các thông báo con dưới dạng một nhóm, bạn có thể đặt + chúng tạm thời hiển thị dưới dạng + + thông báo cảnh báo. Tính năng này đặc biệt hữu ích bởi vì nó cho phép + truy cập ngay lập tức thông báo con gần đây nhất và các hành động liên kết với thông báo con đó. +
+ + ++ Cả nhóm thông báo và đầu vào từ xa đều là một phần của API {@link + android.app.Notification} vì Android 5.0 (API mức 21) hỗ trợ + các thiết bị Android Wear. Nếu bạn đã dựng các thông báo bằng các API này, + hành động duy nhất bạn cần phải thực hiện là xác minh rằng ứng dụng có hành vi tương ứng + với các hướng dẫn đã mô tả ở trên, và cân nhắc việc triển khai {@code + setRemoteInputHistory()}. +
+ ++ Để hỗ trợ tính tương thích ngược, các API giống vậy sẽ được cung cấp cho + lớp {@link android.support.v4.app.NotificationCompat} + của thư viện hỗ trợ, cho phép bạn dựng các thông báo hoạt động trên các phiên bản + Android cũ hơn. Trên máy tính bảng và thiết bị cầm tay, người dùng chỉ nhìn thấy thông báo tóm tắt, + vì vậy ứng dụng vẫn có kiểu hòm thư hoặc thông báo tương tự + biểu diễn cho toàn bộ nội dung thông tin của nhóm. Vì các thiết bị Android + Wear cho phép người dùng xem các thông báo con thậm chí trên + các mức nền tảng thấp hơn, bạn nên dựng các thông báo con dù cho mức API + là mức nào. +
+ +Bắt đầu từ Android N, bạn có thể tùy chỉnh dạng xem và +vẫn có các trang trí hệ thống như tiêu đề thông báo, hành động, và +các bố trí mở rộng được.
+ +Để kích hoạt khả năng này, Android N thêm các API sau để tạo kiểu cho dạng xem tùy chỉnh + của bạn:
+ +Để sử dụng API mới này, hãy gọi phương thức {@code setStyle()}, chuyển nó sang +kiểu dạng xem tùy chỉnh mong muốn.
+ +Đoạn mã này cho biết cách dựng đối tượng thông báo tùy chỉnh bằng phương thức +{@code DecoratedCustomViewStyle()}.
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/vi/preview/features/picture-in-picture.jd b/docs/html-intl/intl/vi/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..4b3cb400f72e --- /dev/null +++ b/docs/html-intl/intl/vi/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=Ảnh trong ảnh +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
Trong Android N, người dùng Android TV đã có thể xem video +trong một cửa sổ được ghim vào một góc màn hình khi điều hướng bên trong +các ứng dụng. Chế độ Ảnh trong ảnh (PIP) cho phép ứng dụng chạy một hoạt động +video trong cửa sổ được ghim trong khi một hoạt động khác tiếp tục chạy +ngầm. Cửa sổ PIP cho phép người dùng thực hiện nhiều việc khi đang sử dụng ứng dụng của bạn, +giúp cho người dùng năng suất hơn.
+ +Ứng dụng của bạn có thể quyết định khi nào thì kích hoạt chế độ PIP. Sau đây là một vài ví dụ về +thời điểm chuyển vào chế độ PIP:
+ +Cửa sổ PIP có kích thước 240x135 dp và được hiển thị trên lớp trên cùng ở một trong +bốn góc của màn hình được hệ thống chọn. Người dùng có thể gọi ra một menu PIP +, cho phép họ bật tắt cửa sổ PIP lên toàn màn hình hoặc đóng cửa sổ +PIP bằng cách bấm giữ nút Home trên điều khiển từ xa. Nếu một video +khác bắt đầu phát trên màn hình chính, cửa sổ PIP sẽ tự động +được đóng. Người dùng cũng có thể đóng cửa sổ PIP thông qua nút Recents.
+ + + + +PIP sử dụng các API đa cửa sổ có trong Android N để +tạo cửa sổ video nằm chồng được ghim. Để thêm chế độ PIP vào ứng dụng bạn cần +đăng ký các hoạt động hỗ trợ PIP, chuyển hoạt động của bạn sang chế độ PIP khi +cần và đảm bảo cho các phần tử UI sẽ bị ẩn đi và phát lại video vẫn tiếp tục khi +hoạt động đó ở trong chế độ PIP.
+ +Theo mặc định, hệ thống không tự động hỗ trợ PIP cho các ứng dụng.
+Nếu bạn muốn hỗ trợ chế độ PIP trong ứng dụng của mình, hãy đăng ký hoạt động
+video trong bản kê khai bằng cách đặt
+android:supportsPictureInPicture
và
+android:resizeableActivity
thành true
. Ngoài ra, hãy chỉ định
+hoạt động của bạn xử lý các thay đổi cấu hình bố trí để hoạt động đó
+không khởi chạy lại khi có các thay đổi về bố trí trong quá trình chuyển tiếp chế độ PIP.
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
Khi đăng ký hoạt động của bạn, hãy nhớ rằng trong chế độ PIP, hoạt động +của bạn sẽ được hiển thị trong một cửa sổ nhỏ nằm chồng trên màn hình TV. Các hoạt động +phát lại video với UI tối giản sẽ đem đến trải nghiệm người dùng tốt nhất. Các hoạt động +có chứa những phần tử UI nhỏ có thể không đem lại trải nghiệm người dùng đạt yêu cầu +khi được chuyển sang chế độ PIP bởi người dùng không thể thấy các chi tiết của phần tử UI +trong cửa sổ PIP.
+ +Activity.enterPictureInPicture()
. Ví dụ sau sẽ chuyển
+sang chế độ PIP khi người dùng chọn một nút PIP riêng trên thanh điều khiển
+media:
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
Thêm một nút PIP vào thanh điều khiển media của bạn sẽ cho phép người dùng dễ dàng chuyển +sang chế độ PIP khi điều khiển phát lại video.
+ + + + +Android N có một lớp
+PlaybackControlsRow.PictureInPictureAction
mới định nghĩa
+các hành động ở chế độ PIP trên thanh điều khiển và sử dụng biểu tượng PIP.
Khi hoạt động của bạn vào trong chế độ PIP thì hoạt động đó chỉ nên hiển thị phát lại
+video. Hãy xóa các phần tử UI trước khi hoạt động của bạn vào chế độ PIP,
+và khôi phục các phần tử này khi hoạt động quay lại chế độ toàn màn hình.
+Ghi đè phương thức Activity.onPictureInPictureChanged()
hoặc
+Fragment.onPictureInPictureChanged()
và bật hoặc
+tắt các phần tử UI khi cần thiết, ví dụ:
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
Khi hoạt động của bạn chuyển sang chế độ PIP thì hệ thống sẽ coi hoạt động đó đang ở trong
+trạng thái tạm dừng và sẽ gọi phương thức onPause()
của hoạt động. Việc phát lại
+video không nên được tạm dừng và cần được tiếp tục phát nếu hoạt động
+bị tạm dừng do chế độ PIP. Hãy kiểm tra chế độ PIP trong phương thức
+onPause()
của hoạt động và xử lý việc phát lại cho phù hợp, ví
+dụ:
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
Khi hoạt động của bạn chuyển ra khỏi chế độ PIP để quay trở về chế độ toàn màn hình thì
+hệ thống sẽ tiếp tục hoạt động của bạn và gọi phương thức onResume()
.
PIP được dành cho các hoạt động phát lại video toàn màn hình. Khi chuyển +hoạt động của bạn vào chế độ PIP, hãy tránh hiển thị bất kỳ nội dung nào ngoài video. +Theo dõi khi hoạt động của bạn vào chế độ PIP và ẩn đi các phần tử UI, như mô tả +trong Xử lý UI trong chế độ Ảnh trong ảnh.
+ +Vì cửa sổ PIP được hiển thị dưới dạng cửa sổ nổi ở góc +màn hình do đó bạn cần tránh hiển thị các thông tin quan trọng trong màn hình chính +ở bất kỳ vùng nào có thể bị che khuất bởi cửa sổ PIP.
+ +Theo mặc định, khi một hoạt động đang ở trong chế độ PIP thì nó sẽ không nhận tiêu điểm nhập vào. Để
+tiếp nhận các sự kiện nhập vào khi ở chế độ PIP, hãy sử dụng
+MediaSession.setMediaButtonReceiver()
.
Các ứng dụng như ứng dụng ảnh thường chỉ cần truy cập đến các thư mục đã quy định trong
+bộ nhớ ngoài như thư mục Pictures
. Các phương pháp
+ hiện tại để truy cập bộ nhớ lưu trữ ngoài vẫn chưa được thiết kế để dễ dàng cho phép
+truy cập thư mục đích cho những kiểu ứng dụng này. Ví dụ:
Android N cung cấp một API mới được đơn giản hóa để truy cập +các thư mục lưu trữ bên ngoài thường dùng.
+ +Sử dụng lớp StorageManager
để lấy thực thể
+StorageVolume
phù hợp. Sau đó tạo một ý định bằng cách gọi phương thức
+StorageVolume.createAccessIntent()
của thực thể đó.
+Sử dụng ý định này để truy cập các thư mục lưu trữ bên ngoài. Để lấy danh sách
+tất cả các ổ đĩa, bao gồm các ổ đĩa media có thể tháo lắp, hãy sử dụng
+StorageManager.getVolumesList()
.
Đoạn mã sau là một ví dụ về cách mở thư mục
+Pictures
trong bộ nhớ lưu trữ chính được chia sẻ:
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Hệ thống sẽ cố gắng cấp quyền truy cập tới thư mục bên ngoài và nếu +cần sẽ xác nhận quyền truy cập với người dùng bằng một UI được đơn giản hóa:
+ + + + +Nếu người dùng cấp quyền truy cập, hệ thống sẽ gọi phương thức ghi đè
+onActivityResult()
của bạn với mã kết quả là
+Activity.RESULT_OK
và dữ liệu ý định có chứa URI. Hãy sử dụng
+URI được cung cấp để truy cập thông tin thư mục, giống như sử dụng các URI
+được trả về bởi
+Khuôn khổ
+ Truy cập Kho lưu trữ.
Nếu người dùng không cấp quyền truy cập, hệ thống sẽ gọi phương thức ghi đè
+onActivityResult()
của bạn với mã kết quả là
+Activity.RESULT_CANCELED
và dữ liệu ý định có giá trị null.
Lưu ý: Lấy quyền truy cập tới một thư mục bên ngoài được chỉ định +cũng sẽ cấp quyền truy cập tới các thư mục con thuộc thư mục đó.
+ +Để sử dụng Truy cập Thư mục theo Phạm vi nhằm truy cập các thư mục trên phương tiện có thể tháo lắp, +trước hết, hãy thêm một {@link android.content.BroadcastReceiver} để lắng nghe +thông báo {@link android.os.Environment#MEDIA_MOUNTED}, ví dụ:
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
Khi người dùng kết nối một phương tiện có thể tháo lắp như thẻ SD thì hệ thống sẽ gửi một thông báo
+{@link android.os.Environment#MEDIA_MOUNTED}. Thông báo này
+sẽ cung cấp một đối tượng StorageVolume
trong dữ liệu ý định mà bạn có thể
+sử dụng để truy cập các thư mục trên phương tiện có thể tháo lắp đó. Ví dụ sau
+sẽ truy cập thư mục Pictures
trên phương tiện có thể tháo lắp:
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
Khi có thể, hãy duy trì URI truy cập thư mục bên ngoài để bạn không phải
+lặp lại yêu cầu người dùng cấp quyền truy cập. Khi người dùng đã cấp quyền truy cập, hãy gọi
+getContentResolver().takePersistableUriPermssion()
với
+URI truy cập thư mục. Hệ thống sẽ duy trì URI và các yêu cầu
+truy cập sau này sẽ trả về RESULT_OK
và không hiển thị UI xác nhận cho
+người dùng nữa.
Nếu người dùng từ chối quyền truy cập đến một thư mục bên ngoài thì đừng +yêu cầu truy cập lại ngay lập tức. Lặp đi lặp lại yêu cầu truy cập sẽ dẫn đến trải nghiệm +người dùng không tốt.
diff --git a/docs/html-intl/intl/vi/preview/features/security-config.jd b/docs/html-intl/intl/vi/preview/features/security-config.jd new file mode 100644 index 000000000000..8d8bf34ff737 --- /dev/null +++ b/docs/html-intl/intl/vi/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=Cấu hình Bảo mật mạng +page.keywords=preview,security,network + +@jd:body + ++ Android N có tính năng Cấu hình Bảo mật mạng + cho phép ứng dụng tùy chỉnh các cài đặt bảo mật mạng trong một tệp + cấu hình khai báo an toàn mà không cần sửa đổi mã nguồn ứng dụng. Các cài đặt này có thể + được cấu hình cho các miền cụ thể và cho một ứng dụng cụ thể. Các khả năng + chính của tính năng này như sau: +
+ ++ Tính năng Cấu hình Bảo mật mạng sử dụng một tệp XML làm nơi bạn sẽ chỉ định + các cài đặt cho ứng dụng của mình. Bạn phải bổ sung một mục nhập trong bản kê khai của + ứng dụng để trỏ đến tệp này. Đoạn mã sau của một bản kê khai + minh họa cách tạo mục nhập này: +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ Một ứng dụng có thể muốn tin cậy một bộ các CA tùy chỉnh thay vì mặc định + của nền tảng. Những lý do phổ biến nhất cho điều này là: +
+ ++ Theo mặc định, các kết nối bảo mật (vd: TLS, HTTPS) từ mọi ứng dụng sẽ tin cậy + các CA của hệ thống được cài đặt trước và các ứng dụng nhắm mục tiêu mức API 23 + (Android M) và thấp hơn theo mặc định cũng tin cậy kho lưu trữ CA được người dùng bổ sung. Một + ứng dụng có thể tùy chỉnh các kết nối của riêng nó bằng cách sử dụng {@code base-config} (dành cho + tùy chỉnh trên phạm vi ứng dụng) hoặc {@code domain-config} (tùy chỉnh + cho mỗi miền). +
+ + ++ Giả sử bạn muốn kết nối tới máy chủ của mình có sử dụng các chứng chỉ + SSL tự ký hoặc tới một máy chủ có chứng chỉ SSL được cấp bởi một CA không công khai + mà bạn tin cậy, chẳng hạn như CA nội bộ của công ty. +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Thêm chứng chỉ CA tự ký hoặc không công khai theo định dạng PEM hoặc DER vào + {@code res/raw/my_ca}. +
+ + ++ Một ứng dụng không muốn tin cậy mọi CA được hệ thống tin cậy có thể + chỉ định bộ CA hạn chế của riêng nó để tin cậy. Điều này sẽ bảo vệ + ứng dụng khỏi các chứng chỉ lừa đảo được cấp bởi bất kỳ CA nào khác. +
+ ++ Cấu hình để giới hạn bộ CA đáng tin cậy cũng giống như Tin cậy một CA tùy chỉnh cho một miền cụ thể ngoại trừ + việc nhiều CA được cung cấp trong tài nguyên. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ Thêm các CA đáng tin cậy theo định dạng PEM hoặc DER vào {@code res/raw/trusted_roots}.
+ Lưu ý rằng nếu sử dụng định dạng PEM thì tệp chỉ được chứa dữ liệu PEM
+ và không có thêm dữ liệu văn bản. Bạn cũng có thể cung cấp nhiều
+ phần tử <certificates>
+ thay vì một phần tử.
+
+ Một ứng dụng có thể muốn tin cậy các CA bổ sung không được hệ thống tin cậy, + điều này có thể do hệ thống chưa thêm CA đó hoặc một CA không + đáp ứng các yêu cầu để đưa vào hệ thống Android. Một + ứng dụng có thể thực hiện điều này bằng cách chỉ định nhiều nguồn chứng chỉ cho một + cấu hình. +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ Khi gỡ lỗi một ứng dụng kết nối qua HTTPS thì bạn có thể muốn + kết nối tới một máy chủ phát triển cục bộ không có chứng chỉ + SSL dành cho máy chủ thương mại của bạn. Để hỗ trợ cho trường hợp này mà không cần + chỉnh sửa mã nguồn ứng dụng của bạn thì bạn có thể chỉ định các CA chỉ dùng cho gỡ lỗi + mà chỉ được tin cậy khi +android:debuggable + là {@code true} bằng cách sử dụng {@code debug-overrides}. Thông thường các IDE và công cụ + dựng sẽ đặt cờ này tự động đối với các bản dựng không dùng để phát hành. +
+ ++ Làm như vậy an toàn hơn so với mã điều kiện thông thường bởi, là điều kiện + bảo mật tiên quyết, các cửa hàng ứng dụng không chấp nhận các ứng dụng được đánh dấu + là hỗ trợ gỡ lỗi. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ Các ứng dụng có ý định kết nối tới các điểm đích chỉ sử dụng các kết nối + bảo mật có thể bỏ hỗ trợ truyền gửi văn bản không mã hóa (bằng giao thức + HTTP không mã hóa thay vì HTTPS) tới các đích đó. Tùy chọn này giúp ngăn + các hồi quy tiềm tàng trong ứng dụng do thay đổi trong các URL được cung cấp bởi các nguồn + bên ngoài như các máy chủ phụ trợ. + Hãy xem {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()} để biết thêm chi tiết. +
+ ++ Ví dụ, một ứng dụng có thể đảm bảo rằng mọi kết nối tới {@code + secure.example.com} luôn được thực hiện qua HTTPS để bảo vệ việc truyền gửi dữ liệu nhạy cảm + khỏi các mạng có hại. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ Thông thường thì một ứng dụng sẽ tin cậy mọi CA được cài đặt sẵn. Nếu bất kỳ CA nào trong số này sẽ + phát hành một chứng chỉ lừa đảo thì ứng dụng sẽ gặp phải rủi ro từ một cuộc tấn công + MiTM. Một số ứng dụng chọn cách giới hạn bộ chứng chỉ được chúng chấp nhận + bằng cách giới hạn bộ CA được ứng dụng tin cậy hoặc bằng cách ghim chứng chỉ. +
+ ++ Ghim chứng chỉ được thực hiện bằng cách cung cấp một bộ chứng chỉ theo mã hash của + khóa công khai (SubjectPublicKeyInfo của chứng chỉ X.509). Một chuỗi + chứng chỉ khi đó chỉ hợp lệ nếu như chuỗi chứng chỉ có chứa ít nhất một trong + các khóa công khai được ghim. +
+ ++ Lưu ý rằng khi sử dụng ghim chứng chỉ bạn phải luôn kèm thêm một khóa + dự phòng để nếu bạn bị buộc phải chuyển sang các khóa mới hoặc thay đổi các CA (khi + ghim vào một chứng chỉ CA hoặc một chứng chỉ trung gian của CA đó) thì + kết nối của ứng dụng sẽ không bị ảnh hưởng. Nếu không bạn phải đưa ra một + bản cập nhật cho ứng dụng để khôi phục khả năng kết nối. +
+ ++ Ngoài ra, có thể đặt thời gian hết hạn cho các ghim, sau thời gian đó + sẽ không tiến hành ghim được. Điều này giúp phòng ngừa các vấn đề về kết nối trong + ứng dụng chưa được cập nhật. Tuy nhiên, việc đặt thời gian hết hạn + trên các ghim này có thể khiến ghim bị bỏ qua. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ Các giá trị chưa được đặt trong một cấu hình cụ thể sẽ được kế thừa. Hành vi này cho phép tạo ra các cấu hình phức tạp + hơn trong khi vẫn giữ cho tệp cấu hình có thể đọc được. +
+ ++ Nếu một giá trị không được đặt trong một mục nhập cụ thể thì giá trị thuộc mục nhập + bao quát hơn tiếp theo sẽ được sử dụng. Các giá trị chưa được đặt trong {@code domain-config} sẽ được + lấy từ phần tử cha {@code domain-config} nếu như được lồng, hoặc từ {@code + base-config} nếu không được lồng. Các giá trị chưa được đặt trong {@code base-config} sẽ sử dụng + các giá trị mặc định của nền tảng. +
+ ++ Ví dụ: hãy xem xét trường hợp tất cả các kết nối tới miền con của {@code + example.com} phải sử dụng một bộ CA tùy chỉnh. Ngoài ra, truyền gửi văn bản không mã hóa tới + các miền này được cho phép trừ khi kết nối tới {@code + secure.example.com}. Bằng cách lồng cấu hình cho {@code + secure.example.com} bên trong cấu hình cho {@code example.com} thì + {@code trust-anchors} không cần phải được sao lặp. +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ Tính năng Cấu hình Bảo mật mạng sử dụng một định dạng tệp XML. + Cấu trúc chung của tệp này được thể hiện trong đoạn mẫu mã nguồn sau: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ Các phần sau sẽ mô tả cú pháp và các chi tiết khác của định dạng + tệp này. +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
.
+
++ Bất kỳ giá trị nào chưa được đặt sẽ sử dụng các giá trị mặc định của nền tảng. Cấu hình + mặc định cho các ứng dụng nhắm mục tiêu API mức 24 trở lên: +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++Cấu hình mặc định cho các ứng dụng nhắm mục tiêu API mức 23 trở xuống: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
được lồngLưu ý rằng nếu nhiều phần tử {@code domain-config} chứa một điểm đích thì cấu hình có quy tắc miền trùng khớp +cụ thể nhất (dài nhất) sẽ được sử dụng.
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ Xác định xem liệu các CA từ nguồn này có bỏ qua việc ghim chứng chỉ hay không. Nếu {@code + "true"} thì các chuỗi chứng chỉ mà xâu qua một trong các CA từ nguồn + này thì khi đó ghim sẽ không được thực hiện. Đây có thể là điều có ích cho các CA gỡ lỗi + hoặc để hỗ trợ cho người dùng tấn công MiTM hoạt động truyền gửi bảo mật của ứng dụng. +
+ ++ Mặc định là {@code "false"} trừ khi được chỉ định trong một phần tử {@code debug-overrides} +, khi đó mặc định là {@code "true"}. +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
để biết định dạng của các ghim.
+ + Việc hết hạn giúp phòng ngừa các vấn đề về khả năng kết nối trong ứng dụng làm cho không + nhận được các bản cập nhật cho bộ ghim, chẳng hạn như do người dùng + vô hiệu hóa các bản cập nhật ứng dụng. +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
Các dịch vụ nguồn vào TV cho phép người dùng tạm dừng và tiếp tục phát lại kênh thông qua +các API chuyển dịch thời gian. Android N mở rộng thêm chuyển dịch thời gian +bằng cách cho phép người dùng lưu nhiều chương trình được ghi lại.
+ +Người dùng có thể tạo lịch ghi lại trước hoặc tiến hành ghi lại khi họ xem +một chương trình. Khi hệ thống đã lưu bản ghi lại, người dùng có thể duyệt, quản lý +và phát lại bản ghi đó bằng ứng dụng TV của hệ thống.
+ +Nếu bạn muốn cung cấp tính năng ghi lại cho dịch vụ nguồn vào TV, +bạn phải báo cho hệ thống biết ứng dụng của bạn hỗ trợ ghi lại, triển khai +khả năng ghi chương trình, xử lý và thông báo bất kỳ lỗi nào xuất hiện +trong quá trình ghi lại và quản lý các chương trình được ghi lại.
+ +Để thông báo cho hệ thống biết dịch vụ nguồn vào TV của bạn hỗ trợ ghi lại, hãy thực hiện +các bước sau:
+ +TvInputService.onCreate()
của bạn, hãy tạo một đối tượng
+TvInputInfo
mới sử dụng lớp TvInputInfo.Builder
+.TvInputInfo
mới, hãy gọi
+setCanRecord(true)
trước khi gọi build()
để
+chỉ báo dịch vụ của bạn hỗ trợ ghi lại.TvInputInfo
với hệ thống bằng cách gọi
+TvInputService.updateTvInputInfo()
.Sau khi dịch vụ nguồn vào TV của bạn đăng ký để hỗ trợ tính năng
+ghi lại, hệ thống sẽ gọi phương thức
+TvInputService.onCreateRecordingSession()
của bạn khi cần truy cập
+phần triển khai ghi lại của ứng dụng. Triển khai lớp con
+TvInputService.RecordingSession
của bạn và trả nó về
+khi hàm gọi lại onCreateRecordingSession()
+được gọi. Lớp con này chịu trách nhiệm chuyển sang dữ liệu kênh phù hợp,
+ghi lại dữ liệu được yêu cầu và thông báo trạng thái ghi lại và các lỗi cho
+hệ thống.
Khi hệ thống gọi RecordingSession.onTune()
, chuyển vào một
+URI của kênh, chỉnh vào kênh mà URI đó chỉ định. Thông báo cho hệ thống biết
+ứng dụng của bạn đã chỉnh vào kênh mong muốn bằng cách gọi notifyTuned()
,
+hoặc nếu ứng dụng không thể chỉnh vào kênh phù hợp, hãy gọi
+notifyError()
.
Tiếp theo hệ thống sẽ gọi hàm gọi lại RecordingSession.onStartRecording()
+. Ứng dụng của bạn phải bắt đầu ghi lại ngay lập tức. Khi hệ thống gọi
+hàm gọi lại này, hệ thống có thể cung cấp một URI có chứa thông tin về chương trình
+sắp được ghi lại. Khi kết thúc việc ghi lại, bạn cần sao chép dữ liệu
+này vào bảng dữ liệu RecordedPrograms
.
Cuối cùng, hệ thống sẽ gọi RecordingSession.onStopRecording()
.
+Lúc này, ứng dụng của bạn phải dừng ghi lại ngay lập tức. Bạn cũng cần
+tạo một mục nhập trong bảng RecordedPrograms
. Mục này cần
+có URI dữ liệu của chương trình được ghi lại trong
+cột RecordedPrograms.COLUMN_RECORDING_DATA_URI
, và bất kỳ thông tin
+về chương trình mà hệ thống đã cung cấp trong lần gọi đầu tiên tới
+onStartRecording()
.
Để biết thêm thông tin về cách truy cập bảng RecordedPrograms
+hãy xem Quản lý các chương trình được ghi lại.
Nếu xảy ra lỗi trong quá trình ghi lại, làm cho dữ liệu ghi lại không sử dụng được thì
+hãy thông báo cho hệ thống bằng cách gọi RecordingSession.notifyError()
.
+Tương tự, bạn có thể gọi notifyError()
sau khi một chương trình ghi lại
+được tạo để cho phép hệ thống biết được ứng dụng của bạn không còn tiếp tục ghi các chương trình.
Nếu xảy ra lỗi trong quá trình ghi lại, nhưng có khả năng là một phần dữ liệu
+ghi lại có thể được sử dụng để người dùng phát lại thì hãy gọi
+RecordingSession.notifyRecordingStopped()
để cho phép hệ thống
+sử dụng một phần chương trình đó.
Hệ thống lưu giữ thông tin cho mọi chương trình được ghi lại từ tất cả
+các ứng dụng kênh truyền hình hỗ trợ ghi lại trong bảng trình cung cấp nội dungTvContract.RecordedPrograms
+. Có thể truy cập thông tin này qua URI nội dung
+RecordedPrograms.Uri
. Hãy sử dụng các API trình cung cấp nội dung để
+đọc, thêm và xóa các mục trong bảng này.
Để biết thêm thông tin về thao tác với dữ liệu trình cung cấp nội dung, hãy xem + +Nội dung Cơ bản về Trình cung cấp Nội dung.
+ +Các thiết bị TV có thể có bộ nhớ lưu trữ hạn chế do đó phán đoán hợp lý nhất khi
+phân bổ bộ nhớ lưu trữ để lưu các chương trình được ghi lại. Sử dụng
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
khi
+không có đủ dung lượng trống để lưu một chương trình được ghi lại.
Khi người dùng khởi tạo quá trình ghi lại, bạn cần tiến hành ghi lại dữ liệu nhanh nhất
+có thể. Để hỗ trợ công việc này, hãy hoàn thành tất cả các tác vụ tốn thời gian trước đó,
+như truy cập và phân bổ không gian lưu trữ khi hệ thống gọi hàm gọi lại
+onCreateRecordingSession()
. Làm như vậy sẽ cho phép bạn tiến hành
+việc ghi lại ngay lập tức khi hàm gọi lại onStartRecording()
+được gọi.
Android N cung cấp hỗ trợ cho các tính năng của ngôn ngữ Java 8 + mà bạn có thể sử dụng khi phát triển các ứng dụng nhắm mục tiêu Android N. + Trang này mô tả các tính năng ngôn ngữ mới được hỗ trợ trong Bản xem trước + Android N, cách thiết lập dự án đúng để sử dụng chúng và các vấn đề + đã biết mà bạn có thể gặp phải. +
+ +Để bắt đầu sử dụng các tính năng này, bạn cần tải xuống và cài đặt Android +Studio 2.1 (bản xem trước) và SDK của Bản xem trước Android N gồm có Jack toolchain +cần thiết và Bổ trợ Android được cập nhật cho Gradle. Nếu bạn chưa +cài đặt SDK Bản xem trước Android N, hãy xem Thiết lập để Phát triển dành cho Android N.
+ + + ++ Lưu ý: Sử dụng các tính năng mới của ngôn ngữ Java 8 không phải là một + yêu cầu để phát triển các ứng dụng nhắm mục tiêu nền tảng Android N. Nếu bạn + không muốn viết mã với các tính năng của ngôn ngữ Java 8 thì bạn có đặt các giá trị + mã nguồn và tương thích mục tiêu thành Java 7. Tuy nhiên, bạn vẫn + phải biên dịch với JDK 8 để dựng cho nền tảng Android N. +
+ ++ Hiện thời, Android không hỗ trợ tất cả các tính năng của ngôn ngữ Java 8. Tuy nhiên, + các tính năng sau sẽ sử dụng được khi phát triển ứng dụng nhắm mục tiêu + Bản xem trước Android N: +
+ ++ Ngoài ra, các API tính năng của ngôn ngữ Java 8 cũng được hỗ trợ: +
+ ++ Lưu ý: Android N kế thừa việc triển khai các + biểu thức lambda trên các lớp ẩn danh. Phương pháp này cho phép chúng + tương thích ngược và có thể chạy trên các phiên bản Android cũ hơn. Để kiểm thử + các biểu thức lambda trên các phiên bản cũ hơn, hãy nhớ vào tệp {@code + build.gradle} và đặt {@code compileSdkVersion} và {@code + targetSdkVersion} thành 23 hoặc thấp hơn. +
+ ++ Để sử dụng các tính năng mới của ngôn ngữ Java 8 bạn cũng cần sử dụng + Jack toolchain mới. Toolchain Android + mới sẽ biên dịch mã nguồn của ngôn ngữ Java sang mã bytecode + dex đọc được của Android, có định dạng thư viện {@code .jack} riêng của nó và cung cấp hầu hết các tính năng + toolchain dưới dạng một phần của công cụ riêng lẻ: đóng gói lại, thu gọn, làm rối mã và + multidex. +
+ +Sau đây là phần so sánh hai toolchain được sử dụng để dựng các tệp DEX Android:
++ Để kích hoạt các tính năng ngôn ngữ Java 8 và Jack cho dự án của bạn, hãy nhập + nội dung sau vào tệp {@code build.gradle} theo mô-đun: +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Instant Run, được giới thiệu trong Android Studio 2.0 (Beta), hiện không hoạt động + với Jack và sẽ bị vô hiệu hóa khi sử dụng toolchain mới. +
+ +Bởi vì Jack không tạo ra các tệp lớp trung gian khi biên dịch một +ứng dụng, các công cụ phụ thuộc vào những tệp này hiện thời không hoạt động với Jack. Một số +ví dụ về các công cụ này là:
+ +Vui lòng thông báo lỗi nếu bạn phát hiện các vấn đề khác khi sử dụng Jack.
\ No newline at end of file diff --git a/docs/html-intl/intl/vi/preview/overview.jd b/docs/html-intl/intl/vi/preview/overview.jd new file mode 100644 index 000000000000..0df55e348927 --- /dev/null +++ b/docs/html-intl/intl/vi/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=Tổng quan về Chương trình +page.metaDescription=Hãy chuẩn bị ứng dụng sẵn sàng cho phiên bản Android tiếp theo. +page.image=images/cards/card-n-overview_2x.png +meta.tags="preview", "developer", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ Chào mừng bạn đến với Android N Developer Preview, một chương trình + cung cấp cho bạn mọi thứ cần thiết để kiểm thử và tối ưu hóa các ứng dụng cho phiên bản + Android tiếp theo. Đây là chương trình miễn phí và bạn có thể bắt đầu ngay bằng cách + tải xuống các công cụ của N Developer Preview. +
+ + + + + + + ++ Chạy và kiểm thử ứng dụng của bạn trên một loạt các thiết bị hoặc trên bộ giả lập. + +
++ Chúng tôi sẽ cung cấp các bản cập nhật hàng tháng trong thời gian của Preview vì vậy bạn sẽ được kiểm tra các thay đổi nền tảng mới nhất. +
++ Trong một vài tuần đầu, chúng tôi sẽ dành ưu tiên cho các vấn đề + được nhà phát triển báo cáo, vì vậy hãy kiểm thử và gửi phản hồi sớm nhất có thể. +
++ Tiến hành công việc sớm để hỗ trợ các hành vi mới của nền tảng và phát triển với các tính năng mới. +
++ Các bản cập nhật liền mạch qua sóng vô tuyến cho bất kỳ thiết bị nào được hỗ trợ thông qua + Chương trình Android Beta. Không cần phải flash. +
++ Báo cáo các vấn đề và gửi phản hồi về cho chúng tôi thông qua + bộ theo dõi vấn đề của chúng tôi. Kết nối với các nhà phát triển + khác trong + Cộng đồng Nhà phát triển N. +
++ N Developer Preview sẽ kéo dài từ 9 tháng 3 năm 2016 đến khi phát hành công chúng + bản Android N cuối cùng cho AOSP và OEM, dự kiến trong Q3 2016. +
+ ++ Tại các mốc phát triển chính chúng tôi sẽ cung cấp các bản cập nhật cho môi trường phát triển và + kiểm thử của bạn. Nói chung, bạn có thể nhận một bản cập nhật hàng tháng (khoảng cách + 4 đến 6 tuần). Các mốc được liệt kê dưới đây. +
+ ++ Mỗi bản cập nhật sẽ có các công cụ SDK, ảnh hệ thống xem trước, bộ giả lập, tài liệu + tham khảo và những khác biệt về API. +
+ ++ Ba phiên bản Preview đầu tiên sẽ cung cấp một môi trường + kiểm thử và phát triển sớm để giúp bạn xác định + các vấn đề tương thích trong ứng dụng hiện tại và lập kế hoạch di chuyển hoặc trang bị hoạt động + cần thiết để nhắm tới nền tảng mới. Đây là giai đoạn ưu tiên để bạn + gửi phản hồi cho chúng tôi về các tính năng, khả năng tương thích của API và tệp + — đối với mọi vấn đề đó, vui lòng sử dụng bộ theo dõi + vấn đề. Sẽ có một số thay đổi với API giữa các bản cập nhật này. +
+ ++ Tại Preview 4 và 5 bạn sẽ được sử dụng các +API và SDK N cuối cùng để phát triển, và cả các ảnh hệ thống gần hoàn thiện + để kiểm thử các hành vi, tính năng của hệ thống. Android N sẽ cung cấp một mức + API chuẩn vào thời điểm này. Bạn có thể tiến hành kiểm thử khả năng tương thích cuối cùng đối với các ứng dụng + cũ và tinh chỉnh mã nguồn mới có sử dụng các API hoặc tính năng mới của N. +
+ ++ Ngoài ra, bắt đầu từ Preview 4 bạn có thể phát hành ứng dụng lên + các thiết bị chạy Android N ở cấp API chính thức, chẳng hạn như + thiết bị người dùng được chọn cho chương trình Android Beta. Bạn có thể + phát hành ứng dụng lên kênh alpha và beta của Google Play trước do đó bạn có thể kiểm thử + ứng dụng của mình với người dùng Android Beta trước khi phân phối rộng rãi trên + cửa hàng. +
+ ++ Khi bạn kiểm thử và phát triển trên Android N, chúng tôi khuyến cáo bạn duy trì + môi trường phát triển được cập nhật khi các cập nhật Preview được + phát hành. Để giúp cho quá trình này thuận tiện hơn, bạn có thể đăng ký các thiết bị kiểm thử của mình vào + chương trình Android Beta và lấy các bản cập nhật qua sóng vô tuyến (OTA) tại + mỗi mốc. Ngoài ra, các ảnh xem trước cũng có sẵn để bạn + tải xuống và flash thủ công. +
+ ++ Chúng tôi sẽ thông báo cho bạn khi các cập nhật Preview xuất hiện thông qua Blog Nhà phát triển Android, cũng + như thông qua trang này và Cộng đồng + Nhà phát triển Android N. +
+ + ++ N Developer Preview có tất cả mọi thứ bạn cần để kiểm thử ứng dụng + sẵn có của bạn trên nhiều loại kích cỡ màn hình, công nghệ mạng, chipset CPU/GPU + và kiến trúc phần cứng. +
+ +Bạn có thể tải xuống các thành phần này thông qua Trình quản lý SDK trong Android Studio:
+ ++ Chúng tôi sẽ cung cấp các bản cập nhật cho các công cụ phát triển này theo từng mốc khi cần thiết. +
+ ++ N Developer Preview bao gồm các ảnh hệ thống cho Nexus và phần cứng khác mà bạn có thể sử dụng khi + kiểm thử và phát triển trên các thiết bị vật lý. Hãy xem trang Ảnh cho Thiết bị để có danh sách đầy đủ + các ảnh cho phần cứng. +
+ ++ Chúng tôi sẽ cung cấp các ảnh hệ thống cập nhật cho những thiết bị này tại mỗi mốc. Bạn + có thể tải xuống và flash các ảnh hệ thống cập nhật vào các thiết bị kiểm thử + một cách thủ công nhiều lần theo nhu cầu. Điều này đặc biệt hữu ích đối với các môi trường + kiểm thử tự động, trong đó bạn có thể cần flash lại thiết bị nhiều + lần. +
+ +Lưu ý: + Các thiết bị được flash thủ công sẽ không nhận các bản cập nhật qua OTA giống như trong + preview của năm ngoái. Năm nay bạn có thể nhận qua OTA bằng cách đăng ký các thiết bị trong + Chương trình Android Beta — hãy xem chi tiết trong phần tiếp theo. +
+ ++ Tính năng mới cho Android N là một chương trình cập nhật qua sóng vô tuyến (OTA) sẽ tự động + phát hành các cập nhật Preview mới nhất của Android N trực tiếp tới thiết bị đã đăng ký + trong chương trình. Đây là chương trình miễn phí và mở đối với bất cứ ai có một + thiết bị được hỗ trợ đã đăng ký với tài khoản Google của họ. +
+ ++ Để đăng ký vào chương trình, hãy truy cập trang Chương trình + Android Beta. Bạn sẽ thấy + tất cả các thiết bị đã đăng ký với tài khoản của bạn có đủ điều kiện để đăng ký + Android Beta. +
+ ++ Một khi đã đăng ký, thiết bị của bạn sẽ sớm nhận được một bản cập nhật. Trong hầu hết trường hợp, + bạn sẽ không cần thực hiện thiết lập lại toàn bộ dữ liệu để chuyển sang Android N. Tuy nhiên, + chúng tôi khuyến cáo bạn sao lưu bất kỳ dữ liệu nào bạn không muốn bị mất trước khi + đăng ký thiết bị. +
+ ++ Khi các bản cập nhật được phát hành tới thiết bị của bạn, chúng tôi khuyến cáo bạn tải xuống và + cài đặt sớm nhất có thể. Bạn sẽ muốn cập nhật các + thay đổi mới nhất về UI, hành vi, API và các tính năng của hệ thống. +
+ ++ Khi kết thúc Developer Preview, các thiết bị đăng ký của bạn sẽ + nhận một bản cập nhật của bản phát hành Android N chính thức. +
+ ++ Bạn có thể hủy đăng ký các thiết bị của mình trong chương trình Android Beta bất kỳ lúc nào thông qua + trang Android Beta. Trước khi hủy đăng ký, hãy chắc chắn sao lưu dự phòng dữ liệu của bạn trên + thiết bị đó. +
+ +Lưu ý: + Khi bạn hủy đăng ký, thiết bị của bạn sẽ được khôi phục cài đặt gốc + về phiên bản mới nhất + của Android 6.0 Marshmallow (không nhất thiết là phiên bản bạn từng + được cài đặt trước khi đăng ký thiết bị). Để đảm bảo cài đặt mới hoàn toàn, + dữ liệu của bạn sẽ bị xóa khỏi thiết bị, bao gồm danh bạ, tin nhắn, + ảnh, v.v... +
+ ++ Các nguồn tài liệu này có trên trang Developer Preview để + trợ giúp bạn tìm hiểu về Android N: +
+ ++ Trong các cập nhật preview có sớm bạn có thể tải xuống + Tham khảo API + mới nhất cho nền tảng Android N dưới dạng tệp lưu trữ zip riêng biệt. Bản tải xuống + tham khảo này cũng có một báo cáo về các khác biệt để giúp bạn nhận biết các thay đổi API từ + API 23 và bản cập nhật trước đó. +
+ ++ Khi các API Android N hoàn thiện và được chỉ định một mức API chính thức, + chúng tôi sẽ cung cấp tham khảo API cho bạn trực tuyến tại https://developer.android.com. +
+ ++ Khi bạn kiểm thử và phát triển trên N Developer Preview, xin vui lòng sử dụng các kênh sau + để thông báo các vấn đề và gửi phản hồi. +
+ +
+ N Developer Preview sẽ cung cấp một hệ thống và thư viện
+ Android chỉ dành cho phát triển mà không có mức API tiêu chuẩn. Nếu bạn muốn
+ bỏ các hành vi về khả năng tương thích để kiểm thử ứng dụng của mình (đặc biệt
+ khuyến cáo), bạn có thể nhắm mục tiêu phiên bản xem trước của Android N bằng cách thiết lập
+ targetSdkVersion
+ của ứng dụng thành “N”
.
+
+ Android N Developer Preview cung cấp các API xem trước + — các API này không phải bản chính thức cho đến khi SDK cuối cùng được phát hành, + hiện được dự kiến phát hành vào quý ba năm 2016. Điều này có nghĩa là có thể + có các thay đổi API nhỏ sau này, đặc biệt trong + các tuần đầu của chương trình. Chúng tôi sẽ cung cấp bản tóm tắt các thay đổi cho bạn theo + mỗi bản cập nhật của Android N Developer Preview. +
+ ++ Lưu ý: Mặc dù các API xem trước có thể thay đổi nhưng + các hành vi hệ thống cơ bản vẫn ổn định và sẵn sàng để kiểm thử + ngay. +
+ ++ Google Play không cho phép phát hành các ứng dụng nhắm mục tiêu tới N Developer + Preview. Khi có bản SDK cuối cùng của Android N bạn sẽ có thể + nhắm mục tiêu mức API Android N chính thức và phát hành ứng dụng của mình lên Google + Play thông qua các kênh phát hành alpha và beta. Trong thời gian này, nếu bạn muốn + phân phối một ứng dụng nhắm mục tiêu Android N cho người kiểm thử thì bạn có thể thực hiện phân phối qua email hoặc + bằng cách tải trực tiếp trên trang web của bạn. +
+ ++ Khi Android N được phát hành hoàn chỉnh cho AOSP và OEM, dự kiến vào Q3 2016, + bạn có thể phát hành ứng dụng của mình nhắm mục tiêu Android N lên kênh + phát hành công chúng trong Google Play. +
+ + ++ Để bắt đầu kiểm thử ứng dụng của bạn với Android N: +
+ ++ Cảm ơn bạn đã tham gia chương trình Android N Developer Preview! +
diff --git a/docs/html-intl/intl/vi/preview/samples.jd b/docs/html-intl/intl/vi/preview/samples.jd new file mode 100644 index 000000000000..aa1a8c65d229 --- /dev/null +++ b/docs/html-intl/intl/vi/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=Samples +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ Các mã mẫu sau được dành cho Android N. Để + tải xuống mã mẫu cho Android Studio, hãy chọn tùy chọn trong menu File > Import + Samples. +
+ ++ Chú ý:Các dự án có thể tải xuống này được thiết kế + để sử dụng với Gradle và Android Studio. +
+ + ++ Ví dụ này minh họa cách tận dụng giao diện người dùng + đa cửa sổ với ứng dụng của bạn. +
+ + + ++ Đây là ví dụ đã có sẵn, minh họa một dịch vụ đơn giản để gửi + thông báo bằng cách sử dụng NotificationCompat. Mỗi cuộc hội thoại chưa đọc từ một người dùng + sẽ được gửi dưới dạng một thông báo riêng. +
++ Ví dụ này đã được cập nhật để tận dụng các tính năng thông báo mới + có trong Android N. +
+ + + ++ Đây là một ví dụ đã có sẵn, minh họa cách sử dụng + NotificationManager để cho biết có bao nhiêu thông báo một ứng dụng hiện + đang hiển thị. +
++ Ví dụ này đã được cập nhật để tận dụng các tính năng thông báo mới + có trong Android N. +
+ + + ++ Ví dụ này minh họa cách lưu trữ và truy cập dữ liệu trên bộ lưu trữ + mã hóa thiết bị, luôn khả dụng khi thiết bị được khởi động. +
+ + + ++ Ví dụ này minh họa cách đọc và ghi dữ liệu từ các thư mục + cụ thể trong khi cần ít quyền hơn. +
+ \ No newline at end of file diff --git a/docs/html-intl/intl/vi/preview/setup-sdk.jd b/docs/html-intl/intl/vi/preview/setup-sdk.jd new file mode 100644 index 000000000000..fca53310e2c8 --- /dev/null +++ b/docs/html-intl/intl/vi/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=Thiết lập Preview +meta.keywords="preview", "android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +Để phát triển các ứng dụng cho Android N Preview bạn cần thực hiện một số cập nhật +đối với môi trường phát triển của mình như mô tả trên trang này.
+ +Để đơn thuần thử khả năng tương thích của ứng dụng trên +ảnh hệ thống Android N, hãy làm theo hướng dẫn Kiểm thử trên một Thiết bị Android N.
+ + + + +Nền tảng Android N bổ sung hỗ trợ cho các tính năng của ngôn ngữ Java 8, +yêu cầu phải có một trình biên dịch mới có tên là Jack. Phiên bản Jack mới nhất +hiện chỉ được hỗ trợ trong Android Studio 2.1. Do đó, nếu bạn muốn +sử dụng các tính năng của ngôn ngữ Java 8 thì bạn cần sử dụng Android Studio 2.1 để +dựng ứng dụng. Nếu không, bạn không cần sử dụng trình biên dịch Jack nhưng bạn +vẫn cần cập nhật lên JDK 8 để biên dịch cho nền tảng Android N, +như mô tả dưới đây. +
+ + + +Android Studio 2.1 hiện đang có dưới dạng bản xem trước trong kênh +phát hành Canary. Nếu bạn đã +có Android Studio và không muốn cập nhật lên kênh canary thì bạn có thể +tải xuống Android Studio 2.1 dưới dạng bản cài đặt riêng và sử dụng +để phát triển với Android N để không làm ảnh hưởng đến môi trường Android Studio +chính của bạn.
+ +Để tải xuống Android Studio 2.1 dưới dạng bản cài đặt riêng, hãy thực hiện +các bước sau (hoặc nếu bạn muốn nhận Android Studio 2.1 dưới dạng bản cập nhật cho +bản cài đặt có sẵn thì hãy chuyển đến bước 4):
+ +Hãy để cửa sổ cài đặt này mở cho bước tiếp theo.
+ + +Để bắt đầu phát triển với các API Android N, bạn cần cài đặt + Android N Preview SDK trong Android Studio như sau:
+ ++ Thông tin chi tiết về các API Android N có trong tài liệu tham khảo của + Bản xem trước N mà bạn có thể tải xuống từ bảng sau. + Gói này có một bản ngoại tuyến được rút gọn của trang web + cho nhà phát triển Android và có một bản tham khảo API được cập nhật cho API Android N, một + báo cáo về sự khác biệt API. +
+ +Tài liệu | +Tổng kiểm | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5: 4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
设备 | +下载/校验和 | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5: b5cf874021023b398f5b983b24913f5d + SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5: af183638cf34e0eb944a1957d7696f60 + SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5: bc4934ea7bd325753eee1606d3725a24 + SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5: c901334c6158351e945f188167ae56f4 + SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5: 7bb95bebc478d7257cccb4652899d1b4 + SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5: f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5: 4e21fb183bbbf467bee91598d587fd2e + SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
General Mobile 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5: 983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ 如果您想从设备卸载 Preview,可以通过以下方式之一来完成: +
++ 取消注册后,设备将收到其可用的最新生产版本的 Android 系统(例如 Android 6.0 Marshmallow)的 OTA 更新。该更新要求完全重置设备,因此设备上的用户数据将被删除。在取消注册设备之前,务必先备份重要数据。 + + + + +
+注:如果要在计划结束之前卸载 Developer Preview 系统映像,则需要完全重置设备并删除设备上的所有用户数据。 + + + +
+ + +要使用 Android 模拟器运行 Android N Preview,需要下载 +Android N Preview SDK,并为模拟器创建一个虚拟设备。 +
+ +首先,按照如下操作下载 Android N Preview SDK(如果您在设置以开发 Android N 应用过程中即已获得此 SDK,则可跳过这部分): + + + +
现在,您应该有 Android SDK Built-Tools 24.0 0 rc1、Platform-Tools 24.0.0 rc1 和 SDK Tools +25.0.9。如果您尚未将 SDK Tools 更新至 25.0.9,则将无法运行 Android N 的 x86_64 系统映像。 + +
+ + +现在,使用 Android N 系统映像创建虚拟设备:
+ +现在,您可以使用 Android N Preview AVD 启动 Android 模拟器。
+ ++要获得 Android 模拟器最佳运行体验,请安装 Android Studio 2.1 Preview,该版本支持 Android Emulator 2.0 Beta,与 +Android Studio 1.5 中的模拟器相比,其运行速度快得多。 + +
+ +注:如果您当前使用的是 Android Studio 2.0 Beta,则有一个已知问题会阻止您使用 N Preview 系统映像创建 AVD,此时您需要使用 Android Studio 2.1 Preview 创建 AVD。 + + + +
+ +如需了解有关创建虚拟设备的详细信息,请参阅管理虚拟设备。 +
+ + + + + + + + + + + + + + ++ 后台进程非常耗费内存和电池。例如,隐式广播可以启动许多已注册侦听它的后台进程,即使这些进程可能没有执行许多工作。 + +这会严重影响设备性能和用户体验。 + +
+ ++ 为减缓这个问题,N Developer Preview 应用了以下限制: + +
+ ++ Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 +例如,{@link android.app.job.JobScheduler} +和 +{@code GcmNetworkManager} 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。 + +现在,您还可以使用 {@link android.app.job.JobScheduler} +来响应内容提供程序所发生的变更。{@link android.app.job.JobInfo} +对象封装了 {@link android.app.job.JobScheduler} +用来安排您的作业的参数。如果符合作业条件,系统将在应用的 {@link android.app.job.JobService} 上执行此作业。 + +
+ ++ 在本文档中,我们将学习如何使用备用方法(如 {@link android.app.job.JobScheduler})调整您的应用以符合这些新限制。 + + +
+ ++ 面向 N Developer Preview 的应用不会收到 {@link +android.net.ConnectivityManager#CONNECTIVITY_ACTION} 广播,即使它们在清单文件中注册接收这些广播亦是如此,依赖此广播的流程也不会启动。 + +这可能会给需要侦听网络变化或者需要在设备接入无限流量网络时执行批量网络活动的应用造成问题。 + +Android 框架中已存在多个可绕过此限制的解决方案,但需要根据您想要应用实现的目标来选择正确的解决方案。 + + +
+ ++ 注:当应用位于前台时,通过 +{@link android.content.Context#registerReceiver Context.registerReceiver()} +中注册的 {@link android.content.BroadcastReceiver} 将继续接收这些广播。 +
+ ++ 使用 {@link android.app.job.JobInfo.Builder JobInfo.Builder} 类构建 +{@link android.app.job.JobInfo} 对象时,应用 {@link +android.app.job.JobInfo.Builder#setRequiredNetworkType +setRequiredNetworkType()} 方法,并将 {@link android.app.job.JobInfo +JobInfo.NETWORK_TYPE_UNMETERED} 作为作业参数传递。以下代码示例展示如何安排当设备接入无限流量网络且正在充电时要运行的服务: + + +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ 当符合作业条件时,应用会收到回调以运行指定 {@code JobService.class} 中的 {@link android.app.job.JobService#onStartJob onStartJob()} 方法。 + +如需查看 {@link + android.app.job.JobScheduler} 实现的更多示例,请参阅 JobScheduler 示例应用。 +
+ ++ 使用 GMSCore 服务且面向 Android 5.0(API 级别 21)或更低版本系统的应用可以使用 +{@code GcmNetworkManager} 并指定 {@code Task.NETWORK_STATE_UNMETERED}。 + +
+ ++ 在前台运行的应用仍可以通过注册的 {@link +android.content.BroadcastReceiver} 侦听 {@code +CONNECTIVITY_CHANGE}。不过,{@link +android.net.ConnectivityManager} API 提供了一个更稳健可靠的方法,可以仅在符合指定的网络条件时才请求回调。 + +
+ ++ {@link android.net.NetworkRequest} 对象根据 {@link android.net.NetworkCapabilities} 定义网络回调的参数。 +使用 {@link +android.net.NetworkRequest.Builder NetworkRequest.Builder} 类创建 {@link android.net.NetworkRequest} 对象。然后,{@link +android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, +android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} +将 {@link android.net.NetworkRequest} 对象传递给系统。 +当符合网络条件时,应用会收到回调以执行在其 {@link +android.net.ConnectivityManager.NetworkCallback} 类中定义的 +{@link android.net.ConnectivityManager.NetworkCallback#onAvailable +onAvailable()} 方法。 + +
+ ++ 应用继续接收回调,直至应用退出或调用 +{@link android.net.ConnectivityManager#unregisterNetworkCallback +unregisterNetworkCallback()}。 +
+ ++ 在 N Developer Preview 中,应用无法发送或接收 {@link +android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link +android.hardware.Camera#ACTION_NEW_VIDEO} 广播。此限制有助于缓解必须唤醒多个应用以处理新图像或视频时对性能和用户体验造成的影响。 + +N Developer Preview 扩展了 {@link android.app.job.JobInfo} 和 {@link +android.app.job.JobParameters} 以提供备用解决方案。 + +
+ ++ 为了针对内容 URI 变化触发作业,N Developer Preview 使用以下方法扩展了 {@link android.app.job.JobInfo} API。 + +
+ ++ 注: {@code TriggerContentUri()} 无法与 {@link android.app.job.JobInfo.Builder#setPeriodic +setPeriodic()} 或 {@link android.app.job.JobInfo.Builder#setPersisted +setPersisted()} 结合使用。 +若要持续监控内容变化,则可在应用的 {@link +android.app.job.JobService} 完成处理最新的回调前安排新的 +{@link android.app.job.JobInfo}。 +
+ ++ 以下示例代码展示如何安排当系统报告内容 URI {@code MEDIA_URI} 所发生变化时要触发的作业: + +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ 当系统报告指定内容 URI 所发生变化时,应用将收到一个回调,并向 {@code MediaContentJob.class} 中的 {@link android.app.job.JobService#onStartJob onStartJob()} +方法传递一个 {@link android.app.job.JobParameters} 对象。 + + +
+ ++ N Developer Preview 也扩展了{@link android.app.job.JobParameters},以允许应用接收有关哪些内容权限和 URI 已触发作业的有用信息: + + +
+ ++ 以下示例代码重写 {@link +android.app.job.JobService#onStartJob JobService.onStartJob()} 方法并记录已触发作业的内容权限和 URI: + +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ 优化您的应用以在低内存设备上或在低内存条件下运行,这样可以提升性能和用户体验。 +删除后台服务依赖关系和静态注册的隐式广播接收器可帮助您的应用在此类设备上运行得更好。 + +尽管 N Developer Preview 采取了措施以减少部分问题,但建议您优化自己的应用,使其能够在完全不使用这些后台进程的情况下运行。 + + + +
+ ++ N Developer Preview 推出了一些附加 Android Debug Bridge (ADB) 命令,您可以使用这些命令测试在禁用这些后台进程情况下的应用行为: + +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
当设备已开机但用户尚未解锁设备时,Android N 将在安全的 直接启动 模式下运行。 + +为支持此操作,系统为数据提供两个存储位置:
+ +默认情况下,应用不会在“直接启动”模式下运行。如果您的应用需要在“直接启动”模式下进行操作,您可以注册在此模式期间应运行的应用组件。 + +对于需要在“直接启动”模式下运行的应用,常见的一些用例包括: +
+ +如果您的应用在“直接启动”模式下运行时需要访问数据,则使用设备加密存储。 +设备加密存储包含使用密钥加密的数据,仅在设备已成功执行验证启动后密钥才可用。 + +
+ +对于应使用与用户凭据(如 PIN 或密码)关联的密钥加密的数据,请使用凭据加密存储。凭据加密存储仅在用户已成功解锁设备后可用,直到用户再次重启设备。 + + +如果用户在解锁设备后启用锁定屏幕,则不会锁定凭据加密存储。 + +
+ +应用必须先向系统注册其组件,然后才能在“直接启动”模式下运行或访问设备加密存储。
+
+应用通过将组件标记为
+加密感知在系统中进行注册。若要将您的组件标记为加密感知,请在清单文件中将 android:encryptionAware
属性设为 true。
+
+ +
当设备重启后,加密感知组件可以注册接收来自系统的 LOCKED_BOOT_COMPLETED
广播消息。
+
+此时设备加密存储可用,您的组件可以在“直接启动”模式下执行需要运行的任务,例如触发已设定的闹铃。
+
+
以下代码段展示如何将
+{@link android.content.BroadcastReceiver} 注册为加密感知并在应用清单文件中为 LOCKED_BOOT_COMPLETED
添加 Intent 过滤器:
+
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
在用户解锁设备后,所有组件均可访问设备加密存储以及凭据加密存储。 +
+ +要访问设备加密存储,请通过调用
+Context.createDeviceEncryptedStorageContext()
创建另一个
+{@link android.content.Context} 实例。使用此上下文执行的所有存储 API 调用均访问设备加密存储。
+以下示例访问设备加密存储并打开现有应用数据文件:
+
+
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
仅针对在“直接启动”模式下必须可访问的信息使用设备加密存储。请勿将设备加密存储用作通用加密存储。对于专有用户信息,或在“直接启动”模式下不需要的加密数据,请使用凭据加密存储。 + + + +
+ +重启后一旦用户解锁了设备,您的应用即可切换至访问凭据加密存储,并使用依赖用户凭据的常规系统服务。 + +
+ +为了在重启后用户解锁设备时收到通知,请从一个正在运行的组件注册 {@link android.content.BroadcastReceiver} 以侦听 ACTION_USER_UNLOCKED
消息。
+
+或者,您可以接收现有 {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} 消息,该消息现在表明设备已启动,且用户已解锁设备。
+
+
您可以通过调用 UserManager.isUserUnlocked()
直接查询用户是否已解锁设备。
+
如果用户将其设备更新为使用“直接启动”模式,您可能需要将现有数据迁移到设备加密存储。
+使用
+Context.migrateSharedPreferencesFrom()
和
+Context.migrateDatabaseFrom()
在凭据加密存储和设备加密存储之间迁移首选项和数据库数据。
+
请运用您的最佳判断来决定从凭据加密存储向设备加密存储迁移哪些数据。 +您不应将专有用户信息(如密码或权限令牌)迁移到设备加密存储。 + +。在某些情况下,您可能需要在这两个加密存储中管理单独的数据集。 +
+ +使用新的“直接启动”模式测试您的加密感知应用。有两种方式可以启用直接启动模式: +
+ +注意:启用“直接启动”将擦除设备上的所有用户数据。 +
+ +在已安装 Android N 的受支持的设备上,通过执行以下操作之一启用“直接启动”: +
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
另外,还提供模拟直接启动模式,以防您需要在测试设备上切换模式。 +模拟模式应仅在开发期间使用,否则可能导致数据丢失。 +若要启用模拟直接启动模式,请在设备上设置锁定模式,如果在设置锁定模式时系统提示安全启动屏幕,则选择“No thanks”,然后使用以下 adb shell 命令: + + +
+ ++$ adb shell sm set-emulate-fbe true ++ +
若要关闭模拟直接启动模式,请使用以下命令:
+ ++$ adb shell sm set-emulate-fbe false ++ +
使用这些命令会导致设备重启。
diff --git a/docs/html-intl/intl/zh-cn/preview/features/icu4j-framework.jd b/docs/html-intl/intl/zh-cn/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..1dd5a74e91c2 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=ICU4J Android 框架 API + +@jd:body + ++ ICU4J 是一个广泛使用的开源 Java 库集合,为软件应用提供 Unicode 和全球化支持。 +Android N 在 {@code android.icu} 软件包下显示 Android 框架中的 ICU4J API 子集,供应用开发者使用。 + +这些 API 使用设备上具有的本地化数据。 +因此,您可以通过不将 ICU4J 库编译到 APK 来减少 APK 占用空间;相反,您可以只在框架中调用它们。 + +(在此情况下,您可能想要提供多个版本的 APK,这样,运行比 Android N 低的 Android 版本的用户可以下载包含 ICU4J 库的应用版本。) + + + +
+ ++ 本文档开头提供了有关支持这些库所需的最低 Android API 级别的一些基本信息。 +然后,介绍关于 Android 特定的 ICU4J 实现您需要了解的内容。 +最后,介绍如何在 Android 框架中使用 ICU4J API。 + +
+ +
+ Android N 通过
+android.icu
软件包(而非 com.ibm.icu
)显示 ICU4J API 的子集。由于种种原因,Android 框架可能选择不显示 ICU4J API;例如,Android N 不显示一些已弃用的 API 或 ICU 团队尚未将其声明为“稳定”的 API。
+
+
+
+由于 ICU 团队将来会弃用这些 API,因此,Android 也会将其标记为已弃用,但将继续包含它们。
+
+
Android API 级别 | +ICU 版本 | +CLDR 版本 | +
---|---|---|
Android N | +56 | +28 | +
以下是几点注意事项:
+ +
+ 如果您已在应用中使用 ICU4J API,且
+android.icu
API 符合您的要求,那么要迁移至框架 API,需要将 Java 导入从 com.ibm.icu
更改为 android.icu
。
+
+然后,您可以从 APK 移除您自己的 ICU4J 文件的副本。
+
+
+ 注:ICU4J 框架 API 使用 {@code android.icu} +命名空间,而不是 {@code com.ibm.icu}。这是为了避免在包含自己的 {@code com.ibm.icu} 库的 APK 中出现命名空间冲突。 + +
+ +
+ java
和 android
软件包中的某些类与在 ICU4J 中找到的一些类等效。
+不过,ICU4J 通常为标准和语言提供更广泛的支持。
+
+
下面是一些入门示例:
+类 | +替代项 | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J 按照 ICU 许可发布。如需了解详情,请参阅 ICU 用户指南。 + +
diff --git a/docs/html-intl/intl/zh-cn/preview/features/multi-window.jd b/docs/html-intl/intl/zh-cn/preview/features/multi-window.jd new file mode 100644 index 000000000000..8bbd4b1de4fd --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=多窗口支持 +page.metaDescription=Android N 全新支持同时显示多个应用窗口。 +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N 添加了对同时显示多个应用窗口的支持。 +在手持设备上,两个应用可以在分屏模式中左右并排或上下并排显示。 +在电视设备上,应用可以使用画中画模式,在用户与另一个应用交互的同时继续播放视频。 + + +
+ ++ 如果您使用 N Preview SDK 构建应用,则可以配置应用处理多窗口显示的方法。 +例如,您可以指定 Activity 的最小允许尺寸。 +您还可以禁用应用的多窗口显示,确保系统仅以全屏模式显示应用。 + + +
+ ++ Android N 允许多个应用同时共享屏幕。例如,用户可以分屏显示应用,在左边查看网页,同时在右边写邮件。 + +用户体验取决于设备: + +
+ ++ 用户可以通过以下方式切换到多窗口模式: +
+ ++ 用户可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放数据 + +(在此之前,用户只能在一个 Activity 内部拖放数据)。 + +
+ ++ 多窗口模式不会更改 Activity 生命周期。 + +
+ ++ 在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 +该 Activity 将被视为顶级 Activity。 + 所有其他 Activity 虽然可见,但均处于暂停状态。 + 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 +如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。 + + +
+ ++ 注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 +应用在暂停状态下可能仍需要继续其操作。 +例如,处于暂停模式但可见的视频播放应用应继续显示视频。 +因此,我们建议播放视频的 Activity 不要暂停其 {@link android.app.Activity#onPause onPause()} 处理程序中的视频。 + + + 应暂停 {@link android.app.Activity#onStop + onStop()} 中的视频,并恢复 {@link android.app.Activity#onStart + onStart()} 中的视频播放。 +
+ ++ 如处理运行时变更中所述,用户使用多窗口模式显示应用时,系统将通知 Activity 发生配置变更。 + +该变更与系统通知应用设备从纵向模式切换到横向模式时的 Activity 生命周期影响基本相同,但设备不仅仅是交换尺寸,而是会变更尺寸。 + + +如处理运行时变更中所述,您的 Activity 可以自行处理配置变更,或允许系统销毁 Activity,并以新的尺寸重新创建该 Activity。 + + + +
+ +
+ 如果用户调整窗口大小,并在任意维度放大窗口尺寸,系统将调整 Activity 以匹配用户操作,同时根据需要发布运行时变更。
+
+如果应用在新公开区域的绘制滞后,系统将使用 {@link
+ android.R.attr#windowBackground windowBackground} 属性或默认 windowBackgroundFallback
样式属性指定的颜色暂时填充该区域。
+
+
+
+ 如果您的应用面向 Android N,您可以对应用的 Activity 是否支持多窗口显示以及显示方式进行配置。 +您可以在清单文件中设置属性,以控制大小和布局。 + + 根 Activity 的属性设置适用于其任务栈中的所有 Activity。 + +
+ ++ 注:如果您使用低于 Android N 版本的 SDK 构建多向应用,则用户在多窗口模式中使用应用时,系统将强制调整应用大小。 + +系统将显示对话框,提醒用户应用可能会发生异常。 +系统不会调整定向应用的大小;如果用户尝试在多窗口模式下打开定向应用,应用将全屏显示。 + + + +
+ +
+ 在清单文件的 <activity>
或
+ <application>
节点中设置该属性,启用或禁用多窗口显示:
+
+
+android:resizeableActivity=["true" | "false"] ++ +
+ 如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。 +如果此属性设置为 false,Activity 将不支持多窗口模式。 +如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。 + + +
+ ++ 如果您的应用面向 Android N,但未对该属性指定值,则该属性的值默认设为 true。 + +
+ +
+ 在清单文件的 <activity>
节点中设置该属性,指明 Activity 是否支持画中画显示。
+如果 android:resizeableActivity
为 false,将忽略该属性。
+
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ 对于 Android N,<layout>
清单文件元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为:
+
+
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + 例如,以下节点显示了如何指定 Activity 在自由形状模式中显示时 Activity 的默认大小、位置和最小尺寸: + + +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N 添加了新功能,以支持可在多窗口模式中运行的应用。 + +
+ ++ 在设备处于多窗口模式中时,某些功能会被禁用或忽略,因为这些功能对与其他 Activity 或应用共享设备屏幕的 Activity 而言没有意义。 + +此类功能包括: + +
android:screenOrientation
属性所作的更改。
+ + {@link android.app.Activity} 类中添加了以下新方法,以支持多窗口显示。 +有关各方法的详细信息,请参阅 N Preview SDK 参考。 + +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ 注:画中画模式是多窗口模式的特例。
+如果 myActivity.inPictureInPicture()
返回 true,则 myActivity.inMultiWindow()
也返回 true。
+
+
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ 每个方法还有 {@link android.app.Fragment} 版本,例如 Fragment.inMultiWindow()
。
+
+
+ 如需在画中画模式中启动 Activity,请调用新方法 Activity.enterPictureInPicture()
。
+如果设备不支持画中画模式,则此方法无效。
+如需了解详细信息,请参阅画中画文档。
+
+
+ 在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。
+要执行此操作,可使用标志 Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
。
+
+传递此标志将请求以下行为:
+
+
+ 如果设备处于自由形状模式,则在启动新 Activity 时,用户可通过调用 ActivityOptions.setLaunchBounds()
指定新 Activity 的尺寸和屏幕位置。
+
+如果设备不处于多窗口模式,则该方法无效。
+
+
+ 注:如果您在任务栈中启动 Activity,该 Activity 将替换屏幕上的 Activity,并继承其所有的多窗口属性。 + +如果要在多窗口模式中以单独的窗口启动新 Activity,则必须在新的任务栈中启动此 Activity。 + +
+ ++ 用户可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放数据 + +(在此之前,用户只能在一个 Activity 内部拖放数据)。 +因此,如果您的应用目前不支持拖放功能,您可以在其中添加此功能。 + +
+ +
+ N Preview SDK 扩展了 android.view
软件包,以支持跨应用拖放。
+有关以下类和方法的详细信息,请参阅 N Preview SDK 参考。
+
+
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
。
+
+如需对接收拖放数据的 Activity 授予 URI 权限,可根据情况传递新标志 View.DRAG_FLAG_GLOBAL_URI_READ
或 View.DRAG_FLAG_GLOBAL_URI_WRITE
。
+
+
+
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + 无论您是否针对 Android N 更新应用,都应验证应用在多窗口模式下的行为,以防用户尝试在运行 Android N 的设备上以多窗口模式启动应用。 + + +
+ ++ 如果在设备上安装 Android N,则将自动支持分屏模式。 + +
+ ++ 如果您的应用不是使用 N Preview SDK 构建的,则用户尝试在多窗口模式中使用应用时,系统将强制调整应用大小,除非应用进行了定向声明。 + + +
+ ++ 如果您的应用没有进行定向声明,则应在运行 Android N 的设备上启动应用,并尝试将应用切换到分屏模式。 + +验证并确保在强制调整应用大小时用户体验可接受。 + +
+ ++ 如果应用进行了定向声明,则应尝试将应用切换到多窗口模式。 +验证并确保执行此操作后,应用仍保持全屏模式。 + +
+ ++ 如果您的应用是使用 N Preview SDK 构建的,且未禁用多窗口支持,则分别在分屏和自由形状模式下验证以下行为。 + + +
+ ++ 要在多窗口模式中验证应用性能,请执行以下操作。 +除非另有说明,否则请分别在分屏和多窗口模式中执行以下操作。 + +
+ +
+ 如果您通过设置 android:resizableActivity="false"
禁用了多窗口支持,则应在运行 Android N 的设备上启动应用,并尝试将应用切换到自由形状和分屏模式。
+
+
+验证并确保执行此操作后,应用仍保持全屏模式。
+
+
Android N 为多语言用户提供增强的支持,让他们可以在设置中选择多个区域设置。 +Android N 通过大幅扩展受支持的区域设置数量并更改系统解析资源的方式来提供此功能。 + +全新的解析资源方法更加稳健,并且设计为与现有 APK 兼容,但要格外细心,以发现任何异常行为。 + +例如,您应进行测试,以确保应用默认显示预期的语言。 +另外,如果应用支持多语言,您应确保此支持合乎预期。 + +最后,对于您没有将其显式设计为支持的语言,应设法确保应用能够妥善地处理它们。 +
+ +本文档开头介绍 Android N 之前的资源解析策略。接下来介绍 Android N 改进的资源解析策略。 + +最后,介绍如何充分利用扩展的区域设置数量来支持更多的多语言用户。 +
+ +在 Android N 之前,Android 并非始终能够成功匹配应用和系统区域设置。 +例如,假设应用的默认语言为“US English”,但它也在 {@code es_ES} +资源文件中对西班牙字符串进行了本地化。 +
+如果您的 Java 代码引用字符串,那么它将按如下所示解析字符串语言: +
+之所以会产生上述解析问题,是因为系统在无法找到精确匹配项时会将国家/地区代码从区域设置中去掉。 +例如:
+ +用户设置 | +应用资源 | +资源解析 | +
---|---|---|
fr_CH | +
+默认值 (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+尝试 fr_CH => 失败 +尝试 fr => 失败 +使用默认值 (en) + |
+
在此示例中,系统在不知道用户是否理解英语的情况下显示英语字符串。 +目前,此行为很常见。 +Android N 应该会大幅减少出现此类结果的频率。 +
+ +Android N 可提供更稳健的资源解析,并自动查找更好的备用方法。
+不过,为了加速解析和提升可维护性,您应以最常用的母语存储资源。
+
+ 例如,如果您之前将西班牙语资源存储在 {@code es-US} 目录中,请将它们移动到 {@code es-419} 目录,该目录包含拉丁美洲西班牙语。
+
+ 同理,如果您在名为 {@code en-GB} 的文件夹中存储有资源字符串,则将此文件夹重命名为 {@code en-001}(国际英语),因为 en-GB
字符串的最常用母语为 {@code en-001}。
+
+
+ 以下示例介绍为什么这些做法可提升性能和资源解析的可靠性。
+
使用 Android N,以不同的方式解析表 1 中所描述的案例: +
+ + +用户设置 | +应用资源 | +资源解析 | +
---|---|---|
|
+
+默认值 (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+尝试 fr_CH => 失败 +尝试 fr => 失败 +尝试 fr 的子项 => fr_FR +使用 fr_FR + |
+
现在,用户获得的是法语资源而不是英语。此示例还表明对于 Android N,您为什么应将法语字符串存储在 {@code fr}(而非 {@code fr_FR})中。此处的做法是匹配最接近的母语,从而使解析更快速且更具预见性。 + + +
+ +除了这个改进的解析逻辑外,Android 现在还提供更多的用户语言以供选择。 +下面,我们将意大利语指定为附加用户语言,但假设应用不支持法语,再次尝试上面的示例。 +
+ + +用户设置 | +应用资源 | +资源解析 | + +
---|---|---|
|
+
+默认值 (en) +de_DE +es_ES +it_IT + |
+
+尝试 fr_CH => 失败 +尝试 fr => 失败 +尝试 fr 的子项 => 失败 +尝试 it_CH => 失败 +尝试 it => 失败 +尝试 it 的子项 => it_IT +使用 it_IT + |
+
+
用户仍会获取他们理解的语言,即使应用不支持法语。 +
+ + +Android N 添加了新的 API {@code LocaleList.GetDefault()},从而让应用可以直接查询用户已指定的语言列表。 +您可以使用此 API 创建更成熟的应用行为和更优化的内容显示。 + +例如,搜索可以基于用户的设置以多种语言显示结果。 +浏览器应用可避免翻译以用户理解的语言显示的页面,键盘应用可自动启用所有适用的布局。 + +
+ +直到 Android 6.0(API 级别 23),Android 仅支持许多常用语言(en、es、ar、fr、ru)的一个或两个区域设置。 + +由于每种语言只有几种变体,因此,应用可以通过在资源文件中将一些数字和日期存储为硬编码字符串解决此问题。 + +不过,随着 Android 扩展了支持的区域设置集,即使在一个区域设置中,日期、时间、货币及类似信息也会存在显著差异。 + + +对您的格式进行硬编码会让最终用户困惑不已。 +因此,在针对 Android N 开发应用时请务必使用格式化程序代替硬编码数字和日期字符串。 +
+ +阿拉伯语就是最好的例子,Android N 将对其的支持从一个 {@code ar_EG} 扩展到 27 个阿拉伯语区域设置。 +这些区域设置可以共享大多数资源,但其中一些资源首选 ASCII 数字,另一些则首选本地数字。 +例如,如果您想要创建一个具有数字变量的句子,如“Choose a 4 digit pin”,则按如下所示使用格式化程序: + +
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/zh-cn/preview/features/notification-updates.jd b/docs/html-intl/intl/zh-cn/preview/features/notification-updates.jd new file mode 100644 index 000000000000..3a846489fb57 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=通知 +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + + + +
Android N 引入了一些新 API,允许应用发布具有高度可见性和交互性的通知。 +
+ +Android N 扩展了现有 {@link android.support.v4.app.RemoteInput} 通知 API,以支持手持式设备上的内联回复。 +此功能允许用户从通知栏快速进行回复,无需访问应用。 +
+ ++ 此外,Android N 还允许捆绑类似的通知并将它们显示为一则通知。 +为了实现此功能,Android N 使用现有的 {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} 方法。用户可以从通知栏展开各通知,并分别对每则通知进行回复和清除等操作。 + + +
+ +最后,Android N 还添加了一些新 API,允许您在应用的自定义通知视图中使用系统装饰元素。 +这些 API 可帮助确保通知视图与标准模板的展示效果相一致。 + +
+ +本文重点介绍您在应用中使用新通知功能时应加以考虑的一些重要变更。 +
+ +利用 Android N 中的直接回复功能,用户可以直接在通知界面内快速回复短信或更新任务列表。 + +在手持式设备上,可通过通知中另外附加的按钮进行内联回复操作。 +当用户通过键盘回复时,系统会将文本回复附加到您为通知操作指定的 Intent,并将 Intent 发送到手持式设备应用。 + + + + + + +
+ +要创建支持直接回复的通知操作: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
向操作附加 {@link android.support.v4.app.RemoteInput} 对象。
+
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
在触发通知操作时系统提示用户输入回复。 +
+ + + + +要从通知界面接收用户输入并发送到在回复操作的 Intent 中声明的 Activity: +
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
以下代码段说明了方法如何从捆绑包检索输入文本: +
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
应用可以通过应用逻辑来决定对检索的文本采取哪些操作。对于交互式应用(例如聊天应用),在通知中提供更多上下文(例如多行聊天记录,包括用户自己的消息),以便用户作出相应回复。当用户通过 {@link android.support.v4.app.RemoteInput} 回复时,使用 {@code setRemoteInputHistory()} 方法在回复记录中加入文本。 + + + + + + +
+ +Android N 为开发者提供了表示通知队列的新方法: + 捆绑通知。这类似于 Android Wear 中的通知堆栈功能。 + +例如,如果应用为接收的消息创建通知,那么在接收到多个消息时,应用会将通知捆绑在一起成为一个群组。 + +您可以使用现有的 {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} 方法捆绑类似的通知。 +
+ ++ 通知组对组内的通知施加层次结构。 + 层次结构的顶层是父级通知,其显示该群组的摘要信息。 +用户可以逐步展开通知组,随着用户深入展开,系统将显示更多信息。 + +当用户展开捆绑包时,系统将显示其所有子通知的更多信息;当用户展开其中一则通知时,系统显示该通知的所有内容。 + + +
+ + + + +要了解如何将通知添加到组,请参阅将各通知添加到组。 + +
+ + +本节提供了有关何时使用通知组而非早期版本 Android 平台中的 {@link android.app.Notification.InboxStyle InboxStyle} 通知的指南。 + + +
+ +只有在您的用例满足以下所有条件时才应使用通知组: +
+ +好的通知组用例示例包括:显示传入消息列表的短信应用,或显示收到的电子邮件列表的电子邮件应用。 + +
+ ++适合显示单一通知的用例示例包括:从某一个人收到的单独消息,或以列表表示的单行文本项目。 + +您可以使用 {@link android.app.Notification.InboxStyle InboxStyle} 或 +{@link android.app.Notification.BigTextStyle BigTextStyle} 实现此功能。 + + +
+ ++ 即使组内仅含有一则子通知,应用也应发布组摘要。 +如果只含有一则通知,系统将取消摘要并直接显示子通知。 +这样可确保用户在滑动切换组内的子通知时,系统仍可以提供一致的用户体验。 + + +
+ ++ 注:本版本 Android N 目前还无法在仅含一则子通知时取消通知组的摘要。 +我们将在之后版本的 Android N 中添加此功能。 + +
+ +虽然系统通常以群组的方式显示子通知,但您可以进行设置,使其暂时作为浮动通知显示。 + + +该功能非常实用,因为其允许用户立即访问最近的子通知以及与其相关的操作。 + +
+ + ++ 自 Android 5.0(API 级别 21)起,{@link + android.app.Notification} API 中就添加了通知组和远程输入,以支持 Android Wear 设备。 +如果您已经使用这些 API 构建通知,则只需验证应用行为是否符合上述指南,并考虑实现 {@code + setRemoteInputHistory()}。 + + +
+ ++ 为了支持后向兼容性,支持库的 {@link android.support.v4.app.NotificationCompat} 类中提供了相同的 API,以便您构建可在早期 Android 版本中运行的通知。 + + +在手持式设备和平板电脑上,用户只能看到摘要通知,因此应用应仍提供收件箱式或类似形式的通知显示模式,以显示群组的全部信息内容。 + +鉴于 Android Wear 设备允许用户查看所有子通知,包括更早级别平台上的通知,您应在不依赖 API 级别的基础上构建子通知。 + + + +
+ +从 Android N 开始,您将可以自定义通知视图,同时仍可以使用系统装饰元素,例如通知标头、操作和可展开的布局。 + +
+ +为启用该功能,Android N 添加了以下 API,以便您样式化自己的自定义视图: +
+ +如需使用这些新 API,可调用 {@code setStyle()} 方法,并向其传递所需的自定义视图样式。 +
+ +此代码段显示了如何使用 {@code DecoratedCustomViewStyle()} 方法构建自定义通知对象。 +
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/zh-cn/preview/features/picture-in-picture.jd b/docs/html-intl/intl/zh-cn/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..cbf37110d5f9 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=画中画 +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
在 Android N 中,Android TV 用户现在可以一边在应用中导航一边在屏幕角落的固定窗口中观看视频。 + +画中画 (PIP) 模式允许应用在固定窗口中运行视频 Activity,同时在后台继续运行另一个 Activity。 + +PIP 窗口让用户可以在使用应用的时候进行多任务处理,从而提高效率。 +
+ +您的应用可以决定何时触发 PIP 模式。以下是一些关于何时进入 PIP 模式的示例: +
+ +PIP 窗口为 240x135 dp,在屏幕角落的最顶层显示,由系统在四个角落中选择一个角落。 +用户可以调出 PIP 菜单,将 PIP 窗口切换为全屏,或通过按下遥控器上的主页按钮关闭 PIP 窗口。 + +如果主屏幕开始播放另一个视频,PIP 窗口将自动关闭。 + +用户还可以通过“最近使用记录”关闭 PIP 窗口。
+ + + + +PIP 利用 Android N 中提供的多窗口 API 显示固定视频层叠窗口。 +如需将 PIP 添加到应用,您需要注册支持 PIP 的 Activity,然后根据需要将 Activity 切换到 PIP 模式,并确保隐藏所有 UI 元素,且 Activity 处于 PIP 模式时视频继续播放。 + + +
+ +默认情况下,系统并不自动为应用提供 PIP 支持。如果想要应用支持 PIP,请将
+android:supportsPictureInPicture
和
+android:resizeableActivity
设置为 true
,在清单文件中注册视频 Activity。
+
+此外,应明确指定 Activity 处理布局配置变更,这样,在 PIP 模式过渡期间发生布局变更时,Activity 不会重新启动。
+
+
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
在注册 Activity 时,请记住,在 PIP 模式中,您的 Activity 在电视屏幕上的小层叠窗口中显示。 +视频播放 Activity 结合以尽量小的 UI 可以实现最佳用户体验。 +在切换到 PIP 模式后,UI 元素较小的 Activity 带来的用户体验可能较差,因为用户在 PIP 窗口中看不到 UI 元素的详细信息。 + + +
+ +Activity.enterPictureInPicture()
。在下面的示例中,当用户选择媒体控制栏上的专用 PIP 按钮时,系统切换到 PIP 模式:
+
+
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
在媒体控制栏上添加 PIP 按钮可以方便用户在控制视频播放的同时切换到 PIP 模式。 +
+ + + + +Android N 中包含一个新的
+PlaybackControlsRow.PictureInPictureAction
类,它可以定义控制栏 PIP 操作并使用 PIP 图标。
+
在 Activity 进入 PIP 模式时,Activity 应仅显示视频播放。
+在 Activity 进入 PIP 模式前删除 UI 元素,当 Activity 再次全屏显示时恢复这些元素。重写 Activity.onPictureInPictureChanged()
或
+Fragment.onPictureInPictureChanged()
,并根据需要启用或禁用 UI 元素,例如:
+
+
+
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
在 Activity 切换到 PIP 模式时,系统会认为 Activity 处于暂停状态,并调用 Activity 的 onPause()
方法。
+如果 Activity 因为 PIP 模式暂停,视频播放不应暂停,而是应继续播放。
+
+在 Activity 的
+onPause()
方法中检查 PIP,并对播放做相应处理,例如:
+
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
当 Activity 退出 PIP 模式并回到全屏模式时,系统会恢复 Activity 并调用 onResume()
方法。
+
PIP 用于全屏播放视频的 Activity。在 Activity 切换到 PIP 模式时,应避免显示除视频外的其他内容。根据处理画中画模式中的 UI 中所述,在 Activity 进入 PIP 模式时进行跟踪,并隐藏 UI 元素。 + + +
+ +由于 PIP 窗口悬浮在屏幕的角落,因此应避免在主窗口被 PIP 窗口遮挡的任何区域显示重要信息。 + +
+ +当 Activity 处于 PIP 模式时,其默认不获取输入焦点。要在 PIP 模式中接收输入事件,请使用
+MediaSession.setMediaButtonReceiver()
。
+
应用(如照片应用)通常只需要访问外部存储中的特定目录,例如 Pictures
目录。
+现有的外部存储访问方法未经专门设计,无法轻松地为这些类型的应用提供目标目录访问。
+
+例如:
Android N 提供简化的全新 API 以访问通用外部存储目录。 +
+ +使用 StorageManager
类获取适当的
+StorageVolume
实例。然后,通过调用该实例的
+StorageVolume.createAccessIntent()
方法创建一个 Intent。使用此 Intent 访问外部存储目录。
+若要获取所有可用卷的列表,包括可移动介质卷,请使用
+StorageManager.getVolumesList()
。
+
以下代码段展示如何在主要共享存储中打开
+Pictures
目录:
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
系统尝试授予对外部目录的访问权限,并使用一个简化的 UI 向用户确认访问权限(如果需要): +
+ + + + +如果用户授予访问权限,则系统会调用
+onActivityResult()
重写方法,且结果代码为
+Activity.RESULT_OK
,Intent 数据包含 URI。使用提供的 URI 访问目录信息,与使用存储访问框架返回的 URI 类似。
+
+
+
+
如果用户不授予访问权限,则系统会调用
+onActivityResult()
重写方法,且结果代码为
+Activity.RESULT_CANCELED
,Intent 数据为 null。
注:获得特定外部目录的访问权限也会获得该目录中子目录的访问权限。 +
+ +若要使用作用域目录访问来访问可移动介质上的目录,首先要添加一个用于侦听 +{@link android.os.Environment#MEDIA_MOUNTED} 通知的 {@link android.content.BroadcastReceiver},例如: +
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
当用户装载可移动介质时,如 SD 卡,系统将发送一则
+{@link android.os.Environment#MEDIA_MOUNTED} 通知。此通知在 Intent 数据中提供一个 StorageVolume
对象,您可用它访问可移动介质上的目录。
+
+以下示例访问可移动介质上的 Pictures
目录:
+
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
请尽可能保留外部目录访问 URI,这样即不必重复要求用户授予访问权限。
+在用户授予访问权限后,使用目录访问 URI 调用
+getContentResolver().takePersistableUriPermssion()
。
+系统将保留此 URI,后续的访问请求将返回 RESULT_OK
,且不会向用户显示确认 UI。
+
+
如果用户拒绝授予外部目录访问权限,请勿立即再次请求访问权限。 +一再不停地请求访问权限会导致非常差的用户体验。 +
diff --git a/docs/html-intl/intl/zh-cn/preview/features/security-config.jd b/docs/html-intl/intl/zh-cn/preview/features/security-config.jd new file mode 100644 index 000000000000..dc09c7837513 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=网络安全配置 +page.keywords=preview,security,network + +@jd:body + ++ Android N 包含一个网络安全配置特性,让应用可以在一个安全的声明性配置文件中自定义其网络安全设置,而无需修改应用代码。 + +可以针对特定域和特定应用配置这些设置。 +该特性的主要功能如下所示: + +
+ ++ 网络安全配置特性使用一个 XML 文件,您可以在该文件中指定应用的设置。 +您必须在应用的清单文件中包含一个条目来指向该文件。 +以下代码摘自一份清单文件,演示了如何创建此条目: + +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ 应用可能需要信任自定义的 CA 集,而不是平台默认值。 +出现此情况的最常见原因包括: +
+ ++ 默认情况下,来自所有应用的安全(例如 TLS、HTTPS)连接均信任预装的系统 CA,而面向 API 级别 23 (Android M) 及更低级别的应用默认情况下还会信任用户添加的 CA 存储。 + +应用可以使用 {@code base-config}(针对应用范围的定制)或 {@code domain-config}(针对每个域的定制)自定义自己的连接。 + + + +
+ + ++ 假设您要连接到使用自签署 SSL 证书的主机,或者连接到其 SSL 证书是由您信任的非公共 CA(如公司内部 CA)签发的主机。 + + +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ 以 PEM 或 DER 格式将自签署或非公共 CA 证书添加到 +{@code res/raw/my_ca}。 +
+ + ++ 如果应用不想信任系统信任的所有 CA,则可以自行指定,缩减要信任的 CA 集。 +这样可防止应用信任任何其他 CA 签发的欺诈性证书。 + +
+ ++ 限制信任的 CA 集的配置与针对特定域信任自定义 CA 相似,不同的是,前者要在资源中提供多个 CA。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ 以 PEM 或 DER 格式将信任的 CA 添加到 {@code res/raw/trusted_roots}。
+ 请注意,如果使用 PEM 格式,文件必须仅包含 PEM 数据,且没有额外的文本。
+您还可以提供多个
+<certificates>
+元素,而不是只能提供一个元素。
+
+ 应用可能需要信任系统不信任的附加 CA,出现此情况的原因可能是系统还未包含此 CA,或 CA 不符合添加到 Android 系统中的要求。 + +应用可以通过为一个配置指定多个证书源来实现此目的。 + + +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ 调试通过 HTTPS 连接的应用时,您可能需要连接到没有用于生产服务器的 SSL 证书的本地开发服务器。 + +为了支持此操作,而又不对应用的代码进行任何修改, + + 您可以 通过使用 {@code debug-overrides} 指定仅在 +android:debuggable +为 {@code true} 时才信任的仅调试 CA。通常,IDE 和构建工具会自动为非发布版本设置此标志。 + +
+ ++ 这比一般的条件代码更安全,因为出于安全考虑,应用存储不接受被标记为可调试的应用。 + + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ 旨在连接到仅使用安全连接的目标的应用可以选择不再对这些目标提供 cleartext(使用解密的 HTTP 协议而非 HTTPS)支持。 + +此选项有助于防止应用因外部源(如后端服务器)提供的 URL 发生变化而意外回归。 + + + 请参阅 {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted +NetworkSecurityPolicy.isCleartextTrafficPermitted()} 了解更多详情。 +
+ ++ 例如,应用可能需要确保所有与 {@code +secure.example.com} 的连接始终是通过 HTTPS 完成,以防止来自恶意网络的敏感流量。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ 一般情况下,应用信任所有预装 CA。如果有预装 CA 要签发欺诈性证书,则应用将面临被中间人攻击 (MiTM) 的风险。 + +有些应用通过限制信任的 CA 集或通过证书固定来选择限制其接受的证书集。 + +
+ ++ 通过按公钥的哈希值(X.509 证书的 SubjectPublicKeyInfo)提供证书集完成证书固定。 +然后,证书链仅在至少包含一个已固定的公钥时才有效。 + + +
+ ++ 请注意,使用证书固定时,您应始终包含一个备份密钥,这样,当您需要强制切换到新密钥时,或更改 CA 时(固定到某个 CA 证书或该 CA 的中间证书时),您应用的连接性不会受到影响。 + + +否则,您必须推送应用的更新以恢复连接性。 + +
+ ++ 此外,可以设置固定到期时间,在该时间之后不执行证书固定。 +这有助于防止尚未更新的应用出现连接问题。 +不过,设置固定到期时间可能会绕过证书固定。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ 继承未在特定配置中设置的值。此行为允许进行更复杂的配置,同时保证配置文件可读。 + +
+ ++ 如果未在特定条目中设置值,则使用来自下一个更通用的条目中的值。 +未在 {@code domain-config} 中设置的值从父级 {@code domain-config}(如果已嵌套)或从 {@code +base-config}(如果未嵌套)中获取。 +未在 {@code base-config} 中设置的值使用平台默认值。 + +
+ ++ 例如,考虑所有与 {@code +example.com} 的子域的连接必须使用自定义 CA 集。此外,允许使用这些域的 cleartext traffic,连接到 {@code + secure.example.com} 时除外。 +通过在 {@code example.com} 的配置中嵌套 {@code +secure.example.com} 的配置,不需要重复 {@code trust-anchors}。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ 网络安全配置特性使用 XML 文件格式。 + 文件的整体结构如以下代码示例所示: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ 以下部分介绍语法和文件格式的其他详细信息。 + +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
涵盖范围内的所有连接所使用的默认配置。
+
+
++ 未设置的任何值均使用平台默认值。面向上述 API 级别 24 及更高级别的应用的默认配置: + +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++面向 API 级别 23 及更低级别的应用的默认配置: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
请注意,如果有多个 {@code domain-config} 元素涵盖某个目标,则使用匹配域规则最具体(最长)的配置。 +
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ 指定来自此源的 CA 是否绕过证书固定。如果为 {@code +"true"},则为穿过此源的其中一个 CA 的链颁发证书,并且不执行证书固定。 +这对于调试 CA 或支持用户对应用的安全流量进行中间人攻击 (MiTM) 非常有用。 + +
+ ++ 默认值为 {@code "false"},除非在 {@code debug-overrides} +元素中另外指定(在这种情况下,默认值为 {@code "true"})。 +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
。
+ + 设置到期时间有助于防止不更新到其 PKP 集(例如,由于用户禁用应用更新)的应用出现连接问题。 + + +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
TV 输入服务允许用户通过时移 API 暂停和继续频道播放。 +Android N 通过允许用户保存多个录制的会话,扩展了时移。 +
+ +用户可以提前安排录制,或在观看节目时开始录制。 +系统保存录制后,用户即可使用系统 TV 应用浏览、管理和播放录制。 +
+ +如果想要为 TV 输入服务提供录制功能,您必须指示系统您的应用支持录制,实现录制节目功能,处理和传达录制期间发生的所有错误,并管理录制的会话。 + + +
+ +为了通知系统您的 TV 输入服务支持录制,请执行以下步骤: +
+ +TvInputService.onCreate()
方法中,使用 TvInputInfo.Builder
+类创建一个新的
+TvInputInfo
对象。TvInputInfo
对象时,在调用 build()
之前先调用
+setCanRecord(true)
,以表明您的服务支持录制。
+TvInputService.updateTvInputInfo()
在系统中注册 TvInputInfo
对象。TV 输入服务注册其支持录制功能后,系统会在需要访问应用的录制实现时调用
+TvInputService.onCreateRecordingSession()
。
+
+实现您自己的
+TvInputService.RecordingSession
子类并在触发 onCreateRecordingSession()
回调后返回它。
+
+此子类负责切换到正确的频道数据,录制请求的数据,以及向系统传达录制状态和错误。
+
+
系统调用在频道 URI 中传递的 RecordingSession.onTune()
时,将调到该 URI 指定的频道。
+通过调用 notifyTuned()
通知系统应用已调到所需的频道,或者,如果应用无法调到正确的频道,请调用 notifyError()
。
+
+
+
系统接下来调用 RecordingSession.onStartRecording()
+回调。您的应用必须立即开始录制。系统调用此回调时,它可能会提供一个 URI,其中包含有关将录制的节目的信息。
+
+完成录制后,您需要将此数据复制到 RecordedPrograms
数据表。
+
最后,系统调用 RecordingSession.onStopRecording()
。此时,您的应用必须立即停止录制。
+您还需要在 RecordedPrograms
表中创建一个条目。
+此条目应在
+RecordedPrograms.COLUMN_RECORDING_DATA_URI
列中包含录制的会话数据 URI,以及在初始调用
+onStartRecording()
时系统提供的任何节目信息。
+
+
如需了解有关如何访问 RecordedPrograms
表的更多详情,请参阅管理录制的会话。
+
如果录制期间发生错误,使录制的数据无法使用,则通过调用 RecordingSession.notifyError()
通知系统。同样,您可以在创建录制会话后调用 notifyError()
,以通知系统您的应用不再录制会话。
+
+
+
如果录制期间发生错误,但您想提供可使用的部分录制供用户播放,则调用
+RecordingSession.notifyRecordingStopped()
以使系统可以使用部分会话。
+
+
系统在 TvContract.RecordedPrograms
+内容提供程序表中维护来自所有支持录制的频道应用的所有已录制会话的信息。
+此信息可通过
+RecordedPrograms.Uri
内容 URI 访问。使用内容提供程序 API 读取、添加和删除此表中的条目。
+
如需了解有关使用内容提供程序数据的详细信息,请参阅内容提供程序基本知识。 + +
+ +TV 设备的存储可能有限,因此请运用您的最佳判断来分配存储,以保存录制的会话。
+如果没有足够的空间存储录制的会话,请使用
+RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
。
+
当用户发起录制时,您应尽快开始录制数据。
+为便于执行此操作,请在系统调用
+onCreateRecordingSession()
回调时完成前期的所有耗时任务,如访问和分配存储空间。
+这样做让您能够在触发 onStartRecording()
回调时立即开始录制。
+
+
Android N 支持 Java 8 语言功能,您可以在开发面向 Android N 的应用时使用这些功能。本页面介绍了 Android N Preview中支持的新语言功能、如何正确设置项目以使用这些功能,以及您可能遇到的任何已知问题。 + + + + +
+ +要开始使用这些功能,您需要下载并设置 Android Studio 2.1(预览版)和 Android N Preview SDK,包括所需的 Jack 工具链和更新的 Android Plugin for Gradle。如果您尚未安装 Android N Preview SDK,请参阅 Android N 开发设置。 + + +
+ + + ++ 注:开发面向 Android N 平台的应用并不要求必须使用新的 Java 8 语言功能。如果您不想使用 Java 8 语言功能编写代码,您可以将项目的源和目标兼容性值保留为 Java 7,但您仍必须使用 JDK 8 进行编译,以便针对 Android N 平台进行构建。 + + + + +
+ ++ Android 目前仅支持部分 Java 8 语言功能。在开发面向 Android N Preview 的应用时,现已可使用以下功能: + + +
+ ++ 此外,现已可使用以下 Java 8 语言功能 API: +
+ ++ 注:Android N 的 Lambda 表达式的实现基于匿名类。这种方法使表达式可以向后兼容,并可以在早期版本的 Android 上执行。如需在早期版本上测试 Lambda 表达式,请进入 {@code + build.gradle} 文件,并将 {@code compileSdkVersion} 和 {@code + targetSdkVersion} 设为 23 或更小的值。 + + + +
+ ++ 要使用新的 Java 8 语言功能,还需使用新的 Jack 工具链。新的 Android 工具链将 Java 源语言编译成 Android 可读取的 Dalvik 可执行文件字节码,且有其自己的 {@code .jack} 库格式,在一个工具中提供了大多数工具链功能:重新打包、压缩、模糊化以及 Dalvik 可执行文件分包。 + + + + + +
+ +以下是构建 Android Dalvik 可执行文件可用的两种工具链的对比:
++ 如需为您的项目启用 Java 8 语言功能和 Jack,请在模块特定的 {@code build.gradle} 文件中输入以下内容: + +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ Android Studio 2.0 (Beta) 中引入的 Instant Run 目前不能用于 Jack,在使用新的工具链时将被禁用。 + +
+ +由于 Jack 在编译应用时不生成中间类文件,依赖这些文件的工具目前不能用于 Jack。例如以下工具: + +
+ +如果您在使用 Jack 的过程中发现其他问题,请报告错误。
\ No newline at end of file diff --git a/docs/html-intl/intl/zh-cn/preview/overview.jd b/docs/html-intl/intl/zh-cn/preview/overview.jd new file mode 100644 index 000000000000..5195ed74d41a --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=计划概览 +page.metaDescription=让您的应用做好迎接下一版本 Android 的准备。 +page.image=images/cards/card-n-overview_2x.png +meta.tags=“预览版”, “开发者”, "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ 欢迎使用 Android N Developer Preview,此程序将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。它是免费的,您只需下载 N Developer Preview 工具即可立即使用。 + + + +
+ + + + + + + ++ 在各种设备或模拟器上运行并测试应用。 + +
++ 我们将在 Preview 期间每月提供更新,以便您针对最新的平台变更测试您的应用。 +
++ 在最初的几周里,我们将优先处理开发者报告的问题,所以请尽快测试并提供反馈。 + +
++ 请尽早开始支持新平台行为并使用新功能进行开发。 +
++ 通过 Android Beta 计划,所有支持的设备都可以实现空中下载 (OTA) 无缝更新。无需刷机。 + +
++ 使用 Issue Tracker 向我们报告问题并提供反馈。与 N 开发者社区中的其他开发者建立联系。 + + + +
++ N Developer Preview 从 2016 年 3 月 9 日开始使用,到向 AOSP 和 OEM 公开发布最终 Android N 时停止使用,预计将于 2016 年第三季度发布最终版本。 + +
+ ++ 在开发阶段的各个里程碑,我们将为您的开发和测试环境提供更新。一般每月(间隔 4 到 6 周)会提供一次更新。里程碑列表如下。 + + +
+ ++ 每次的更新包括 SDK 工具、预览版系统映像、模拟器、参考文档和 API 差异。 + +
+ ++ 前三个预览版里程碑提供早期测试和开发环境,帮助您发现当前应用中的兼容性问题,并针对新平台计划必要的迁移或功能工作。这是向我们提供功能和 API 以及文件兼容性问题反馈的优先期 — 请使用 Issue Tracker 进行反馈。在更新期间,API 可能会有变更。 + + + + + + +
+ ++ 在预览版 4 和 5 中,您将可以使用最终版的 N API 和 SDK 进行开发,以及用于测试系统行为和功能的接近最终版的系统映像。此时 Android N 会提供标准的 API 级别。您可以对旧版应用进行最终的兼容性测试,并优化使用 N API 或功能的新代码。 + + + + +
+ ++ 此外,从预览版 4 开始,您将可以面向运行正式 API 级别的 Android N 的设备发布应用,例如选择加入 Android Beta 计划的消费者设备。您可以先在 Google Play 的 alpha 和 beta 渠道发布应用,通过 Android Beta 消费者对应用进行测试,然后在商店大范围推广。 + + + + + +
+ ++ 如果您在 Android N 中进行测试和开发,强烈建议您在发布预览版更新后,将开发环境更新到最新版本。为了方便更新,您可以在 Android Beta 计划中注册您的测试设备,这样就可以在每个里程碑实现空中下载 (OTA) 更新。此外,您还将获得可手动下载并刷入的系统映像。 + + + + + +
+ ++ 当有预览版更新可用时,我们将通过 Android 开发者博客、此站点以及 Android N 开发者社区通知您。 + + +
+ + ++ N Developer Preview 包括您在各种使用不同屏幕尺寸、网络技术、CPU/GPU 芯片组和硬件架构的设备中测试现有应用所需的所有功能。 + + +
+ +您可通过 Android Studio 中的 SDK 管理器下载这些组件:
+ ++ 我们将根据需要在每个里程碑为这些开发工具提供更新。 +
+ ++ N Developer Preview 包含 Nexus 以及可用于在物理设备上进行测试和开发的其他硬件系统映像。如需了解硬件映像的完整列表,请参阅设备映像页面。 + + +
+ ++ 我们将在每个里程碑为这些设备提供更新的系统映像。您可以手动下载更新的系统映像,并刷入测试设备(如需要,可多次刷入)。这尤其适合需要多次重刷设备的自动化测试环境。 + + + + +
+ +注:手动刷入设备将不会像在去年的预览版中一样获得 OTA 更新。今年,您可以通过在 Android Beta 计划中注册设备获得 OTA — 有关详情请参阅下文。 + + + +
+ ++ Android N 的一项新功能是空中下载 (OTA) 更新计划,该功能可以将 Android N 最新的预览版更新直接发送到注册该计划的设备。该计划是免费服务,只要您拥有支持的设备并将其注册到 Google 帐户,就可以使用该服务。 + + + +
+ ++ 如需注册该计划,请访问 Android Beta 计划网站。您将可以看到您的帐户中所有可以注册 Android Beta 的设备。 + + + +
+ ++ 注册完成后,您的设备将很快收到更新。多数情况下,切换到 Android N 不需要重置所有数据,但建议您在注册设备前对重要数据进行备份,以免丢失。 + + + +
+ ++ 在设备收到更新后,建议您尽快下载并安装更新,以便在系统 UI、行为、API 和功能中及时同步最新的变更。 + + +
+ ++ 在 Developer Preview 结束运行时,您的注册设备将收到官方 Android N 版本的更新。 + +
+ ++ 您可以在 Android Beta 网站上随时注销注册 Android Beta 计划的设备。在注销前,请务必备份设备上的数据。 + + +
+ +注:注销后,您的设备将恢复到最新版本 Android 6.0 Marshmallow 的出厂设置(不一定是您注册设备前安装的版本)。为确保全新安装,您设备中的数据将被擦除,包括联系人、消息和照片等。 + + + + + + +
+ ++ Developer Preview 网站上提供的以下文档资源有助于您了解 Android N: + +
+ ++ 在预览版更新初期,您可以下载最新的 Android N 平台 API 参考资料,作为单独的 Zip 存档。下载的参考资料还包含差异报告,可帮助您识别相对 API 23 和上一次更新 API 的变更。 + + + + +
+ ++ 在确定最终版本 Android N API 并指定正式 API 级别后,我们将在网站 https://developer.android.com 上提供 API 参考资料。 + +
+ ++ 在 N Developer Preview 中测试和开发时,请使用以下渠道报告问题和提供反馈。 + +
+ +
+ N Developer Preview 提供的系统和 Android 库仅面向开发,不具备标准的 API 级别。如果您想通过拒绝兼容性行为测试您的应用(强烈推荐此做法),则可将应用的 targetSdkVersion
设置为 “N”
,从而锁定 Android N 的预览版。
+
+
+
+
+
+
+ Android N Developer Preview 提供预览 API 功能 — 在最终版本 SDK 发布之前,这些 API 都不是正式版本。目前,最终版本 SDK 计划于 2016 年第三季度发布。这意味着一段时期内,特别是该计划的最初几周内,API 可能会出现细微更改。我们会通过 Android N Developer Preview 的每次更新为您提供变更摘要。 + + + + + +
+ ++ 注:虽然预览版 API 可能会更改,但基本系统行为仍保持稳定,可以立即用于测试。 + + +
+ ++ Google Play 禁止发布面向 N Developer Preview 的应用。当 Android N 最终版本 SDK 可用时,您可以锁定官方 Android N API 级别,并通过 alpha 和 beta 发布渠道将应用发布至 Google Play。与此同时,如果您想要向测试者推广面向 Android N 的应用,则可通过电子邮件或从您的站点直接下载来实现。 + + + + + +
+ ++ 在向 AOSP 和 OEM 全面发布 Android N 后(计划在 2016 年第三季度发布),您将可以在 Google Play 的公开发布渠道发布面向 Android N 的应用。 + + +
+ + ++ 在使用 Android N 测试应用前,请执行以下操作: +
+ ++ 感谢您加入 Android N Developer Preview 计划! +
diff --git a/docs/html-intl/intl/zh-cn/preview/samples.jd b/docs/html-intl/intl/zh-cn/preview/samples.jd new file mode 100644 index 000000000000..5e776983f570 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=示例 +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ 以下是 Android N 的代码示例。要在 Android Studio 中下载示例,请选择 File > Import Samples 菜单项。 + + +
+ ++ 注:这些可下载的项目是专为配合 Gradle 和 Android Studio 使用而设计的。 + +
+ + ++ 此示例演示如何在您的应用中充分利用多窗口用户界面。 + +
++ +在 GitHub 中获取 +
+ + ++ 这是一个已存在的示例,其显示一个使用 NotificationCompat 发送通知的简单服务。该服务将来自用户的每个未读会话以不同的通知形式发送。 + + +
++ 此示例已更新,以充分利用 Android N 中提供的新的通知功能。 + +
++ 在 GitHub 中获取 + +
+ + ++ 这是一个已存在的示例,其演示如何使用 NotificationManager 指示应用当前显示的通知数量。 + + +
++ 此示例已更新,以充分利用 Android N 中提供的新的通知功能。 + +
++ 在 GitHub 中获取 + +
+ + ++ 此示例显示如何在设备加密的存储(启动设备后始终可用)中存储和访问数据。 + +
++ 在 GitHub 中获取 + +
+ + ++ 此示例演示如何从特定目录读取和写入数据,同时需要较少的权限。 + +
++ 在 GitHub 中获取 + +
\ No newline at end of file diff --git a/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd b/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd new file mode 100644 index 000000000000..69fe250e5c65 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.image=images/cards/card-n-sdk_2x.pngpage.title=设置预览版 +meta.keywords="预览版", "android" +page.tags="preview", "developer preview" + + +@jd:body + + +若要开发适用于 Android N Preview 的应用,您需要对您的开发者环境进行一些更新,如本页所述。 +
+ +若只是在 Android N 系统映像上测试应用的兼容性,请按照在 Android N 设备上进行测试指南进行操作。 +
+ + + + +Android N 平台为 Java 8 语言功能添加支持,该功能需要一个名为 Jack 的新编译器。当前仅在 Android Studio 2.1 中支持最新的 Jack 版本。因此,如果您想要使用 Java 8 语言功能,则必须使用 Android Studio 2.1 构建应用。或者,您不需要使用 Jack 编译器,但仍需要更新至 JDK 8 以便使用 Android N 平台进行编译,如下所述。 + + + + + + +
+ + + +在 Canary 发布渠道中,Android Studio 2.1 当前可以预览版的形式提供。如果您已拥有 Android Studio 且不需要更新到 Canary 发布渠道,您可通过单独安装的形式下载 Android Studio 2.1,并使用它在 Android N 中进行开发,从而使您的主要 Android Studio 环境不受影响。 + + + + +
+ +若要以单独安装的形式下载 Android Studio 2.1,则按照以下步骤进行操作(或者如果想要收到 Android Studio 2.1 作为现有安装的更新,则跳过第 4 步): + +
+ +保持此设置窗口处于打开状态,以执行下一步。
+ + +开始使用 Android N API 进行开发时,您需要按如下所示在 Android Studio 中安装 Android N Preview SDK: +
+ ++ 有关 Android N API 的详细信息可在 N Preview 参考文档中获取,您可以从下表下载该文档。此软件包包含一个离线的删节版 Android 开发者网站,并包含更新的 API 参考(适用于 Android N API),以及一个 API 差异报告。 + + + + +
+ +文档 | +校验和 | +|
---|---|---|
+ n-preview-1-docs.zip | +
+ MD5:4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1:6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+
裝置 | +下載 / 總和檢查碼 | +
---|---|
Nexus 5X "bullhead" |
+ bullhead-npc56p-preview-6c877a3d.tgz + MD5:b5cf874021023b398f5b983b24913f5d + SHA-1:6c877a3d9fae7ec8a1678448e325b77b7a7b143a + |
+
Nexus 6 "shamu" |
+ shamu-npc56p-preview-54b13c67.tgz + MD5:af183638cf34e0eb944a1957d7696f60 + SHA-1:54b13c6703d369cc79a8fd8728fe4103c6343973 + |
+
Nexus 6P "angler" |
+ angler-npc56p-preview-85ffc1b1.tgz + MD5:bc4934ea7bd325753eee1606d3725a24 + SHA-1:85ffc1b1be402b1b96f9ba10929e86bba6c6c588 + |
+
Nexus 9 "volantis" |
+ volantis-npc56p-preview-0e8ec8ef.tgz + MD5:c901334c6158351e945f188167ae56f4 + SHA-1:0e8ec8ef98c7a8d4f58d15f90afc5176303efca4 + |
+
Nexus 9G "volantisg" |
+ volantisg-npc56p-preview-1bafdbfb.tgz + MD5:7bb95bebc478d7257cccb4652899d1b4 + SHA-1:1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6 + |
+
Nexus Player "fugu" |
+ fugu-npc56r-preview-7027d5b6.tgz + MD5:f5d3d8f75836ccfe4c70e8162e498be4 + SHA-1:7027d5b662bceda4c80a91a0a14ef0e5a7ba795b + |
+
Pixel C "ryu" |
+ ryu-npc56p-preview-335a86a4.tgz + MD5:4e21fb183bbbf467bee91598d587fd2e + SHA-1:335a86a435ee51f18464de343ad2e071c38f0e92 + |
+
一般行動裝置 4G (Android One) "seed" |
+ seed_l8150-npc56p-preview-82472ebc.tgz + MD5:983e083bc7cd0c4a2d39d6ebaa20202a + SHA-1:82472ebc9a6054a103f53cb400a1351913c95127 + |
+
+ 如果您想要從裝置解除安裝預覽版,可以透過下列其中一方式執行: +
++ 裝置會透過 OTA 更新方式接收提供給該裝置的最新 Android 生產版本 (例如 Android 6.0 Marshmallow)。更新要求重設整個裝置,所以裝置上的使用者資料會被移除。取消註冊裝置前,請務必備份重要資料。 + + + + +
+注意:在計劃結束前解除安裝「Developer Preview」系統映像需要重設整個裝置,而且會移除裝置上的所有使用者資料。 + + + +
+ + +如果要使用 Android 模擬器來執行 Android N Preview,您需要下載 Android N Preview SDK 並為模擬器建立一個虛擬裝置。 + +
+ +首先,遵循下列方式下載 Android N Preview SDK (如果您在設定以針對 Android N 開發時已經取得該 SDK,則可以略過這個部分): + + + +
您現在應該有 Android SDK Built-Tools 24.0 0 rc1、Platform-Tools 24.0.0 rc1 與 SDK Tools 25.0.9。如果您沒有將 SDK Tools 更新為 25.0.9,就無法執行 Android N 的 x86_64 系統映像。 + + +
+ + +現在使用 Android N 系統映像建立一個虛擬裝置:
+ +您現在可以使用 Android N Preview AVD 啟動 Android 模擬器。
+ ++為了在 Android 模擬器中獲得最佳體驗,請安裝 Android Studio 2.1 Preview,它支援 Android Emulator 2.0 Beta,效能比 Android Studio 1.5 中的模擬器快。 + + +
+ +注意:如果您目前使用 Android Studio 2.0 Beta,它已知會出現阻止您使用 N Preview 系統映像建立 AVD 的問題,所以您目前需要使用 Android Studio 2.1 預覽版來建立 AVD。 + + + +
+ +如需建立虛擬裝置的詳細資訊,請參閱管理虛擬裝置。 +
+ + + + + + + + + + + + + + ++ 背景處理程序可能耗用大量的記憶體或電池電力。例如,隱含式廣播可能會啟動許多已註冊要接聽它的背景處理程序,即使那些處理程序可能不會執行太多工作。 + +這可能會對裝置效能與使用者體驗兩者造成實質影響。 + +
+ ++ 為減輕此問題,N Developer Preview 套用下列限制: + +
+ ++ Android 架構提供數種解決方案來減少這些隱含式廣播的需求。 +例如,{@link android.app.job.JobScheduler} 與 + {@code GcmNetworkManager} 提供的健全機制,可在符合指定條件 (例如,連線到非計量付費網路) 的情況下排程網路操作。 + + +您甚至可以使用 {@link android.app.job.JobScheduler} 對內容提供者的變更採取因應動作。{@link android.app.job.JobInfo} 物件會封裝 {@link android.app.job.JobScheduler} 用來排程您的工作的參數。 + + +符合工作的條件時,系統會在應用程式的 {@link android.app.job.JobService} 上執行此工作。 + +
+ ++ 在此文件中,我們將學習如何使用替代方法 (例如 + {@link android.app.job.JobScheduler}) 改寫您的應用程式以配合這些新的限制。 + +
+ ++ 目標為 N Developer Preview 的應用程式,如果在宣示說明中註冊以接收廣播,則不會收到 {@link + android.net.ConnectivityManager#CONNECTIVITY_ACTION} 廣播,而相依於此廣播的處理程序將不會啟動。 + +這可能會在裝置連線到非計量付費網路時,對想要接聽網路變更或執行大量網路活動的應用程式造成問題。 + +Android 架構中已經有數個可以避過此限制的解決方案,但是選擇適當的方法取決於您想要應用程式完成什麼工作。 + + +
+ ++ 注意:使用 + {@link android.content.Context#registerReceiver Context.registerReceiver()} + 註冊的 {@link android.content.BroadcastReceiver} 會在應用程式位於前景時繼續接收這些廣播。 +
+ ++ 使用 {@link android.app.job.JobInfo.Builder JobInfo.Builder} 類別建置 {@link android.app.job.JobInfo} 物件時,請套用 {@link + android.app.job.JobInfo.Builder#setRequiredNetworkType + setRequiredNetworkType()} 方法並傳遞 {@link android.app.job.JobInfo + JobInfo.NETWORK_TYPE_UNMETERED} 當做工作參數。 +下列程式碼範例會排程服務,讓它在裝置連線到非計量付費網路和收費時執行: + + +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo job = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MyJobService.class)) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) + .setRequiresCharging(true) + .build(); + js.schedule(job); +} ++ +
+ 符合您工作的條件時,您的應用程式會收到一個回呼,在指定的 {@code JobService.class} 中執行{@link android.app.job.JobService#onStartJob onStartJob()} 方法。 + +如果要檢視更多 {@link + android.app.job.JobScheduler} 實作的範例,請參閱 JobScheduler 範例應用程式。 +
+ ++ 使用 GMSCore 服務且目標為 Android 5.0 (API 層級 21) 或更低的應用程式,可以使用 + {@code GcmNetworkManager} 並指定 {@code Task.NETWORK_STATE_UNMETERED}。 + +
+ ++ 在前景執行的應用程式,只要使用註冊的 {@link + android.content.BroadcastReceiver} ,仍然可以接聽 {@code + CONNECTIVITY_CHANGE}。然而,{@link + android.net.ConnectivityManager} API 提供更建全的方法,只在符合指定的網路條件時才要求回呼。 + +
+ ++ {@link android.net.NetworkRequest} 物件以 {@link android.net.NetworkCapabilities} 的方式定義網路回呼的參數。 +您使用 {@link + android.net.NetworkRequest.Builder NetworkRequest.Builder} 類別建立{@link android.net.NetworkRequest} 物件。接著 {@link + android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, + android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} + 會將 {@link android.net.NetworkRequest} 物件傳遞到系統。 +符合網路條件時,應用程式會收到回呼,執行它的 {@link + android.net.ConnectivityManager.NetworkCallback} 類別中定義的 + {@link android.net.ConnectivityManager.NetworkCallback#onAvailable + onAvailable()} 方法。 + +
+ ++ 應用程式會持續收到回呼,直到應用程式結束或呼叫 + {@link android.net.ConnectivityManager#unregisterNetworkCallback + unregisterNetworkCallback()} 才停止。 +
+ ++ 在 N Developer Preview 中,應用程式無法傳送或接收 {@link + android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link + android.hardware.Camera#ACTION_NEW_VIDEO} 廣播。在必須喚醒數個應用程式來處理新的影像或視訊時,此限制有助於降低對效能與使用者體驗的影響。 + +N Developer Preview 擴充 {@link android.app.job.JobInfo} 與 {@link + android.app.job.JobParameters} 來提供替代解決方案。 + +
+ ++ 為了在內容 URI 變更時觸發工作,N Developer Preview 使用下列方法擴充 {@link android.app.job.JobInfo} API: + +
+ ++ 注意:{@code TriggerContentUri()} 無法與 {@link android.app.job.JobInfo.Builder#setPeriodic + setPeriodic()} 或 {@link android.app.job.JobInfo.Builder#setPersisted + setPersisted()} 結合使用。 +為了持續監視內容變更,請在應用程式的 {@link + android.app.job.JobService} 完成處理最近的回呼之前,排程新的 + {@link android.app.job.JobInfo}。 +
+ ++ 下列範例程式碼會排程一個工作,在系統回報內容 URI {@code MEDIA_URI} 變更時觸發該工作: + +
+ ++public static final int MY_BACKGROUND_JOB = 0; +... +public static void scheduleJob(Context context) { + JobScheduler js = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobInfo.Builder builder = new JobInfo.Builder( + MY_BACKGROUND_JOB, + new ComponentName(context, MediaContentJob.class)); + builder.addTriggerContentUri( + new JobInfo.TriggerContentUri(MEDIA_URI, + JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); + js.schedule(builder.build()); +} ++
+ 當系統回報指定內容 URI 中有變更時,您的應用程式會收到一個回呼,而且會傳遞一個 {@link android.app.job.JobParameters} 物件到 {@code MediaContentJob.class} 中的 {@link android.app.job.JobService#onStartJob onStartJob()} 方法。 + + + +
+ ++ N Developer Preview 也擴充 {@link android.app.job.JobParameters} 以允許您的應用程式接收有關內容授權單位與觸發工作之 URI 的實用資訊: + + +
+ ++ 下列範例程式碼會覆寫 {@link + android.app.job.JobService#onStartJob JobService.onStartJob()} 方法,並記錄觸發工作的內容授權單位與 URI: + +
+ ++@Override +public boolean onStartJob(JobParameters params) { + StringBuilder sb = new StringBuilder(); + sb.append("Media content has changed:\n"); + if (params.getTriggeredContentAuthorities() != null) { + sb.append("Authorities: "); + boolean first = true; + for (String auth : + params.getTriggeredContentAuthorities()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(auth); + } + if (params.getTriggeredContentUris() != null) { + for (Uri uri : params.getTriggeredContentUris()) { + sb.append("\n"); + sb.append(uri); + } + } + } else { + sb.append("(No content)"); + } + Log.i(TAG, sb.toString()); + return true; +} ++ +
+ 最佳化您的應用程式,讓它可以在低記憶體裝置上或低記憶體狀況下執行,這樣可以改進效能與使用者體驗。 +移除背景服務上的相依性與靜態註冊的隱含式廣播接收器,有助於讓您的應用程式在此類裝置上執行得更順暢。 + +雖然 N Developer Preview 採取一些步驟來減少一些此類問題,但是還是建議您最佳化您的應用程式,讓它完全不必使用這些背景處理程序。 + + + +
+ ++ N Developer Preview 引進一些額外的 Android Debug Bridge (ADB) 命令,您可以使用這些命令測試在那些背景處理程序停用時的應用程式行為: + +
+ ++{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} ++
+{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} ++
Android N 會在一個安全的 直接開機 模式下執行,這是裝置已經開啟電源但使用者尚未解鎖裝置的期間。 + +為了支援這種方式,系統為資料提供兩個儲存位置:
+ +根據預設,應用程式不會在「直接開機」模式下執行。如果您的應用程式需要在「直接開機」模式期間執行動作,您可以註冊應該在此模式下執行的應用程式元件。 + +需要在「直接開機」模式下執行的一些常見應用程式使用案例包括: +
+ +如果您的應用程式需要在「直接開機」模式期間存取資料,請使用裝置加密的儲存空間。 +裝置加密的儲存空間包含以金鑰加密的資料,這個金錀只有在裝置執行成功的驗證開機之後才能使用。 + +
+ +對於應該使用與使用者認證關聯之金鑰 (例如 PIN 或密碼) 加密的資料,請使用認證加密的儲存空間。認證加密的儲存空間只有在使用者成功解鎖裝置之後到使用者再次重新啟動裝置之間的時間可以使用。 + + +如果使用者在解鎖裝置之後啟用鎖定螢幕,並不會鎖定認證加密的儲存空間。 + +
+ +應用程式必須先向系統註冊其元件,這些元件才能在「直接開機」模式期間執行或存取裝置加密的儲存空間。
+
+向系統註冊的應用程式會將元件標記為
+加密感知。如果要將元件標記為加密感知,請將宣示說明中的
+android:encryptionAware
屬性設定為 true。
+ +
當裝置重新啟動時,加密感知元件可以註冊為從系統接收
+LOCKED_BOOT_COMPLETED
廣播訊息。
+這個時候可以使用裝置加密的儲存空間,而且您的元件可以執行在「直接開機」模式期間需要執行的工作,例如觸發排程的鬧鐘。
+
+
下列程式碼片段是一個範例,示範如何在應用程式宣示說明中將
+{@link android.content.BroadcastReceiver} 註冊為加密感知以及如何為
+LOCKED_BOOT_COMPLETED
新增意圖篩選器:
+<receiever + android:encryptionAware="true" > + ... + <intent-filter> + <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> + </intent-filter> +</receiver> ++ +
一旦使用者將裝置解鎖,所有元件都可存取裝置加密的儲存空間與認證加密的儲存空間。 +
+ +如果要存取裝置加密的儲存空間,請透過呼叫
+Context.createDeviceEncryptedStorageContext()
以建立第二個
+{@link android.content.Context} 實例。使用此內容建立的所有儲存 API 呼叫都可以存取裝置加密的儲存空間。
+下列範例會存取裝置加密的儲存空間並開啟現有的應用程式資料檔案:
+
+
+Context directBootContext = Context.createDeviceEncryptedStorageContext(); +// Access appDataFilename that lives in device encrypted storage +FileInputStream inStream = directBootContext.openFileInput(appDataFilename); +// Use inStream to read content... ++ +
只針對必須在「直接開機」模式期間存取的資訊使用裝置加密的儲存空間。不要將裝置加密的儲存空間做為一般用途的加密存放區。對於私密使用者資訊或「直接開機」模式期間不需要的加密資料,請使用認證加密的儲存空間。 + + + +
+ +裝置重新啟動之後,一旦使用者將裝置解鎖,您的應用程式就可以切換為存取認證加密的儲存空間,並使用倚賴使用者認證的一般系統服務。 + +
+ +如果要接收裝置重新開機後使用者解鎖裝置的通知,請從執行中元件註冊 {@link android.content.BroadcastReceiver} 以接聽 ACTION_USER_UNLOCKED
訊息。
+
+或者,您可以接收現有的 {@link android.content.Intent#ACTION_BOOT_COMPLETED
+ACTION_BOOT_COMPLETED} 訊息,它現在可以指出裝置已開機且使用者已解鎖裝置。
+
+
您可以透過呼叫
+UserManager.isUserUnlocked()
,以直接查詢使用者是否已將裝置解鎖。
如果使用者更新其裝置來使用「直接開機」模式,您可能有現有的資料必須遷移到裝置加密的儲存空間。
+使用
+Context.migrateSharedPreferencesFrom()
與
+Context.migrateDatabaseFrom()
,在認證加密的儲存空間與裝置加密的儲存空間之間遷移偏好設定與資料庫資料。
+
決定要將哪些資料從認證加密的儲存空間遷移到裝置加密的儲存空間時,請使用最佳判斷。 +您不應該將私密使用者資訊 (例如密碼或授權權杖) 遷移到裝置加密的儲存空間。 + +在某些情況下,您需要在這兩種加密的存放區中管理不同的資料集。 +
+ +使用新的「直接開機」模式測試您的加密感知應用程式。您可以透過兩種方式啟用「直接開機」。 +
+ +注意:啟用「直接開機」會清除裝置上的所有使用者資料。 +
+ +在已安裝 Android N 的支援裝置上,執行下列其中一個動作來啟用「直接開機」: +
+ ++$ adb reboot-bootloader +$ fastboot --wipe-and-use-fbe ++
另外也提供模擬的「直接開機」模式,如果您需要在測試裝置上切換模式時即可利用。 +模擬模式應該只在開發期間使用,而且它可能造成資料遺失。 +如果要啟用模擬的「直接開機」模式,請在裝置上設定鎖定模式;設定鎖定模式時如果系統提示您設定安全啟動畫面,請選擇 [No thanks],然後使用下列 adb shell 命令: + + +
+ ++$ adb shell sm set-emulate-fbe true ++ +
如果要關閉模擬的「直接開機」模式,請使用下列命令:
+ ++$ adb shell sm set-emulate-fbe false ++ +
使用這些命令會使得裝置重新開機。
diff --git a/docs/html-intl/intl/zh-tw/preview/features/icu4j-framework.jd b/docs/html-intl/intl/zh-tw/preview/features/icu4j-framework.jd new file mode 100644 index 000000000000..77bbc4d8170c --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/features/icu4j-framework.jd @@ -0,0 +1,158 @@ +page.title=ICU4J Android 架構 API + +@jd:body + ++ ICU4J 是廣為使用的一組開放原始碼 Java 程式庫,為軟體應用程式提供 Unicode 與全球化支援。 +Android N 在 Android 架構中公開一個 ICU4J API 的子集,供應用程式開發人員在 {@code android.icu} 套件下使用。 + +這些 API 使用裝置上呈現的當地語系化資料。 +因此,您可以不用將 ICU4J 程式庫編譯到 APK 而降低 APK 的使用;相反地,您只需在架構中呼叫這些程式庫 + +(在此情況中,您可能要提供多個版本的 APK,這樣執行低於 Android N 之 Android 版本的使用者即可下載包含 ICU4J 程式庫的應用程式版本)。 + + + +
+ ++ 此文件一開始先提供支援這些程式庫所需之最低 Android API 層級的一些基本資訊。 +接著它說明 Android 特定實作 ICU4J 的相關須知事項。 +最後,它告訴您如何在 Android 架構中使用 ICU4J API。 + +
+ +
+ Android N 透過
+ android.icu
套件 (而非 com.ibm.icu
) 公開一個 ICU4J API 的子集。Android 架構可能因為各種原因選擇不公開 ICU4J API;例如,Android N 沒有公開一些已過時的 API 或 ICU 團隊尚未宣布為穩定的 API。
+
+
+
+因為 ICU 團隊將來會將 API 視為過時,所以 Android 也會將這些 API 標示為已過時但繼續包含它們。
+
+
Android API 層級 | +ICU 版本 | +CLDR 版本 | +
---|---|---|
Android N | +56 | +28 | +
以下是一些必須注意的重要事項:
+ +
+ 如果您已經在應用程式中使用 ICU4J API,而且
+ android.icu
API 符合您的需求,那麼遷移到架構 API 需要您將 Java 匯入從 com.ibm.icu
變更為 android.icu
。
+
+接著您可以從 APK 移除您自己的 ICU4J 檔案。
+
+
+ 注意:ICU4J 架構 API 使用 {@code android.icu} 命名空間而非 {@code com.ibm.icu}。 +這是為了避免包含自己的 {@code com.ibm.icu} 程式庫的 APK 中發生命名空間衝突。 + +
+ +
+ java
與 android
套件中的一些類別包含可在 ICU4J 中找到的同等項目。
+然而,ICU4J 通常為標準與語言提供更廣泛的支援。
+
+
以下提供一些快速入門範例:
+類別 | +替代項目 | +
---|---|
java.lang.Character |
+android.icu.lang.UCharacter |
+
java.text.BreakIterator |
+android.icu.text.BreakIterator |
+
java.text.DecimalFormat |
+android.icu.text.DecimalFormat |
+
java.util.Calendar |
+
+android.icu.util.Calendar |
+
android.text.BidiFormatter
+ |
+android.icu.text.Bidi
+ |
+
android.text.format.DateFormat
+ |
+android.icu.text.DateFormat
+ |
+
android.text.format.DateUtils |
+android.icu.text.DateFormat
+android.icu.text.RelativeDateTimeFormatter
+ |
+
+ ICU4J 是根據 ICU 授權而發行。如需詳細資料,請參閱 ICU 使用者指南。 + +
diff --git a/docs/html-intl/intl/zh-tw/preview/features/multi-window.jd b/docs/html-intl/intl/zh-tw/preview/features/multi-window.jd new file mode 100644 index 000000000000..788951c8fb98 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/features/multi-window.jd @@ -0,0 +1,582 @@ +page.title=多視窗支援 +page.metaDescription=Android N 新推出支援一次顯示多個應用程式。 +page.keywords="multi-window", "android N", "split screen", "free-form" + +@jd:body + ++ Android N 新增一次顯示多個應用程式的支援。 +在手持式裝置上,兩個應用程式可以在「分割畫面」模式中並排或上下排列。 +在電視裝置上,應用程式能使用「子母畫面」模式,在使用者與另一個應用程式互動時持續播放影片。 + + +
+ ++ 如使用 N Preview SDK 建置應用程式,您可以設定應用程式處理多視窗顯示的方式。 +例如,您可以指定活動的最小可允許尺寸。 +您也可以停用應用程式的多視窗顯示,確保系統只會以全螢幕模式顯示您的應用程式。 + + +
+ ++ Android N 允許多個應用程式同時分享螢幕。例如,使用者可以分割畫面,在左邊檢視網頁,同時在右邊撰寫電子郵件。 + +使用者體驗依裝置而異: + +
+ ++ 使用者可以透過下列方式來切換多視窗模式: +
+ ++ 使用者可以在活動分享螢幕時,將一個活動中的資料拖放到另一個活動。 + +(之前,使用者只能在單一活動內拖放資料)。 + +
+ ++ 多視窗模式不會變更活動生命週期。 + +
+ ++ 在多視窗模式中,特定時間只有最近與使用者互動的活動才會處於使用中。 +這會視為「最上層」活動。 + 即使能看到所有其他活動,但也處於暫停狀態。 + 然而,相較於看不到的活動,系統會給予這類暫停但可看見的活動較高的優先順序。 +若使用者改與其中一個暫停的活動互動,該活動就會恢復,使先前的最上層活動變成暫停。 + + +
+ ++ 注意:在多視窗模式中,使用者仍能見到處於暫停狀態的應用程式。 +即使處於暫停,應用程式仍需要進行其活動。 +例如,處於暫停模式但仍可以看見的影片播放應用程式,應會持續顯示其影片。 +因此,建議您在播放影片的活動 {@link android.app.Activity#onPause onPause()} 處理常式中,「不要」暫停影片。 + + + 應該改為在 {@link android.app.Activity#onStop + onStop()}, and resume playback in {@link android.app.Activity#onStart + onStart()} 中暫停影片。 +
+ ++ 當使用者將應用程式放入多視窗模式時,系統會通知活動發生設定變更,如處理執行階段變更所指定。 + +基本上,此變更的活動生命週期和系統通知應用程式,裝置從垂直模式切換為水平模式時的生命週期相當,差別在於裝置尺寸會改變,而不只是切換。 + + +如處理執行階段變更中所述,您的活動能自行處理設定變更,或會允許系統終結活動並以新的尺寸重新建立。 + + + +
+ +
+ 如果使用者調整視窗大小並加大長或寬的尺寸,系統會根據使用者動作來調整活動大小,並視需要發出執行階段變更。
+
+若應用程式在新公開的區域中繪製發生延遲,系統會暫時使用 {@link
+ android.R.attr#windowBackground windowBackground} 所指定的色彩或預設的
+ windowBackgroundFallback
樣式屬性,填滿那些區域。
+
+
+ 您的應用程式若以 Android N 為目標,您可以設定應用程式的活動是否支援多視窗顯示以及支援的方式。 +您可以在宣示說明中設定屬性,同時控制大小與版面配置。 + + 根活動的屬性設定會套用到它工作堆疊內的所有活動。 + +
+ ++ 注意:如果您使用 Android N 以下的 SDK 版本建置多螢幕方向應用程式,而且使用者會在多視窗模式中使用該應用程式,系統會強制調整應用程式大小。 + +系統會顯示對話方塊向使用者警告應用程式行為異常。 +系統「不會」調整螢幕方向固定的應用程式大小,如使用者嘗試在多視窗模式下開啟螢幕方向固定的應用程式,應用程式會佔滿整個螢幕。 + + + +
+ +
+ 在宣示說明的 <activity>
或
+ <application>
節點中,設定此屬性以啟用或停用多視窗顯示:
+
+
+android:resizeableActivity=["true" | "false"] ++ +
+ 如將此屬性設定為 true,就能以分割畫面和自由形式模式來啟動活動。 +如將屬性設定為 false,活動會不支援多視窗模式。 +如果此值為 false,而使用者嘗試以多視窗模式啟動活動,該活動會佔滿整個螢幕。 + + +
+ ++ 您的應用程式如以 Android N 為目標,但您並未指定此屬性的值,屬性的預設值為 true。 + +
+ +
+ 在宣示說明的 <activity>
節點中,設定此屬性以指出活動是否支援子母畫面顯示:
+如果 android:resizeableActivity
為 false,則會忽略此屬性。
+
+
+android:supportsPictureInPicture=["true" | "false"] ++ +
+ 使用 Android N,<layout>
宣示說明元素支援的數個屬性會影響多視窗模式中的活動行為。
+
+
+
android:defaultWidth
+ android:defaultHeight
+ android:gravity
+ android:minimalSize
+ + 例如,在自由形式模式中顯示活動時,下列程式碼顯示如何指定活動的預設大小與位置以及它的最小大小: + + +
+ ++<activity android:name=".MyActivity"> + <layout android:defaultHeight="500dp" + android:defaultWidth="600dp" + android:gravity="top|end" + android:minimalSize="450dp" /> +</activity> ++ +
+ Android N 提供的新功能支援在多視窗模式中執行應用程式。 + +
+ ++ 當裝置處於多視窗模式時,有些功能無法用於會與其他活動或應用程式分享裝置螢幕的活動,因此會加以停用或忽略。 + +這類功能包括: + +
android:screenOrientation
屬性的變更。
+ + 已將下列可支援多視窗顯示的新方法新增至 {@link android.app.Activity} + 類別。如需每個方法的詳細資訊,請參閱 + N Preview SDK 參考資料。 +
+ +Activity.inMultiWindow()
+ Activity.inPictureInPicture()
+
+ 注意:子母畫面模式為多視窗模式的特殊情況。
+如果 myActivity.inPictureInPicture()
+ 傳回 true,那麼 myActivity.inMultiWindow()
也會傳回 true。
+
+
Activity.onMultiWindowChanged()
+ Activity.onPictureInPictureChanged()
+
+ 上述的每一個方法也都有 {@link android.app.Fragment} 版本,例如
+ Fragment.inMultiWindow()
。
+
+ 呼叫新方法
+ Activity.enterPictureInPicture()
,即可將活動放入子母畫面模式。如果裝置不支援子母畫面模式,這個方法就沒有作用。
+如需詳細資訊,請參閱子母畫面文件。
+
+
+ 當您啟動新活動,可以提示系統應儘可能在目前活動的旁邊顯示新的活動。
+如要這樣做,請使用旗標
+ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
。
+傳遞此旗標會要求下列行為:
+
+
+ 如果裝置處於自由形式模式,而您正在啟動新的活動,您可以呼叫
+ ActivityOptions.setLaunchBounds()
,指定新活動的尺寸與畫面位置。
+如果裝置未處於多視窗模式,這個方法就沒有作用。
+
+
+ 注意:如果您在工作堆疊內啟動活動,該活動就會取代畫面上的活動,繼承它的所有多視窗屬性。 + +如果您想要在多視窗模式中,以個別的視窗啟動活動,您必須在新的工作堆疊中啟動該活動。 + +
+ ++ 使用者可以在兩個活動分享螢幕時,將一個活動中的資料拖放到另一個活動。 + +(之前,使用者只能在單一活動內拖放資料)。 +因此,若您的應用程式目前不支援拖曳功能,建議您將該功能新增至應用程式。 + +
+ +
+ N Preview SDK 擴充 android.view
+ 套件,支援跨應用程式的拖放功能。如需下列類別與方法的詳細資訊,請參閱 N Preview SDK 參考資料。
+
+
+
android.view.DropPermissions
+ View.startDragAndDrop()
+ View.DRAG_FLAG_GLOBAL
,就可以啟用跨活動的拖放功能。
+如果您需要將 URI 權限授予接收者活動,請視需要傳遞新旗標
+ View.DRAG_FLAG_GLOBAL_URI_READ
或
+ View.DRAG_FLAG_GLOBAL_URI_WRITE
。
+
+ View.cancelDragAndDrop()
+ View.updateDragShadow()
+ Activity.requestDropPermissions()
+ + 不論您是否針對 Android N 更新您的應用程式,都應該確認應用程式在多視窗模式中的行為為何,以免使用者試圖在執行 Android N 的裝置上以多視窗模式啟動應用程式。 + + +
+ ++ 如果您在裝置上安裝 Android N,即自動支援分割畫面模式。 + +
+ ++ 若您並非以 N Preview SDK 建置應用程式,而且使用者會試圖在多視窗模式中使用該應用程式,除非應用程式宣告螢幕方向固定,否則系統會強制調整應用程式大小。 + + +
+ ++ 若您的應用程式並未宣告螢幕方向固定,您應該在執行 Android N 的裝置上啟動應用程式,並嘗試將應用程式放入分割畫面模式。 + +確認強制調整應用程式大小時的使用者體驗可以接受。 + +
+ ++ 若您的應用程式宣告螢幕方向固定,您應該嘗試將應用程式放入多視窗模式。 +確認您這樣做時,應用程式依然會處於全螢幕模式。 + +
+ ++ 如果您以 N Preview SDK 建置應用程式且未停用多視窗支援,請在分割畫面與自由形式模式下,確認下列行為: + + +
+ ++ 若要確認應用程式在多視窗模式中的效能,請嘗試下列操作。 +除非另外註明,否則您應該在分割畫面與多視窗模式中嘗試這些操作。 + +
+ +
+ 若您已設定
+ android:resizableActivity="false"
來停用多視窗支援,您應該在執行 Android N 的裝置上啟動應用程式,並嘗試將應用程式放入自由形式與分割畫面模式。
+
+確認您這樣做時,應用程式依然會處於全螢幕模式。
+
+
Android N 增強對多語言使用者的支援,讓他們可在設定中選取多個地區設定。 +Android N 藉由擴充支援的地區設定數量和改變系統解析資源的方式來提供多語言支援。 + +解析資源的新方法更加健全,而且它的設計是與現有 APK 相容,但是您應該特別注意任何未預期的行為。 + +例如,您應該進行測試,確認應用程式預設在預期的語言。 +此外,如果您的應用程式支援多個語言,則應該確保這項支援也能如預定方式運作。 + +最後,您應該試著確認應用程式可以順暢地處理沒有明確設計要支援的語言。 +
+ +本文件一開始會先說明在 Android N 之前的資源解析策略。接下來,它會描述 Android N 的已改進的資源解析策略。 + +最後,它會說明如何利用擴充的地區設定數量來支援更多的多語言使用者。 +
+ +在 Android N 之前,Android 並不總能成功地對應應用程式與系統地區設定。 +舉例來說,假設您應用程式的預設語言的是 US English,但是它的 {@code es_ES} 資源檔案中也包含當地語言化的西班牙文字串。 + +
+當您的 Java 程式碼參考這些字串時,它會以下列方式來解析字串語言: +
+出現這些解析問題的原因,是如果系統找不到符合的項目,它會剝除地區設定中的國家/地區代碼。 +例如:
+ +使用者設定 | +應用程式資源 | +資源解析 | +
---|---|---|
fr_CH | +
+預設 (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+嘗試 fr_CH => 失敗 +嘗試 fr => 失敗 +使用預設 (en) + |
+
在此例中,系統會顯示英文字串,而不知道使用者是否了解英文。 +現在這種行為相當常見。 +Android N 可以大幅降低出現這類結果的頻率。 +
+ +Android N 帶來更健全的資源解析,而且會自動發現更佳的遞補。
+然而,為了加速解析和改進維護能力,您應該將資源存放在最常用的父系語言中。
+
+ 例如,如果之前將西班牙文資源存放在 {@code es-US} 目錄,請將它們移到包含拉丁美洲西班牙文的 {@code es-419} 目錄。
+
+ 同樣地,如果在名為 {@code en-GB} 的資料夾中包含資源字串,請將資料夾重新命名為 {@code en-001} (國際英文),因為 en-GB
字串的最常見父系為 {@code en-001}。
+
+
+ 下列範例說明為什麼這些做法可改善資源解析的效能和可靠性。
+
在 Android N 中,表 1 中所述的案例會用不同的方式解析: +
+ + +使用者設定 | +應用程式資源 | +資源解析 | +
---|---|---|
|
+
+預設 (en) +de_DE +es_ES +fr_FR +it_IT + |
+
+嘗試 fr_CH => 失敗 +嘗試 fr => 失敗 +嘗試 fr 的子項 => fr_FR +使用 fr_FR + |
+
現在使用者會取得法文資源而非英文資源。這個範例也顯示為什麼在 Android N 中,您應該將法文字串存放在 {@code fr} 而非 {@code fr_FR} 中。以下是比對最接近父系語言的動作步驟,這些步驟可讓解析更快、更容易預測。 + + +
+ +除了這個已改進的解析邏輯之外,現在 Android 還提供更多使用者語言供您選擇。 +讓我們指定義大利文做為額外的使用者語言但應用程式不支援法文的情況,再試一次上述的範例。 +
+ + +使用者設定 | +應用程式資源 | +資源解析 | + +
---|---|---|
|
+
+預設 (en) +de_DE +es_ES +it_IT + |
+
+嘗試 fr_CH => 失敗 +嘗試 fr => 失敗 +嘗試 fr 的子項 => 失敗 +嘗試 it_CH => 失敗 +嘗試 it => 失敗 +嘗試 it 的子項 => it_IT +使用 it_IT + |
+
+
即使應用程式不支援法文,但是使用者仍然取得他們了解的語言。 +
+ + +Android N 增加了新的 API {@code LocaleList.GetDefault()} +,讓應用程式直接查詢使用者指定的語言清單。這個 API 可讓您建立更精細的應用程式行為,也能更好的最佳化內容的顯示方式。 + +例如,搜尋可以根據使用者的設定以多語言顯示結果。 +瀏覽器應用程式可以避免提供以使用者已知語言來翻譯網頁的選項,鍵盤應用程式可以自動啟用所有適當的版面配置。 + +
+ +直到 Android 6.0 (API 層級 23),Android 還只支援許多常用語言 (en、es、ar、fr、ru) 的一或兩個地區設定。 + +因為每種語言只有幾種變體,所以應用程式不用在資源檔案中將一些數字和日期儲存為硬式編碼字串。 + +然而,隨著 Android 擴充了支援的地區設定之後,即使在單一地區設定中,日期、時間、貨幣和類似資訊的格式可能會有顯著的差異。 + + +硬式編碼您的格式會對使用者產生令人混淆的體驗。 +因此,針對 Android N 進行開發時,請務必使用格式子,而不要硬式編碼數字和日期字串。 +
+ +最主要的範例是阿拉伯文,它對 Android N 的支援從一個 {@code ar_EG} 擴充到 27 個阿拉伯地區設定。 +這些地區設定可以共用大多數的資源,但是有些地區設定慣用 ASCII 數字,而其他地區設定慣用當地數字。 +例如,在您想要建立一個包含數字變數的句子時,例如 "Choose a 4 digit pin",請使用如下所示的格式設定: + +
+ +format(locale, "Choose a %d-digit PIN", 4)diff --git a/docs/html-intl/intl/zh-tw/preview/features/notification-updates.jd b/docs/html-intl/intl/zh-tw/preview/features/notification-updates.jd new file mode 100644 index 000000000000..5ebcebb2a5a2 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/features/notification-updates.jd @@ -0,0 +1,328 @@ +page.title=通知 +page.tags=notifications +helpoutsWidget=true +page.image=/preview/images/notifications-card.png + +trainingnavtop=true + +@jd:body + + + +
Android N 引進數個新 API,允許應用程式張貼相當顯眼且互動式的通知。 +
+ +Android N 擴充現有的 {@link android.support.v4.app.RemoteInput} +通知 API,支援在手機上內嵌回覆。此功能允許使用者從通知欄快速回應,而不必造訪您的應用程式。 +
+ ++ Android N 也允許您將類似的通知結合成單一通知。 +Android N 使用現有的 {@link + android.support.v4.app.NotificationCompat.Builder#setGroup + NotificationCompat.Builder.setGroup()} 方法來實現此目標。使用者能擴充每個通知,並可個別從通知欄執行動作,例如回覆和關閉每一個通知。 + + +
+ +最後,Android N 還新增 API 讓您在應用程式的自訂通知檢視中利用系統的裝飾。 +這些 API 可協助確保通知檢視和標準範本的呈現方式一致。 + +
+ +本文件將強調說明一些重要變更,您應該在應用程式中使用新的通知功能時納入考量。 +
+ +使用 Android N 中的直接回覆功能,使用者可直接在通知介面內快速回應文字訊息或更新工作清單。 + +在手持式裝置上,內嵌回覆動作看起來就像是通知附加的額外按鈕。 +當使用者透過鍵盤回覆時,系統會在您為通知動作指定的意圖附加文字回應,然後將意圖傳送給您的手持裝置應用程式。 + + + + + + +
+ +建立支援直接回覆的通知動作: +
+ ++// Key for the string that's delivered in the action's intent +private static final String KEY_TEXT_REPLY = "key_text_reply"; +String replyLabel = getResources().getString(R.string.reply_label); +RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) + .setLabel(replyLabel) + .build(); ++
addRemoteInput()
將 {@link android.support.v4.app.RemoteInput}
+ 物件附加到動作。
+
++// Create the reply action and add the remote input +Notification.Action action = + new Notification.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); ++
+// Build the notification and add the action +Notification notification = + new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_message) + .setContentTitle(getString(R.string.title)) + .setContentText(getString(R.string.content)) + .addAction(action)) + .build(); + +// Issue the notification +NotificationManager notificationManager = + NotificationManager.from(mContext); +notificationManager.notify(notificationId, notification); + ++
當使用者觸發通知動作時,系統會提示使用者輸入回應。 +
+ + + + +從您在回覆動作的意圖中所宣告動作的通知介面接收使用者輸入: +
++Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); ++ +
下列程式碼片段說明方法如何從組合中擷取輸入文字: +
+ ++// Obtain the intent that started this activity by calling +// Activity.getIntent() and pass it into this method to +// get the associated string. + +private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(KEY_TEXT_REPLY); + } + return null; + } ++ +
應用程式可以套用邏輯,決定擷取文字時要採取的動作。對於互動式應用程式 (像是聊天),要在通知本身提供更多內容 (例如,多行聊天歷程記錄,包括使用者自己的訊息),使用者才能適當回應。當使用者透過 {@link android.support.v4.app.RemoteInput} 回應時,請使用 {@code setRemoteInputHistory()} + 方法在回覆歷程記錄中包括文字。 + + + + + +
+ +Android N 提供開發人員呈現通知佇列的全新方式: + 整合式通知。這類似於 Android Wear + 中的通知堆疊。 +例如,若您的應用程式會為接收的訊息建立通知,收到多個訊息時,會將通知結合成單一群組。 + +您可以使用現有的 {@link android.support.v4.app.NotificationCompat.Builder#setGroup +Builder.setGroup()} 方法,結合類似的通知。 +
+ ++ 通知群組會對其中所含的通知強制施行階層。 + 階層的最上方是上層通知,顯示該群組的摘要資訊。 +使用者可以逐漸擴充通知群組,而系統會在使用者更深入探查時顯示更多資訊。 + +當使用者擴充組合時,系統會為所有子通知揭露更多資訊。當使用者擴充當中的其中一個通知時,系統會顯示該通知的所有內容。 + + +
+ + + + +若要了解如何將通知新增至群組,請參閱將每個通知新增至群組。 + +
+ + +本節提供使用通知群組時的指導方針,而不是舊版 Android 平台可用的 {@link android.app.Notification.InboxStyle InboxStyle} +通知。 + +
+ +只有當您的使用案例與下列條件全部相符時,才應該使用通知群組: +
+ +良好的通知群組使用案例範例包括:顯示一連串傳入訊息的訊息傳送應用程式,或顯示一系列所接收電子郵件清單的電子郵件應用程式。 + +
+ ++建議使用的單一通知案例範例包括:來自單人的個別訊息,或以清單呈現單行的文字項目。 + +您可以使用 +({@link android.app.Notification.InboxStyle InboxStyle} 或 +{@link android.app.Notification.BigTextStyle BigTextStyle}) 來完成。 + +
+ ++ 應用程式應一律張貼群組摘要,即使群組當中只包含單一子項。 +如果只包含單一通知,系統會抑制摘要,並直接顯示子通知。 +這可確保當使用者滑動離開群組子項時,系統能提供一致的體驗。 + + +
+ ++ 注意:本版 Android N 還不會抑制包含單一子通知的通知群組摘要。 +更新的 Android N 版本才會新增此功能。 + +
+ +雖然系統通常會將子通知顯示為群組,但您可以設定子通知,暫時顯示為抬頭通知 +。 + +此功能允許立即存取最新的子通知和與它相關的動作,因此特別實用。 + +
+ + ++ 自從 Android 5.0 (API 層級 21) 支援 Android Wear 裝置以來,通知群組與遠端輸入都是 {@link + android.app.Notification} API 的一部分。 +如果您已使用這些 API 建置通知,您必須採取的動作只有確認應用程式行為符合上述的指導方針,以及考慮實作 {@code + setRemoteInputHistory()}。 + + +
+ ++ 為了支援回溯相容性,相同的 API 可與支援程式庫的 {@link android.support.v4.app.NotificationCompat} + 類別搭配使用,讓您建置能在舊版 Android 上運作的通知。 + +在手持裝置與平板電腦上,使用者只會看到摘要通知,應用程式應仍要為群組的完整資訊內容提供收件匣樣式或同等的通知呈現方式。 + +雖然 Android + Wear 裝置即使在較舊的平台層級上,也允許使用者查看所有子通知,但不論 API 層級為何,您都應該建置子通知。 + + +
+ +從 Android N 開始,您可以自訂通知檢視,也仍然可以取得系統裝飾,例如通知標題、動作及可擴充的版面配置。 + +
+ +若要啟用此功能,Android N 新增下列 API 供您設定自訂檢視的樣式: +
+ +若要使用這個新 API,請呼叫 {@code setStyle()} 方法,再傳遞給想要的自訂檢視樣式。 +
+ +此程式碼片段顯示如何使用 +{@code DecoratedCustomViewStyle()} 方法,建構自訂通知物件。
+ ++Notification noti = new Notification.Builder() + .setSmallIcon(R.drawable.ic_stat_player) + .setLargeIcon(albumArtBitmap)) + .setCustomContentView(contentView); + .setStyle(new Notification.DecoratedCustomViewStyle()) + .build(); + +diff --git a/docs/html-intl/intl/zh-tw/preview/features/picture-in-picture.jd b/docs/html-intl/intl/zh-tw/preview/features/picture-in-picture.jd new file mode 100644 index 000000000000..b0ee8b8360cb --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/features/picture-in-picture.jd @@ -0,0 +1,186 @@ +page.title=子母畫面 +page.keywords=preview,sdk,PIP,Picture-in-picture +page.tags=androidn + +@jd:body + +
在 Android N 中,Android TV 使用者現在可以在應用程式內瀏覽時,同時觀賞螢幕角色中釘選視窗中的影片。 + +子母畫面 (PIP) 模式讓應用程式在釘選視窗中執行影片活動,同時讓另一個活動在背景持續進行。 + +PIP 視窗讓使用者在使用您的應用程式時同時多工處理,協助提高使用者的生產力。 +
+ +您的應用程式可決定何時觸發 PIP 模式。以下是一些何時進入 PIP 模式的範例: +
+ +PIP 視窗為 240x135 dp,在系統所選的螢幕上四個角落之一的最上層顯示。 +使用者只要按住遙控器上的 Home 按鈕,即可帶出 PIP 選單,讓他們將 PIP 視窗切換成全螢幕或關閉 PIP 視窗。 + +如果另一個影片開始在主畫面上播放,會自動關閉 PIP 視窗。 + +使用者也可以透過 Recents 關閉 PIP 視窗。
+ + + + +PIP 利用 Android N 中提供的多視窗 API 來提供釘選影片疊加層視窗。 +若要將 PIP 新增到您的應用程式,您需要註冊支援 PIP 的活動,在需要時將活動切換到 PIP 模式,以及確定活動在 PIP 模式時會隱藏 UI 元素且影片繼續播放。 + + +
+ +根據預設,系統不會自動為應用程式支援 PIP。如果您想要應用程式 PIP,請將
+android:supportsPictureInPicture
和
+android:resizeableActivity
設定成 true
,在宣示說明中註冊影片活動。
+
+另外也請指定您的活動處理版面配置設定變更,如此一來,在 PIP 模式轉換期間版面配置變更時,才不會重新啟動您的活動。
+
+
+<activity android:name="VideoActivity" + android:resizeableActivity="true" + android:supportsPictureInPicture="true" + android:configChanges= + "screenSize|smallestScreenSize|screenLayout|orientation" + ... ++ +
註冊您的活動時,請記住在 PIP 模式中,您的活動會顯示在電視螢幕上小的疊加層視窗中。 +顯示最少 UI 的影片播放活動可提供最佳的使用者體驗。 +包含小型 UI 元素的活動在切換到 PIP 模式時無法提供出色的使用者體驗,因為使用者在 PIP 視窗中看不到 UI 元素的詳細資訊。 + + +
+ +Activity.enterPictureInPicture()
。下列範例會在使用者選取媒體控制列上的專用 PIP 按鈕時切換到 PIP 模式:
+
+
+
++@Override +public void onActionClicked(Action action) { + if (action.getId() == R.id.lb_control_picture_in_picture) { + getActivity().enterPictureInPicture(); + return; + } + ... ++ +
將 PIP 按鈕新增到媒體控制列,可讓您的使用者在控制影片播放時輕鬆地切換到 PIP 模式。 +
+ + + + +Android N 包含新的
+PlaybackControlsRow.PictureInPictureAction
類別,它可定義控制列 PIP 動作和使用 PIP 圖示。
+
當您的活動進入 PIP 模式時,您的活動應該只播放影片。
+在您的活動進入 PIP 時移除 UI 元素,並在您的活動重新進入全螢幕時還原這些元素。覆寫 Activity.onPictureInPictureChanged()
或
+Fragment.onPictureInPictureChanged()
並依需要啟用或停用 UI 元素,例如:
+
+
+
+@Override +public void onPictureInPictureChanged(boolean inPictureInPicture) { + if (inPictureInPicture) { + // Hide the controls in picture-in-picture mode. + ... + } else { + // Restore the playback UI based on the playback status. + ... + } +} ++ +
當您的活動切換到 PIP 時,系統會將活動視為暫停狀態並呼叫您活動的 onPause()
方法。
+影片播放不應該暫停,而且活動因為 PIP 模式而暫停時,影片應該繼續播放。
+
+查看您活動的
+onPause()
方法中的 PIP 並適當地處理播放,例如:
+
+@Override +public void onPause() { + // If called due to PIP, do not pause playback + if (inPictureInPicture()) { + // Continue playback + ... + } + // If paused but not in PIP, pause playback if necessary + ... +} ++ +
當您的活動從 PIP 模式切換回全螢幕模式時,系統會繼續您的活動並呼叫您的 onResume()
方法。
+
PIP 主要針對播放全螢幕影片的活動。將您的活動切換到 PIP 模式時,避免顯示影片內容以外的任何項目。追蹤當您的活動進入 PIP 模式時隱藏 UI 元素,如處理子母畫面模式中的 UI 中所述。 + + +
+ +因為 PIP 視窗會在螢幕角落上以浮動視窗顯示,所以您應該避免在主畫面上 PIP 視窗可能遮蓋的任何地方顯示重要資訊。 + +
+ +當活動處於 PIP 模式時,預設它不會取得輸入焦點。若要在處於 PIP 模式時接收輸入事件,請使用
+MediaSession.setMediaButtonReceiver()
。
+
應用程式 (例如,相片應用程式) 通常只需要存取外部儲存空間中的特定目錄,例如 Pictures
目錄。
+目前用來存取外部儲存空間的方式並非設計來輕鬆地為這些類型的應用程式提供已設定目標的目錄存取。
+
+例如:
Android N 提供新的簡化 API,可用來存取常用外部儲存空間目錄。 +
+ +使用 StorageManager
類別來取得適當的 StorageVolume
實例。
+接著,透過呼叫該實例的 StorageVolume.createAccessIntent()
方法以建立意圖。使用此意圖來存取外部儲存空間目錄。
+
+若要取得所有可用的磁碟區 (包括抽取式媒體磁碟區) 清單,請使用 StorageManager.getVolumesList()
。
+
+
下列程式碼片段是一個範例,它說明如何開啟主要共用儲存空間中的 Pictures
目錄:
+
+StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); +StorageVolume volume = sm.getPrimaryVolume(); +Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
系統會嘗試授予對外部目錄的存取權,並在需要時使用簡化的 UI 向使用者確認存取權: +
+ + + + +若使用者授予存取權,系統會呼叫您的 onActivityResult()
覆寫並傳回 Activity.RESULT_OK
的結果代碼,以及包含 URI 的意圖資料。
+
+使用提供的 URI 來存取目錄資訊,這類似於使用儲存空間存取架構所傳回的 URI。
+
+
+
+
若使用者未授予存取權,系統會呼叫您的 onActivityResult()
覆寫並傳回 Activity.RESULT_CANCELED
的結果代碼,以及 Null 意圖資料。
+
+
注意:取得對特定外部目錄的存取權也會取得對該目錄之子目錄的存取權。 +
+ +若要使用「限定範圍目錄存取」來存取抽取式媒體上的目錄,請先新增會接聽 {@link android.os.Environment#MEDIA_MOUNTED} 通知的 {@link android.content.BroadcastReceiver},例如: + +
+ ++<receiver + android:name=".MediaMountedReceiver" + android:enabled="true" + android:exported="true" > + <intent-filter> + <action android:name="android.intent.action.MEDIA_MOUNTED" /> + <data android:scheme="file" /> + </intent-filter> +</receiver> ++ +
當使用者掛接抽取式媒體 (例如 SD 卡) 時,系統會傳送 {@link android.os.Environment#MEDIA_MOUNTED} 通知。
+此通知會在意圖資料中提供 StorageVolume
物件,讓您用來存取抽取式媒體上的目錄。
+
+下列範例會存取抽取式媒體上的 Pictures
目錄:
+
+// BroadcastReceiver has already cached the MEDIA_MOUNTED +// notification Intent in mediaMountedIntent +StorageVolume volume = (StorageVolume) + mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME); +volume.createAccessIntent(Environment.DIRECTORY_PICTURES); +startActivityForResult(intent, request_code); ++ +
如果可能,請將外部目錄存取 URI 設定為持續性,這樣您就不需要重複地要求使用者授予存取權。
+一旦使用者授予存取權,請使用目錄存取 URI 呼叫 getContentResolver().takePersistableUriPermssion()
。
+
+系統會將該 URI 設定為持續性,而且後續存取要求將會傳回 RESULT_OK
,而且不會為使用者顯示確認 UI。
+
+
若使用者拒絕對外部目錄的存取權,請勿立刻又要求存取權。 +重複堅持取得存取權會導致極差的使用者體驗。 +
diff --git a/docs/html-intl/intl/zh-tw/preview/features/security-config.jd b/docs/html-intl/intl/zh-tw/preview/features/security-config.jd new file mode 100644 index 000000000000..a74712a8fcd4 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/features/security-config.jd @@ -0,0 +1,744 @@ +page.title=網路安全性設定 +page.keywords=preview,security,network + +@jd:body + ++ Android N 包括網路安全性設定功能,讓應用程式在安全的宣告式設定檔中即可自訂網路安全性設定,而不必修改應用程式的程式碼。 + +這些設定可以針對特定網域以及針對特定應用程式來設定。 +此功能的主要能力如下: + +
+ ++ 網路安全性設定功能會使用 XML 檔案,而您為應用程式指定的設定就在此。 +您必須在應用程式的宣示說明包括一個指向這個檔案的項目。 +以下節錄自宣示說明的程式碼,示範如何建立此項目: + +
+ ++<?xml version="1.0" encoding="utf-8"?> +... +<app ...> + <meta-data android:name="android.security.net.config" + android:resource="@xml/network_security_config" /> + ... +</app> ++ +
+ 應用程式會想要信任自訂的一組 CA,而不是平台預設的 CA。 +最常見的原因如下: +
+ ++ 根據預設,來自所有應用程式的安全連線全都信任預先安裝的系統 CA,而目標為 API 層級 23 (Android M) 和以下版本的應用程式預設也會信任使用者新增的 CA 存放區。 + +應用程式可以使用 {@code base-config} (針對整個應用程式自訂) 或 {@code domain-config} (針對每個網域自訂),自訂自己的連線。 + + + +
+ + ++ 假設您想要連線的主機使用自我簽署的 SSL 憑證,或要連線的主機使用 SSL 憑證是由您信任的非公用 CA 所發行,例如您公司的內部 CA。 + + +
+ +
+ res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ 將 PEM 或 DER 格式的自我簽署或非公用 CA 憑證新增至 + {@code res/raw/my_ca}。 +
+ + ++ 應用程式若不想要信任系統所信任的所有 CA,可以自行指定一組範圍較小的信任 CA。 +如此可以保護應用程式,不受任何其他 CA 所發行的詐騙憑證危害。 + +
+ ++ 限制信任的 CA 組,其設定類似於信任自訂 CA (針對特定網域),只不過多個 CA 都是資源所提供。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">secure.example.com</domain> + <domain includeSubdomains="true">cdn.example.com</domain> + <trust-anchors> + <certificates src="@raw/trusted_roots"/> + </trust-anchors> + </domain-config> +</network-security-config> ++ + +
+ 將 PEM 或 DER 格式的信任 CA 新增至 {@code res/raw/trusted_roots}。
+ 請注意,如果使用 PEM 格式,該檔案「只」能包含 PEM 資料,不能有額外的文字。
+您還可以提供多個
+ <certificates>
+元素,而不只一個。
+
+ 應用程式會想要信任不受系統信任的其他 CA,這是因為系統尚未包括該 CA,或 CA 不符合納入 Android 系統的需求。 + +應用程式可以為設定指定多個憑證來源,來完成此動作。 + + +
+
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="@raw/extracas"/> + <certificates src="system"/> + </trust-anchors> + </base-config> +</network-security-config> ++ + + +
+ 對透過 HTTPS 連線的應用程式進行偵錯時,您想要連線的本機開發伺服器並沒有生產伺服器的 SSL 憑證。 + +若以不修改應用程式的程式碼為前提,為了支援此動作,您可以使用 {@code debug-overrides} 來指定僅偵錯 CA,「只」有在 +android:debuggable + 為 {@code true} 時才予以信任。 + +一般來說,IDE 和建置工具會為非發行版本自動設定此旗標。 + +
+ ++ 因為應用程式商店採取的安全措施是,不接受標示為可偵錯的應用程式,所以這種方式會比條件式程式碼安全。 + + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <debug-overrides> + <trust-anchors> + <certificates src="@raw/debug_cas"/> + </trust-anchors> + </debug-overrides> +</network-security-config> ++ + + +
+ 打算只使用安全連線連線至目的地的應用程式,可以針對那些目的地退出支援明碼 (使用未加密的 HTTP 通訊協定,而非 HTTPS)。 + +此選項有助於避免應用程式由於外部來源 (例如,後端伺服器) 提供的 URL 中發生變更,而造成意外回復。 + + + 如需更多詳細資料,請參閱 {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted + NetworkSecurityPolicy.isCleartextTrafficPermitted()}。 +
+ ++ 例如,應用程式想要確保 的所有連線一律要透過 HTTPS 完成,以保護敏感流量不受惡意網路危害。 + + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config usesCleartextTraffic="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> +</network-security-config> ++ + + +
+ 應用程式一般會信任所有預先安裝的 CA。若這類的任何 CA 意在發行詐騙憑證,應用程式會有遭受 MiTM 攻擊的風險。 + +有些應用程式選擇透過限制所信任的 CA 組或關聯憑證,來限制可接受的憑證組。 + +
+ ++ 憑證關聯的方法是,透過公用金鑰的雜湊 (X.509 憑證的 SubjectPublicKeyInfo) 來提供一組憑證。 +只有當憑證鏈至少包含一個關聯的公用金鑰時,才是有效的憑證鏈。 + + +
+ ++ 請注意,使用憑證關聯時,您務必要包括備份金鑰,這樣萬一強制您切換到新的金鑰或變更 CA (關聯到 CA 憑證或該 CA 的中繼者) 時,您的應用程式連線才不會受到影響。 + + +否則,您必須推出應用程式更新,才能還原連線。 + +
+ ++ 此外,可為關聯設定到期時間,只要該關聯經過多久都未執行,即為到期。 +這有助於避免未經更新的應用程式發生連線問題。 +然而,針對關聯設定到期時間,會造成略過關聯。 + +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <pin-set expiration="2018-01-01"> + <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <!-- backup pin --> + <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> + </domain-config> +</network-security-config> ++ + + +
+ 繼承的值都未設定在特定設定中。此行為允許有更複雜的設定,同時保持設定檔讓人看得懂。 + +
+ ++ 如果值未設定在特定項目中時,就會使用下一個更一般項目的值。 +如為巢狀結構,就會從上層 {@code domain-config} 取得未在 {@code domain-config} 中設定的值,或非巢狀時,則會從 {@code + base-config} 取得值。 +未在 {@code base-config} 中設定的值會使用平台的預設值。 + +
+ ++ 例如,假設所有連至 {@code + example.com} 子網域的連線都必須使用一組自訂 CA。此外,允許明碼流量送往這些網域,但連線到 {@code + secure.example.com} 時「除外」。 +在 {@code example.com} 的設定內以巢狀方式排列 {@code + secure.example.com} 的設定,就不需要重複 + {@code trust-anchors}。 +
+ +
+res/xml/network_security_config.xml
:
+
+<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <domain-config> + <domain includeSubdomains="true">example.com</domain> + <trust-anchors> + <certificates src="@raw/my_ca"/> + </trust-anchors> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="true">secure.example.com</domain> + </domain-config> + </domain-config> +</network-security-config> ++ + + +
+ 網路安全性設定功能會使用 XML 檔案格式。 + 下列程式碼範例顯示檔案的整體結構: +
+ ++<?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </base-config> + + <domain-config> + <domain>android.com</domain> + ... + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + <pin-set> + <pin digest="...">...</pin> + ... + </pin-set> + </domain-config> + ... + <debug-overrides> + <trust-anchors> + <certificates src="..."/> + ... + </trust-anchors> + </debug-overrides> +</network-security-config> ++ +
+ 下列各區段描述檔案格式的語法與其他詳細資料。 + +
+ +<base-config>
<domain-config>
<debug-overrides>
+ +<base-config usesCleartextTraffic=["true" | "false"]> + ... +</base-config> ++
<trust-anchors>
+ domain-config
所未涵蓋的目的地時使用的預設設定。
+
+
++ 任何未設定的值都會使用平台預設值。目標為 API 層級 24 和更新版本的應用程式預設設定: + +
+ ++<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> +</base-config> ++目標為 API 層級 23 和以下版本的應用程式預設設定: +
+<base-config usesCleartextTraffic="true"> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> +</base-config> ++ +
<domain-config usesCleartextTraffic=["true" | "false"]> + ... +</domain-config>+
<domain>
+<trust-anchors>
+<pin-set>
+<domain-config>
請注意,如有多個 {@code domain-config} 元素涵蓋同一個目的地,則會使用含有最明確 (最長) 比對網域規則的設定。 +
+<domain includeSubdomains=["true" | "false"]>example.com</domain> ++
+<debug-overrides> + ... +</debug-overrides> ++
<trust-anchors>
+ +<trust-anchors> +... +</trust-anchors> ++
<certificates>
+ <certificates src=["system" | "user" | "raw resource"] + overridePins=["true" | "false"] /> +
+ 指定來自此來源的 CA 是否要略過憑證關聯。如為 {@code + "true"},憑證鏈的鏈結若經過此來源的其中一個 CA,就不會執行關聯。 +這對偵錯 CA 會很實用,或支援讓使用者 MiTM 應用程式的安全流量。 + +
+ ++ 預設為 {@code "false"},除非您在 {@code debug-overrides} + 元素中指定,而那種情況的預設為 {@code "true"}。 +
++<pin-set expiration="date"> +... +</pin-set> ++
<pin>
+ <pin>
。
+ + 到期有助於避免因使用者停用應用程式更新,而無法取得關聯組更新的應用程式發生連線問題。 + + +
++<pin digest=["SHA-256"]>base64 encoded digest of X.509 + SubjectPublicKeyInfo (SPKI)</pin> ++
電視輸入服務可讓使用者透過時間位移 API 來暫停及繼續頻道播放。 +Android N 透過讓使用者儲存多個已錄製的工作階段,以延伸時間位移功能。 +
+ +使用者可以事先排定錄製作業,或在觀看節目時開始錄製。 +一旦系統儲存錄製的內容,使用者可以使用系統電視應用程式來瀏覽、管理及播放錄製的內容。 +
+ +如果要為您的電視輸入服務提供錄製功能,您必須向系統指出您的應用程式支援錄製、實作錄製節目的功能、處理及溝通錄製期間可能發生的任何錯誤,以及管理您已錄製的工作階段。 + + +
+ +若要告訴系統您的電視輸入服務支援錄製,請依照這些步驟執行: +
+ +TvInputService.onCreate()
方法中,使用 TvInputInfo.Builder
類別建立新的 TvInputInfo
物件。
+
+TvInputInfo
物件時,在呼叫 build()
之前先呼叫 setCanRecord(true)
,以指出您的服務支援錄製。
+
+TvInputService.updateTvInputInfo()
,以向系統註冊您的 TvInputInfo
物件。
+在您的電視輸入服務註冊並告訴系統它支援錄製功能之後,系統會在需要存取您應用程式的錄製實作時呼叫您的 TvInputService.onCreateRecordingSession()
。
+
+
+實作您自己的 TvInputService.RecordingSession
子類別,並在 onCreateRecordingSession()
回呼引發時傳回它。
+
+
+此子類別負責切換到正確的頻道資料、錄製要求的資料,並和系統溝通錄製狀態與錯誤。
+
+
當系統透過傳入頻道 URI 以呼叫 RecordingSession.onTune()
時,會轉台到 URI 指定的頻道。
+透過呼叫 notifyTuned()
以通知系統您的應用程式已轉台到想要的頻道,或者,若您的應用程式無法轉台到適當的頻道,則呼叫 notifyError()
。
+
+
+
接著,系統會呼叫 RecordingSession.onStartRecording()
回呼。
+您的應用程式必須立即開始錄製。當系統呼叫此回呼時,它可能會提供包含將錄製之節目相關資訊的 URI。
+
+當錄製完成時,您必須將此資料複製到 RecordedPrograms
資料表格。
+
最後,系統會呼叫 RecordingSession.onStopRecording()
。此時,您的應用程式必須立即停止錄製。
+您也必須在 RecordedPrograms
表格中建立一個項目。
+此項目應該在 RecordedPrograms.COLUMN_RECORDING_DATA_URI
欄中包括已錄製的工作階段資料 URI,以及系統在對 onStartRecording()
的初始呼叫中提供的任何節目資訊。
+
+
+
+
如需有關如何存取 RecordedPrograms
表格的詳細資料,請參閱管理已錄製的工作階段。
+
如果錄製期間發生錯誤,造成已錄製的資料無法使用,請透過呼叫 RecordingSession.notifyError()
以通知系統。同樣地,您可以在建立錄製工作階段之後呼叫 notifyError()
,以讓系統知道您的應用程式已無法再錄製工作階段。
+
+
+
如果錄製期間發生錯誤,但您想要提供可用的部分錄製內容給使用者播放,請呼叫 RecordingSession.notifyRecordingStopped()
以讓系統使用該部分工作階段。
+
+
+
系統會從 TvContract.RecordedPrograms
內容提供者表格中所有支援錄製頻道的應用程式維護所有已錄製之工作階段的資訊。
+
+此資訊可透過 RecordedPrograms.Uri
內容 URI 來存取。
+使用內容提供者 API 來讀取、新增及刪除此表格中的項目。
+
如需有關處理內容提供者資料的詳細資訊,請參閱內容提供者基礎知識。 + +
+ +電視裝置的儲存空間可能有限,因此在配置儲存空間以儲存已錄製的工作階段時,請使用最佳判斷。
+當可用空間不足而無法儲存已錄製的工作階段時,請使用 RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
。
+
+
當使用者起始錄製時,您應該儘快開始錄製資料。
+如果要加快此程序,請在系統呼叫 onCreateRecordingSession()
回呼時完成所有初期耗時工作 (例如,存取及配置儲存空間)。
+
+這樣做可讓您在 onStartRecording()
回呼引發時立即開始錄製。
+
+
Android N 引進對 Java 8 語言功能的支援,供您在開發目標為 Android N 的應用程式時使用。此頁面描述「Android N Preview」中支援的新語言功能、如何正確地設定您的專案以使用它們,以及您可能會遇到的所有已知問題。 + + + + +
+ +如果要開始使用這些功能,您必須下載並安裝 Android Studio 2.1 (預覽版) 與 Android N Preview SDK,其中包括必要的 Jack 工具鏈與適用於 Gradle 的已更新 Android 外掛程式。如果尚未安裝 Android N Preview SDK,請參閱設定以針對 Android N 開發。 + + +
+ + + ++ 注意:使用新的 Java 8 語言功能並不是開發以 Android N 平台為目標之應用程式的需求。如果不想使用 Java 8 語言功能撰寫程式碼,您可以將專案的來源與目標相容性值維持設定為 Java 7,但仍必須與 JDK 8 相容,以針對 Android N 平台建置。 + + + + +
+ ++ Android 目前不支援所有 Java 8 語言功能。然而,開發目標為「Android N Preview」的應用程式時,可以使用下列功能: + + +
+ ++ 此外,下列 Java 8 語言功能 API 現已可用: +
+ ++ 注意:Android N 的 Lambda 運算式實作是以匿名類別為基礎。此方法可讓它們向下相容並可在舊版 Android 上執行。如果要在舊版上測試 Lambda 運算式,請務必移至您的 {@code + build.gradle} 檔案,並將 {@code compileSdkVersion} 與 {@code + targetSdkVersion} 設定為 23 或更低的層級。 + + + +
+ ++ 如果要使用新的 Java 8 語言功能,您也必須使用新的 Jack 工具鏈。這個新的 Android 工具鏈可將 Java 語言原始程式碼編譯成 Android 可讀取的 Dex 位元組程式碼、具有其自己的 {@code .jack} 程式庫格式,並在單一工具之外提供最多工具鏈功能:重新封裝、縮減、混淆 (Obfuscation ) 與多 Dex (Multidex)。 + + + + + +
+ +以下是用來建置 Android DEX 檔案之兩個工具鏈的比較:
++ 如果要為您的專案啟用 Java 8 語言功能與 Jack,請在您的模組特定 {@code build.gradle} 檔案中輸入下列內容: + +
+ ++android { + ... + defaultConfig { + ... + jackOptions { + enabled true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} ++ +
+ 立即執行 (在 Android Studio 2.0 (Beta) 引進) 目前無法搭配 Jack 使用,而且會將它停用並使用新的工具鏈。 + +
+ +因為 Jack 在編譯應用程式時不會產生中繼類別檔案,相依於這些檔案的工具目前無法搭配 Jack 使用。這些工具的某些範例為: + +
+ +如果在使用 Jack 時發現任何問題,請回報錯誤。
\ No newline at end of file diff --git a/docs/html-intl/intl/zh-tw/preview/overview.jd b/docs/html-intl/intl/zh-tw/preview/overview.jd new file mode 100644 index 000000000000..590afe592754 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/overview.jd @@ -0,0 +1,440 @@ +page.title=計劃總覽 +page.metaDescription=讓您的應用程式為下一版 Android 做好準備。 +page.image=images/cards/card-n-overview_2x.png +meta.tags="preview", "developer", "android" +page.tags="preview", "developer", "android" + +@jd:body + + ++ 歡迎使用「Android N Developer Preview」,本計劃提供為新版 Android 測試和最佳化您應用程式所需的一切。它是免費的,而且您可以下載「N Developer Preview」工具來立刻開始。 + + + +
+ + + + + + + ++ 在各種裝置上或在模擬器上執行並測試您的應用程式。 + +
++ 我們將在 Preview 期間提供每月更新,讓您能夠針對最新的平台變更進行測試。 +
++ 在前幾個星期內,我們將讓開發人員優先回報問題,因此請儘快測試並提供意見回饋。 + +
++ 「N Developer Preview」計畫日期從 2016 年 3 月 9 日到最終 Android N 公開發行版釋出給 AOSP 與 OEM 為止 (預計是 2016 年第 3 季)。 + +
+ ++ 在關鍵開發里程碑,我們將為您的開發與測試環境傳遞更新。一般而言,您可以預期每個月 (4 到 6 週的間隔) 都能收到更新。里程碑列出如下。 + + +
+ ++ 每個更新都包括 SDK 工具、預覽版系統映像、模擬器、參考文件與 API 差異。 + +
+ ++ 前三個預覽版里程碑提供早期測試與開發環境,可協助您發現目前應用程式中的相容性問題,並針對在新平台運作的目標規劃遷移或功能工作。您可以在這個優先順序期間將您對功能與 API 和檔案相容性問題的意見回饋提供給我們 — 對於上述所有問題,請使用問題追蹤器。您可以預期這些更新之間會有一些 API 變更。 + + + + + + +
+ ++ 在預覽版 4 與 5,您將能存取最終 N API 與 SDK 以進行開發,並存取接近最終系統映像來測試系統行為與功能。Android N 在此時將提供標準 API 層級。您可以開始為您的舊版應用程式執行最終相容性測試,並調整使用 N API 或功能的任何新程式碼。 + + + + +
+ ++ 此外,從預覽版 4 開始,您可以發佈應用程式到執行 Android N 的裝置 (在正式 API 層級),例如已選擇加入 Android Beta 計劃的使用者裝置。您可以先發佈到 Google Play 的 Alpha 與 Beta 管道,以便在廣泛於商店中散佈之前,先透過 Android Beta 使用者測試您的應用程式。 + + + + + +
+ ++ 當您在 Android N 上測試及開發時,強烈建議您在預覽版更新發行時立即更新,讓您的開發環境保持在最新狀態。為簡化此程序,您可以在 Android Beta 計劃中註冊您的測試裝置,並在每個里程碑取得隔空傳輸 (OTA) 更新。或者,我們也會提供已更新的預覽版映像讓您下載並手動刷新。 + + + + + +
+ ++ 我們將透過 Android 開發人員部落格,還有此網站與 Android N 開發人員社群來通知您有可用的預覽版更新。 + + +
+ + ++ 「N Developer Preview」包括您針對各種不同螢幕大小、網路技術、 CPU/GPU 晶片組與硬體架構,測試現有應用程式所需的一切。 + + +
+ +您可以透過 Android Studio 中的 SDK Manager 下載這些元件:
+ ++ 我們將視需要在每個里程碑提供這些開發工具的更新。 +
+ ++ 「N Developer Preview」包括 Nexus 以及在實體裝置上測試及開發時可以使用的其他硬體系統映像。如需硬體映像的完整清單,請參閱裝置映像頁面。 + + +
+ ++ 我們將在每個里程碑傳遞已更新的系統映像。您可以下載已更新的系統映像並手動將它刷到您的測試裝置,而且刷機頻率無限制。當您需要在自動化測試環境多次刷新您裝置時,這特別實用。 + + + + +
+ +注意:手動刷新的裝置將無法像去年的預覽版一樣取得 OTA 更新。今年,您可以透過在「Android Beta 計劃」註冊裝置以取得 OTA — 請參閱下一節的詳細資料。 + + + +
+ ++ Android N 中的其中一個新功能是隔空傳輸 (OTA) 更新計劃,它可以自動將最新的 Android N 預覽版更新直接傳遞給已註冊此計劃的裝置。加入此計劃完全免費,而且此計劃開放給所有擁有支援裝置並已註冊 Google 帳戶的人。 + + + +
+ ++ 如果要註冊此計劃,請瀏覽 Android Beta 計劃網站。您將會看到已在您的帳戶註冊且符合加入 Android Beta 計劃的所有裝置。 + + + +
+ ++ 一旦註冊,您的裝置很快就會收到更新。在大部分情況下,您不需要執行完整重設以將您的資料移到 Android N,但建議您先備份重要資料,再註冊裝置。 + + + +
+ ++ 當更新傳遞到您的裝置之後,建議您儘快下載並安裝。您將能掌握系統 UI、行為、API 與功能的最新變更。 + + +
+ ++ 在「Developer Preview」結束時,您已註冊的裝置將會收到正式 Android N 版本的更新。 + +
+ ++ 您可以隨時取消註冊 Android Beta 計劃。在取消註冊之前,請務必備份裝置上的資料。 + + +
+ +注意:當您取消註冊時,系統會將您的裝置還原為出廠預設值並更新到最新版本的 Android 6.0 Marshmallow (不一定是註冊裝置之前安裝的版本)。為確保乾淨的安裝,系統會將您的資料從裝置清除,包括聯絡人、訊息與相片等。 + + + + + + +
+ ++ 「Developer Preview」網站上提供這些文件資源,協助您了解 Android N: + +
+ ++ 在早期預覽版更新期間,您能以獨立 zip 壓縮檔的形式下載最新的 Android N 平台 API 參考資料。下載的參考資料也包括差異報告,可協助您瞭解自 API 23 與前次更新之後的 API 變更。 + + + + +
+ ++ 當 Android N API 邁入最終階段且我們為它指派正式 API 層級時,我們將在 https://developer.android.com 為您提供線上 API 參考資料。 + +
+ ++ 在「N Developer Preview」上測試及開發時,請使用這些管道來回報問題及提供意見回饋: + +
+ +
+ 「N Developer Preview」提供僅供開發的系統與沒有標準 API 層級的 Android 程式庫。如果要選擇退出相容性行為以測試您的應用程式 (強烈建議),您可以透過將您應用程式的 targetSdkVersion
設定為 “N”
,以便以 Android N 預覽版。做為目標。
+
+
+
+
+
+
+ 「Android N Developer Preview」提供預覽版 API — 在最終版 SDK (目前規劃在 2016 年第 3 季) 發行之前的都不是正式 API。這表示您可以預期這段時間會有小幅度的 API 變更,特別是在計劃開始的前幾週。隨著每次更新「Android N Developer Preview」,我們將提供變更摘要。 + + + + + +
+ ++ 注意:雖然預覽版 API 可能會變更,基本系統行為均已穩定且能夠立即測試。 + + +
+ ++ Google Play 會防止發佈目標為 N Developer Preview 的應用程式。當 Android N 最終 SDK 可用時,您將能以正式 Android N API 層級做為目標,並透過 Alpha 與 Beta 發行管道將您的應用程式發佈到 Google Play。同時,如果要將目標為 Android N 的應用程式散佈給測試人員,您可以透過電子郵件或您網站的直接下載連結來完成。 + + + + + +
+ ++ 在完全將 Android N 釋出給 AOSP 與 OEM 時 (預計是 2016 年第 3 季),您可以將以 Android N 為目標的發佈發佈給 Google Play 中的公開發行管道。 + + +
+ + ++ 開始使用 Android N 測試您的應用程式: +
+ ++ 感謝您參與「Android N Developer Preview」計劃! +
diff --git a/docs/html-intl/intl/zh-tw/preview/samples.jd b/docs/html-intl/intl/zh-tw/preview/samples.jd new file mode 100644 index 000000000000..265c0ff2e0cd --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/samples.jd @@ -0,0 +1,85 @@ +page.title=範例 +page.tags="preview", "samples", "android" +page.image=images/cards/card-n-samples_2x.png +@jd:body + ++ 下列程式碼範例是針對 Android N 提供。如果要在 Android Studio 中下載, 範例,請選取 [File] > [Import Samples] 選單選項。 + + +
+ ++ 注意:這些可下載的專案是專為與 Gradle 和 Android Studio 一起使用而設計。 + +
+ + ++ 此範例示範如何在您的應用程式中發揮多視窗使用者介面的功能。 + +
++ 在 GitHub 上取得 + +
+ + ++ 這是現有的範例,它會顯示使用 NotificationCompat 傳送通知的簡單服務。來自使用者的每個未閱讀交談都會以個別通知方式傳送。 + + +
++ 已更新此範例以利用 Android N 中的新通知功能。 + +
++ 在 GitHub 上取得 + +
+ + ++ 這是現有的範例,它示範如何使用 NotificationManager 告知使用者應用程式目前顯示的通知數目。 + + +
++ 已更新此範例以利用 Android N 中的新通知功能。 + +
++ 在 GitHub 上取得 + +
+ + ++ 此範例示範如何在裝置加密的儲存空間 (裝置開機後即一律可用) 中儲存及存取資料。 + +
++ 在 GitHub 上取得 + +
+ + ++ 此範例示範如何讀取及寫入特定目錄的資料,同時要求較少的權限。 + +
++ 在 GitHub 上取得 + +
\ No newline at end of file diff --git a/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd b/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd new file mode 100644 index 000000000000..a5ce556b74b2 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd @@ -0,0 +1,226 @@ +page.title=設定 Preview +meta.keywords="preview", "android" +page.tags="preview", "developer preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + +如果要開發適用於「Android N Preview」的應用程式,您必須為您的開發人員環境進行一些更新,如此頁面上所述。 +
+ +如果只要在 Android N 系統映像上測試您應用程式的相容性,請依照在 Android N 裝置上測試中的指南執行。 +
+ + + + +Android N 平台新增對 Java 8 語言功能的支援,它需要名為 Jack 的新編譯器。目前,只有 Android Studio 2.1 中才支援最新的 Jack 版本。因此,如果要使用 Java 8 語言功能,您必須使用 Android Studio 2.1 來建置您的應用程式。否則,您不需要使用 Jack 編譯器,但您仍需要更新到 JDK 8 以針對 Android N 編譯,如下所述。 + + + + + + +
+ + + +Android Studio 2.1 目前在早期測試發行管道中是以預覽版形式提供。如果您已經有 Android Studio 但不想要更新到早期測試管道,您可以下載 Android Studio 2.1 並另行安裝,並使用它來針對 Android N 進行開發,這樣並不會影響您的主要 Android Studio 環境。 + + + + +
+ +如果要下載 Android Studio 2.1 並另行安裝,請依照這些步驟執行 (或者,如果要以現有安裝之更新的形式接收 Android Studio 2.1,請跳到步驟 4): + +
+ +針對下一個步驟,將此設定視窗維持開啟。
+ + +如果要開始使用 Android N API 來開發,您必須在 Android Studio 中安裝 Android N Preview SDK,如下所示: +
+ ++ 您可以在 N Preview 參考文件 (可從下表下載) 中找到有關 Android N API 的詳細資訊。此套件包含 Android 開發人員網站的已刪節離線版本,而且包括適用於 Android N API 的已更新 API 參考資料與 API 差異報告。 + + + + +
+ +文件 | +總和檢查碼 | +
---|---|
+ n-preview-1-docs.zip | +
+ MD5:4ab33ccbe698f46f125cc5b807cf9c2f + SHA-1:6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 + |
+