APIs do Android 3.0

Nível da API: 11

Para desenvolvedores, a plataforma Android 3.0 (HONEYCOMB) está disponível como um componente para download do SDK do Android. A plataforma disponível para download inclui uma biblioteca Android e uma imagem do sistema, além de um conjunto de aparências para o emulador e muito mais. A plataforma para download não inclui bibliotecas externas.

Para desenvolvedores, a plataforma Android 3.0 está disponível como um componente para download do SDK do Android. A plataforma disponível para download inclui uma biblioteca Android e uma imagem do sistema, além de um conjunto de skins de emulador e muito mais. Para começar a desenvolver ou testar no Android 3.0, use o Android SDK Manager para fazer o download da plataforma no seu SDK.

Visão geral da API

As seções abaixo fornecem uma visão geral técnica das novidades para desenvolvedores no Android 3.0, incluindo novos recursos e mudanças na API de framework desde a versão anterior.

Fragmentos

Um fragmento é um novo componente de framework que permite separar elementos distintos de uma atividade em módulos independentes que definem a própria interface e o próprio ciclo de vida. Para criar um fragmento, é necessário estender a classe Fragment e implementar vários métodos de callback do ciclo de vida, semelhantes a um Activity. Você pode combinar vários fragmentos em uma única atividade para criar uma interface de vários painéis em que cada painel gerencia o próprio ciclo de vida e as entradas do usuário.

Também é possível usar um fragmento sem fornecer uma interface. Em vez disso, use-o como um worker da atividade, por exemplo, para gerenciar o progresso de um download que ocorre apenas enquanto a atividade está em execução.

Além disso:

  • Os fragmentos são independentes e podem ser reutilizados em várias atividades
  • É possível adicionar, remover, substituir e animar fragmentos dentro da atividade
  • É possível adicionar fragmentos a uma backstack gerenciada pela atividade, preservando o estado dos fragmentos à medida que eles são mudados e permitindo que o usuário volte pelos diferentes estados.
  • Ao fornecer layouts alternativos, você pode misturar e combinar fragmentos com base no tamanho e na orientação da tela
  • Os fragmentos têm acesso direto à atividade do contêiner e podem contribuir com itens para a barra de ações da atividade (discutida a seguir)

Para gerenciar os fragmentos na sua atividade, use a FragmentManager, que fornece várias APIs para interagir com os fragmentos, como encontrar fragmentos na atividade e removê-los da backstack para restaurar o estado anterior.

Para realizar uma transação, como adicionar ou remover um fragmento, você precisa criar um FragmentTransaction. Depois disso, você pode chamar métodos como add(), remove() ou replace(). Depois de aplicar todas as mudanças que você quer realizar na transação, chame commit() para que o sistema aplique a transação do fragmento à atividade.

Para ver mais informações sobre o uso de fragmentos, leia a documentação Fragments. Vários exemplos também estão disponíveis no aplicativo de demonstrações da API.

Barra de ações

A barra de ações substitui a barra de título tradicional na parte superior da janela de atividades. Ele inclui o logotipo do aplicativo no canto esquerdo e oferece uma nova interface para itens no menu "Opções". Além disso, a barra de ações permite:

  • Adicione itens de menu diretamente na barra de ações como "itens de ação".

    Na declaração XML do item de menu, inclua o atributo android:showAsAction com um valor "ifRoom". Quando houver espaço suficiente, o item de menu aparecerá diretamente na barra de ações. Caso contrário, o item será colocado no menu flutuante, revelado pelo ícone de menu no lado direito da barra de ações.

  • Substituir um item de ação por um widget (como uma caixa de pesquisa), criando uma "visualização de ações".

    Na declaração XML do item de menu, adicione o atributo android:actionViewLayout com um recurso de layout ou o atributo android:actionViewClass com o nome da classe de um widget. Também é necessário declarar o atributo android:showAsAction para que o item apareça na barra de ações. Se não houver espaço suficiente na barra de ações e o item aparecer no menu flutuante, ele vai se comportar como um item de menu normal e não vai mostrar o widget.

  • Adicionar uma ação ao logotipo do aplicativo e substituí-lo por um logotipo personalizado

    O logotipo do aplicativo recebe automaticamente o ID android.R.id.home, que o sistema entrega ao callback onOptionsItemSelected() da atividade quando tocado. Basta responder a esse ID no método de callback para realizar uma ação, como acessar a atividade "inicial" do aplicativo.

    Para substituir o ícone por um logotipo, especifique o logotipo do aplicativo no arquivo de manifesto com o atributo android:logo e chame setDisplayUseLogoEnabled(true) na atividade.

  • Adicionar navegação estrutural para voltar à backstack de fragmentos.
  • Adicionar guias ou uma lista suspensa para navegar pelos fragmentos
  • Personalizar a barra de ações com temas e planos de fundo

A barra de ações é padrão para todos os aplicativos que usam o novo tema holográfico, que também é padrão quando você define android:minSdkVersion ou android:targetSdkVersion como "11".

Para mais informações sobre a barra de ações, leia a documentação Barra de ações. Vários exemplos também estão disponíveis no aplicativo de demonstrações da API.

Área de transferência do sistema

Agora, os aplicativos podem copiar e colar dados (além do simples texto) na área de transferência do sistema. Os dados cortados podem ser texto simples, um URI ou um intent.

Ao fornecer ao sistema acesso aos dados que você quer que o usuário copie, por meio de um provedor de conteúdo, o usuário pode copiar conteúdo complexo (como uma imagem ou estrutura de dados) do seu app e colar em outro app compatível com esse tipo de conteúdo.

Para começar a usar a área de transferência, receba o objeto ClipboardManager global chamando getSystemService(CLIPBOARD_SERVICE).

Para copiar um item para a área de transferência, crie um novo objeto ClipData, que contenha um ou mais objetos ClipData.Item, cada um descrevendo uma única entidade. Para criar um objeto ClipData contendo apenas um ClipData.Item, use um dos métodos auxiliares, como newPlainText(), newUri() e newIntent(), que retornam um objeto ClipData pré-carregado com o ClipData.Item fornecido.

Para adicionar ClipData à área de transferência, transmita-o para setPrimaryClip() da instância do ClipboardManager.

Você pode ler um arquivo da área de transferência (para colá-lo) chamando getPrimaryClip() no ClipboardManager. Processar o ClipData que você recebe pode ser complicado, e você precisa ter certeza de que consegue processar o tipo de dados na área de transferência antes de tentar colá-los.

A área de transferência contém apenas uma parte dos dados cortados (um objeto ClipData) por vez, mas uma ClipData pode conter várias ClipData.Items.

Para mais informações, leia a documentação Copiar e colar. Você também pode ver uma implementação simples de copiar e colar no exemplo de demonstrações da API e uma implementação mais completa no exemplo do bloco de notas.

Arrastar e soltar

As novas APIs simplificam as operações de arrastar e soltar na interface do usuário do aplicativo. Uma operação de arrastar é a transferência de algum tipo de dados, transportados em um objeto ClipData, de um lugar para outro. O ponto inicial e final da operação de arrastar é um View. Portanto, as APIs que processam diretamente as operações de arrastar e soltar estão na classe View.

Uma operação de arrastar e soltar tem um ciclo de vida definido por várias ações de arrastar, cada uma definida por um objeto DragEvent, como ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED e ACTION_DROP. As visualizações que quiserem participar de uma operação de arrastar podem detectar essas ações.

Para começar a arrastar conteúdo na sua atividade, chame startDrag() em uma View, fornecendo um objeto ClipData que representa os dados a serem arrastados, um View.DragShadowBuilder para facilitar a "sombra" que os usuários veem sob os dedos ao arrastar e um Object que pode compartilhar informações sobre o objeto de arrastar com visualizações que podem receber o objeto.

Para aceitar um objeto de arrastar em uma View (receber o "solto"), registre a visualização com um OnDragListener chamando setOnDragListener(). Quando ocorre um evento de arrastar na visualização, o sistema chama onDrag() para a OnDragListener, que recebe um DragEvent descrevendo o tipo de ação de arrastar (como ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED e ACTION_DROP). Durante uma ação de arrastar, o sistema chama onDrag() repetidamente para a visualização abaixo da ação de arrastar para entregar um fluxo de eventos de arrastar. A visualização de recebimento pode consultar o tipo de evento entregue ao onDragEvent() chamando getAction() no DragEvent.

Observação:embora um evento de arrastar possa carregar um objeto ClipData, ele não está relacionado à área de transferência do sistema. Uma operação de arrastar e soltar nunca deve colocar os dados arrastados na área de transferência do sistema.

Para mais informações, leia a documentação Arrastar e soltar. Também é possível ver a implementação de arrastar e soltar nos aplicativos APIs Demos e Honeycomb Gallery.

Widgets de apps

O Android 3.0 oferece suporte a várias novas classes de widgets para widgets de apps mais interativos na tela inicial dos usuários, incluindo: GridView, ListView, StackView, ViewFlipper e AdapterViewFlipper.

Mais importante, você pode usar o novo RemoteViewsService para criar widgets de apps com coleções, usando widgets como GridView, ListView e StackView, que são apoiados por dados remotos, como de um provedor de conteúdo.

A classe AppWidgetProviderInfo (definida em XML com um elemento <appwidget-provider>) também oferece suporte a dois novos campos: autoAdvanceViewId e previewImage. O campo autoAdvanceViewId permite especificar o ID da visualização da subvisualização do widget de app que precisa ser avançado automaticamente pelo host do widget de app. O campo previewImage especifica uma visualização da aparência do widget de app e é exibido ao usuário no seletor de widgets. Se esse campo não for fornecido, o ícone do widget de app vai ser usado para a visualização.

Para ajudar a criar uma imagem de visualização para o widget de app (para especificar no campo previewImage), o Android Emulator inclui um aplicativo chamado "Widget Preview". Para criar uma imagem de visualização, inicie esse aplicativo, selecione o widget, configure como você quer que a imagem apareça e salve-a e coloque-a nos recursos drawable do aplicativo.

Confira uma implementação dos novos recursos de widget de apps nos aplicativos Widget de apps do StackView e Widget da lista de clima.

Notificações da barra de status

As APIs Notification foram estendidas para oferecer suporte a mais notificações da barra de status com conteúdo avançado, além de uma nova classe Notification.Builder que permite criar objetos Notification facilmente.

Estão incluídos:

  • Suporte a um ícone grande na notificação, usando setLargeIcon(). Isso geralmente serve para aplicativos de redes sociais mostrarem a foto de contato da pessoa que é a fonte da notificação ou para que apps de mídia mostrem uma miniatura do álbum.
  • Suporte a layouts personalizados no mostrador da barra de status, usando setTicker().
  • Suporte a layouts de notificação personalizados para incluir botões com PendingIntents, oferecendo widgets de notificação mais interativos. Por exemplo, uma notificação pode controlar a reprodução de músicas sem iniciar uma atividade.

Carregadores de conteúdo

As novas APIs de framework facilitam o carregamento assíncrono de dados usando a classe Loader. Você pode usá-lo em combinação com componentes de IU, por exemplo, visualizações e fragmentos, para carregar dinamicamente dados das linhas de execução de worker. A subclasse CursorLoader foi projetada especialmente para ajudar você a fazer isso nos dados apoiados por uma ContentProvider.

Basta implementar a interface LoaderCallbacks para receber callbacks quando um novo carregador for solicitado ou os dados mudarem. Em seguida, chame initLoader() para inicializar o carregador da atividade ou do fragmento.

Para obter mais informações, leia a documentação Carregadores. Você também pode ver o código de exemplo usando carregadores nos exemplos LoaderCursor e LoaderThrottle.

APIs de Bluetooth A2DP e fone de ouvido

O Android agora inclui APIs para aplicativos com o objetivo de verificar o estado dos dispositivos Bluetooth A2DP e perfil de fone de ouvido conectados. Por exemplo, os apps podem identificar quando um fone de ouvido Bluetooth está conectado para ouvir música e notificar o usuário conforme apropriado. Os apps também podem receber transmissões para comandos AT específicos do fornecedor e notificar o usuário sobre o estado do dispositivo conectado, como quando a bateria do dispositivo conectado está baixa.

Você pode inicializar o respectivo BluetoothProfile chamando getProfileProxy() com a constante de perfil A2DP ou HEADSET e um BluetoothProfile.ServiceListener para receber callbacks quando o cliente Bluetooth estiver conectado ou desconectado.

Framework de animação

Um novo framework de animação flexível permite animar propriedades arbitrárias de qualquer objeto (View, Drawable, Fragment, Object ou qualquer outro elemento). Ela permite definir vários aspectos de uma animação, como:

  • Duração
  • Quantidade de repetição e comportamento
  • Tipo de interpolação de tempo
  • O animador define para reproduzir animações juntas, em sequência ou após atrasos especificados
  • Atraso na atualização do frame

Por padrão, você pode definir esses aspectos de animação, e outros, para os valores de cor int, flutuante e hexadecimais de um objeto. Ou seja, quando um objeto tem um campo de propriedade para um desses tipos, é possível mudar o valor dele ao longo do tempo para afetar uma animação. Para animar qualquer outro tipo de valor, você informa ao sistema como calcular os valores desse tipo, implementando a interface TypeEvaluator.

Você pode usar dois animadores para animar os valores de uma propriedade: ValueAnimator e ObjectAnimator. O ValueAnimator calcula os valores de animação, mas não reconhece o objeto ou a propriedade específica que é animado como resultado. Ela simplesmente executa os cálculos, e você precisa detectar as atualizações e processar os dados com sua própria lógica. A ObjectAnimator é uma subclasse de ValueAnimator e permite definir o objeto e a propriedade que serão animados, além de processar todo o trabalho de animação. Ou seja, você fornece à ObjectAnimator o objeto que será animado, a propriedade do objeto que vai mudar ao longo do tempo e um conjunto de valores a serem aplicados à propriedade ao longo do tempo e, em seguida, inicia a animação.

Além disso, a classe LayoutTransition permite animações de transição automáticas para as mudanças feitas no layout da atividade. Para ativar transições para parte do layout, crie um objeto LayoutTransition e defina-o em qualquer ViewGroup chamando setLayoutTransition(). Isso faz com que as animações padrão sejam executadas sempre que itens forem adicionados ou removidos do grupo. Para especificar animações personalizadas, chame setAnimator() no LayoutTransition e forneça um Animator personalizado, como ValueAnimator ou ObjectAnimator discutidos acima.

Para mais informações, consulte a documentação Animação de propriedade. Você também pode ver vários exemplos usando as APIs de animação no aplicativo Demonstrações de API.

Framework de interface estendido

  • Seleção de múltipla escolha para ListView e GridView

    O novo modo CHOICE_MODE_MULTIPLE_MODAL para setChoiceMode() permite que os usuários selecionem vários itens de um ListView ou GridView. Quando usada em conjunto com a barra de ações, os usuários podem selecionar vários itens e escolher a ação a ser realizada em uma lista de opções, que se transformou em um modo de ação de múltipla escolha.

    Para ativar a seleção de múltipla escolha, chame setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) e registre um MultiChoiceModeListener com setMultiChoiceModeListener().

    Quando o usuário toca e mantém pressionado um item, a barra de ações alterna para o modo de ação multiescolha. O sistema notifica o MultiChoiceModeListener quando os itens são selecionados, chamando onItemCheckedStateChanged().

    Para um exemplo de seleção de múltipla escolha, consulte a classe List15. java no aplicativo de amostra Demonstrações da API.

  • Novas APIs para transformar visualizações

    As novas APIs permitem aplicar facilmente transformações 2D e 3D às visualizações no layout da atividade. Novas transformações são possíveis com um conjunto de propriedades de objeto que definem a posição, orientação, transparência do layout da visualização e muito mais.

    Os novos métodos para definir as propriedades da visualização incluem: setAlpha(), setBottom(), setLeft(), setRight(), setBottom(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY(), setAlpha() e outros.

    Alguns métodos também têm um atributo XML correspondente que você pode especificar no arquivo de layout para aplicar uma transformação padrão. Os atributos disponíveis incluem: translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotY e alpha.

    Usando algumas dessas novas propriedades de visualização em combinação com o novo framework de animação (discutido acima), você pode aplicar facilmente algumas animações sofisticadas às suas visualizações. Por exemplo, para girar uma visualização no eixo Y, forneça a ObjectAnimator com o View, a propriedade "rotationY" e os valores inicial e final:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • Novos temas holográficos

    Os widgets padrão do sistema e a aparência geral foram reformulados e incorporam um novo tema "holográfico" da interface do usuário. O sistema aplica o novo tema usando o sistema padrão de estilo e tema.

    Qualquer aplicativo direcionado à plataforma Android 3.0, definindo o valor android:minSdkVersion ou android:targetSdkVersion como "11", herda o tema holográfico por padrão. No entanto, se o aplicativo também aplicar um tema próprio, ele vai substituir o tema holográfico, a menos que você atualize os estilos para herdar o tema holográfico.

    Para aplicar o tema holográfico a atividades individuais ou herdá-las nas suas próprias definições de tema, use um dos vários novos temas Theme.Holo. Se o aplicativo for compatível com versões do Android anteriores à 3.0 e aplicar temas personalizados, selecione um tema com base na versão da plataforma.

  • Novos widgets
    • AdapterViewAnimator

      Classe de base para um AdapterView que executa animações ao alternar entre as visualizações.

    • AdapterViewFlipper

      ViewAnimator simples que faz a animação entre duas ou mais visualizações que foram adicionadas a ele. Apenas uma criança é exibida por vez. Se solicitado, ele pode alternar automaticamente entre cada filho em um intervalo regular.

    • CalendarView

      Permite que os usuários selecionem datas de um calendário tocando na data e podem rolar ou movimentar o calendário até uma data desejada. Você pode configurar o intervalo de datas disponível no widget.

    • ListPopupWindow

      Ancora-se a uma visualização de host e mostra uma lista de opções, como uma lista de sugestões ao digitar em uma visualização EditText.

    • NumberPicker

      Permite que o usuário selecione um número de um intervalo predefinido. O widget apresenta um campo de entrada e botões para cima e para baixo para selecionar um número. Tocar no campo de entrada permite que o usuário percorra os valores ou toque novamente para editar diretamente o valor atual. Ela também permite mapear as posições para strings, de modo que a string correspondente seja mostrada no lugar da posição do índice.

    • PopupMenu

      Mostra um Menu em uma janela pop-up modal ancorada a uma visualização. O pop-up vai aparecer abaixo da visualização da âncora, se houver espaço, ou acima dele, se não houver. Se o IME (teclado de software) estiver visível, o pop-up não vai se sobrepor ao IME até que o usuário toque no menu.

    • SearchView

      Fornece uma caixa de pesquisa que pode ser configurada para entregar consultas de pesquisa a uma atividade especificada e exibir sugestões de pesquisa (da mesma maneira que na caixa de diálogo de pesquisa tradicional). Esse widget é particularmente útil para oferecer um widget de pesquisa na barra de ações. Para mais informações, consulte Como criar uma interface de pesquisa.

    • StackView

      Uma visualização que mostra os filhos em uma pilha 3D e permite que os usuários deslizem por visualizações como um rolodex.

Gráficos

  • Gráficos 2D com aceleração de hardware

    Agora você pode ativar o renderizador OpenGL para seu aplicativo definindo android:hardwareAccelerated="true" no elemento <application> do elemento de manifesto ou para elementos <activity> individuais.

    Essa flag ajuda os aplicativos fazendo com que desenhem mais rápido. Isso resulta em animações mais suaves, rolagem mais suave e desempenho geral e resposta melhores à interação do usuário.

  • Conferir suporte para camadas de hardware e software

    Por padrão, um View não tem uma camada especificada. Você pode especificar que a visualização seja apoiada por uma camada de hardware ou software, especificada pelos valores LAYER_TYPE_HARDWARE e LAYER_TYPE_SOFTWARE, usando setLayerType() ou o atributo layerType.

    Uma camada de hardware é apoiada por uma textura específica do hardware (geralmente Frame Buffer Objects ou FBO no hardware OpenGL) e faz com que a visualização seja renderizada usando o pipeline de renderização de hardware do Android, mas somente se a aceleração de hardware estiver ativada para a hierarquia de visualização. Quando a aceleração de hardware é desativada, as camadas de hardware se comportam exatamente como camadas de software.

    Uma camada de software é apoiada por um bitmap e faz com que a visualização seja renderizada usando o pipeline de renderização de software do Android, mesmo que a aceleração de hardware esteja ativada. As camadas de software precisam ser evitadas quando a árvore de visualização afetada é atualizada com frequência. Cada atualização vai exigir uma nova renderização da camada de software, o que pode ser lento.

    Para mais informações, consulte a documentação LAYER_TYPE_HARDWARE e LAYER_TYPE_SOFTWARE.

  • Mecanismo de gráficos 3D do RenderScript

    O Renderscript é um framework 3D de tempo de execução que fornece uma API para criar cenas 3D e uma linguagem de sombreador especial e independente da plataforma para garantir o melhor desempenho. Com o Renderscript, é possível acelerar as operações gráficas e o processamento de dados. O Renderscript é a maneira ideal de criar efeitos 3D de alto desempenho para aplicativos, planos de fundo, carrosséis e muito mais.

    Para ver mais informações, consulte a documentação Renderização e computação 3D com Renderscript.

Mídia

  • Vídeo em Time Lapse

    As APIs de câmera de vídeo agora oferecem suporte à capacidade de gravar vídeos em Time Lapse. O setCaptureRate() define a taxa em que os frames precisam ser capturados.

  • Suporte a texturas para fluxos de imagem

    O novo SurfaceTexture permite capturar um fluxo de imagem como uma textura do OpenGL ES. Ao chamar setPreviewTexture() para sua instância Camera, você pode especificar o SurfaceTexture em que a reprodução de vídeo ou os frames de visualização da câmera serão exibidos.

  • Transmissão ao vivo HTTP

    Os aplicativos agora podem passar um URL de playlist M3U para o framework de mídia para iniciar uma sessão de transmissão ao vivo HTTP. O framework de mídia oferece suporte à maioria das especificações de HTTP Live Streaming, incluindo a taxa de bits adaptável. Consulte o documento Formatos de mídia compatíveis para mais informações.

  • Dados EXIF

    O ExifInterface inclui novos campos para abertura de foto, ISO e tempo de exposição.

  • Perfis de filmadora

    Com o novo método hasProfile() e vários perfis de qualidade de vídeo (como QUALITY_1080P, QUALITY_720P, QUALITY_CIF, entre outros), é possível determinar as opções de qualidade da câmera de vídeo.

  • Transferência de arquivos de mídia digital

    A plataforma inclui suporte integrado para Media/Picture Transfer Protocol (MTP/PTP) via USB, o que permite que os usuários transfiram facilmente qualquer tipo de arquivo de mídia entre dispositivos e para um computador host. Os desenvolvedores podem aproveitar esse suporte criando aplicativos que permitem aos usuários criar ou gerenciar arquivos rich media que eles podem querer transferir ou compartilhar entre dispositivos.

  • Gerenciamento de direitos digitais (DRM)

    Nova estrutura extensível de gerenciamento de direitos digitais (DRM, na sigla em inglês) para verificação e aplicação de direitos digitais. Ela é implementada em duas camadas de arquitetura:

    • Uma API de framework de DRM, que é exposta a aplicativos e é executada pela VM Dalvik para aplicativos padrão.
    • Um gerenciador de DRM de código nativo que implementa a API do framework e expõe uma interface para plug-ins de DRM para processar o gerenciamento de direitos e a descriptografia para vários esquemas de DRM.

    Para desenvolvedores de aplicativos, o framework oferece uma API abstrata e unificada que simplifica o gerenciamento de conteúdo protegido. A API oculta a complexidade das operações de DRM e permite um modo de operação consistente para conteúdo protegido e desprotegido e em vários esquemas de DRM.

    Para fabricantes de dispositivos, proprietários de conteúdo e provedores de mídia digital da Internet, a API de plug-in do framework de DRM oferece um meio de adicionar suporte a um esquema de DRM de escolha no sistema Android para a aplicação segura da proteção de conteúdo.

    A versão de pré-lançamento não fornece plug-ins de DRM nativos para verificar e aplicar direitos digitais. No entanto, os fabricantes de dispositivos podem enviar plug-ins de DRM com os dispositivos.

    Você pode encontrar todas as APIs de DRM no pacote android.drm.

Compatibilidade com teclado

  • Compatibilidade com os modificadores Control, Meta, Caps Lock, Num Lock e Scroll Lock. Para mais informações, consulte META_CTRL_ON e campos relacionados.
  • Compatibilidade com teclados completos no estilo de área de trabalho, incluindo teclas como Esc, Home, End, Delete e outras. Você pode determinar se os eventos de teclas vêm de um teclado completo consultando getKeyboardType() e verificando KeyCharacterMap.FULL.
  • TextView agora oferece suporte para recortar, copiar, colar e selecionar tudo usando o teclado, usando as combinações de teclas Control+X, Control+C, Control+V e Control+A. Ele também é compatível com Page Up/Page Down, Home/End e seleção de texto baseada em teclado.
  • O KeyEvent adiciona vários novos métodos para facilitar a verificação correta e consistente do estado do modificador da chave. Consulte hasModifiers(int), hasNoModifiers(), metaStateHasModifiers() e metaStateHasNoModifiers().
  • Os aplicativos podem implementar atalhos de teclado personalizados criando subclasses de Activity, Dialog ou View e implementando onKeyShortcut(). O framework chama esse método sempre que uma chave é combinada com a chave de controle. Ao criar um menu de opções, você pode registrar atalhos de teclado definindo o atributo android:alphabeticShortcut ou android:numericShortcut para cada elemento <item> (ou com setShortcut()).
  • O Android 3.0 inclui um novo dispositivo de "teclado virtual" com o ID KeyCharacterMap.VIRTUAL_KEYBOARD. O teclado virtual tem um mapa de teclas dos EUA no estilo de desktop que é útil para sintetizar eventos principais para testar entradas.

Eventos de toque dividido

Antes, apenas uma visualização aceitava eventos de toque por vez. O Android 3.0 adiciona suporte à divisão de eventos de toque em visualizações e até mesmo janelas, para que visualizações diferentes possam aceitar eventos de toque simultâneos.

Os eventos de toque dividido são ativados por padrão quando um aplicativo é direcionado ao Android 3.0. Ou seja, quando o aplicativo define o valor do atributo android:minSdkVersion ou android:targetSdkVersion como "11".

No entanto, as propriedades abaixo permitem desativar eventos de toque divididos em visualizações dentro de grupos e janelas específicos.

  • O atributo android:splitMotionEvents para grupos de visualizações permite desativar eventos de toque dividido que ocorrem entre visualizações filhas em um layout. Por exemplo:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    Dessa forma, as visualizações filhas no layout linear não podem dividir eventos de toque. Apenas uma visualização pode receber eventos de toque por vez.

  • A propriedade de estilo android:windowEnableSplitTouch permite desativar eventos de toque divididos em janelas, aplicando-a a um tema para a atividade ou o aplicativo inteiro. Por exemplo:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    Quando esse tema é aplicado a uma <activity> ou uma <application>, apenas eventos de toque na janela de atividade atual são aceitos. Por exemplo, ao desativar eventos de toque dividido entre janelas, a barra do sistema não pode receber eventos de toque ao mesmo tempo que a atividade. Isso não afeta se as visualizações dentro da atividade podem dividir eventos de toque. Por padrão, a atividade ainda pode dividir esses eventos entre as visualizações.

    Para mais informações sobre como criar um tema, leia Como aplicar estilos e temas.

WebKit

  • Nova classe WebViewFragment para criar um fragmento composto de um WebView.
  • Novos métodos WebSettings:
    • setDisplayZoomControls() permite ocultar os controles de zoom na tela e, ao mesmo tempo, permitir que o usuário aplique zoom com gestos do dedo (setBuiltInZoomControls() precisa ser definido como true).
    • O novo método WebSettings, setEnableSmoothTransition(), permite ativar transições suaves ao movimentar e aplicar zoom. Quando ativada, a WebView escolhe uma solução para maximizar a performance. Por exemplo, o conteúdo da WebView não pode ser atualizado durante a transição.
  • Novos métodos WebView:
    • onPause(), para pausar qualquer processamento associado ao WebView quando ele ficar oculto. Isso é útil para reduzir o tráfego desnecessário da CPU ou de rede quando a WebView não está em primeiro plano.
    • onResume(), para retomar o processamento associado à WebView, que foi pausada durante onPause().
    • saveWebArchive() permite salvar a visualização atual como um arquivo da Web no dispositivo.
    • showFindDialog() inicia uma pesquisa de texto na visualização atual.

Navegador

O aplicativo Navegador adiciona os seguintes recursos para ser compatível com aplicativos da web:

  • Captura de mídia

    Conforme definido pela especificação HTML Media Capture, o navegador permite que aplicativos da Web acessem os recursos de captura de áudio, imagem e vídeo do dispositivo. Por exemplo, o HTML a seguir fornece uma entrada para que o usuário tire uma foto e faça upload:

    <input type="file" accept="image/*;capture=camera" />
    

    Ou, ao excluir o parâmetro capture=camera, o usuário pode optar por capturar uma nova imagem com a câmera ou selecionar uma no dispositivo (como no aplicativo Galeria).

  • Orientação do dispositivo

    Conforme definido pela especificação Evento de orientação do dispositivo, o navegador permite que aplicativos da Web detectem eventos DOM que fornecem informações sobre a orientação física e o movimento do dispositivo.

    A orientação do dispositivo é expressa com os eixos x, y e z, em graus, e o movimento é expressa com dados de aceleração e taxa de rotação. Uma página da Web pode se registrar para eventos de orientação chamando window.addEventListener com o tipo de evento "deviceorientation" e registrar eventos de movimento, registrando o tipo de evento "devicemotion".

  • Transformações 3D do CSS

    Conforme definido pela especificação do Módulo de transformação 3D do CSS, o navegador permite que os elementos renderizados pelo CSS sejam transformados em três dimensões.

Utilitários JSON

As novas classes, JsonReader e JsonWriter, ajudam você a ler e gravar streams JSON. As novas APIs complementam as classes org.json, que manipulam um documento na memória.

É possível criar uma instância de JsonReader chamando o método construtor e transmitindo o InputStreamReader que alimenta a string JSON. Em seguida, comece a ler um objeto chamando beginObject(), leia um nome de chave com nextName(), leia o valor usando métodos respectivos ao tipo, como nextString() e nextInt(), e continue fazendo isso enquanto hasNext() estiver definido como verdadeiro.

É possível criar uma instância de JsonWriter chamando o construtor e transmitindo o OutputStreamWriter apropriado. Em seguida, grave os dados JSON de maneira semelhante ao leitor, usando name() para adicionar um nome de propriedade e um método value() apropriado para adicionar o respectivo valor.

Essas classes são restritas por padrão. O método setLenient() em cada classe as configura para serem mais liberais no que aceitam. Esse modo de análise flexível também é compatível com o analisador padrão de org.json.

Novas constantes de recurso

O elemento <uses-feature> manfest precisa ser usado para informar entidades externas (como o Google Play) sobre o conjunto de recursos de hardware e software de que o aplicativo depende. Nesta versão, o Android adiciona estas novas constantes que os aplicativos podem declarar com esse elemento:

  • "android.hardware.faketouch"

    Quando declarado, isso indica que o aplicativo é compatível com um dispositivo que oferece uma tela touchscreen emulada (ou melhor). Um dispositivo que oferece uma tela touchscreen emulada fornece um sistema de entrada do usuário que pode emular um subconjunto de recursos da tela touchscreen. Um exemplo desse sistema de entrada é um mouse ou controle remoto que aciona um cursor na tela. Esses sistemas de entrada são compatíveis com eventos de toque básicos, como clicar para baixo, clicar para cima e arrastar. No entanto, tipos de entrada mais complicados (como gestos, deslizes rápidos etc.) podem ser mais difíceis ou impossíveis em dispositivos falsos. Os gestos multitoque definitivamente não são possíveis.

    Se o aplicativo não exigir gestos complicados e você não quiser que ele seja filtrado de dispositivos com uma tela touchscreen emulada, declare "android.hardware.faketouch" com um elemento <uses-feature>. Dessa forma, o aplicativo estará disponível para o maior número de tipos de dispositivos, incluindo aqueles que fornecem apenas uma entrada de tela touchscreen emulada.

    Todos os dispositivos que incluem uma tela touchscreen também oferecem suporte a "android.hardware.faketouch", porque as funcionalidades dessa tela são um superconjunto de funções de toque falso. Portanto, a menos que você precise de uma tela touchscreen, adicione um elemento <uses-feature> para o faketouch.

Novas permissões

  • "android.permission.BIND_REMOTEVIEWS"

    Ela precisa ser declarada como uma permissão obrigatória no elemento de manifesto <service> para uma implementação de RemoteViewsService. Por exemplo, ao criar um widget de app que usa RemoteViewsService para preencher uma visualização de coleção, a entrada do manifesto pode ter esta aparência:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

Novas tecnologias de plataforma

  • Armazenamento
    • Suporte ao sistema de arquivos ext4 para ativar o armazenamento eMMC integrado.
    • sistema de arquivos FUSE para oferecer compatibilidade com dispositivos MTP.
    • Suporte ao modo host USB com suporte a teclados e hubs USB.
    • Suporte a MTP/PTP
  • Kernel do Linux
    • Atualizado para a versão 2.6.36
  • VM Dalvik
    • Novo código de suporte e otimização para o SMP
    • Várias melhorias na infraestrutura JIT
    • Melhorias no coletor de lixo:
      • Ajuste para SMP
      • Suporte a tamanhos de heap maiores
      • Processamento unificado para bitmaps e buffers de byte
  • Bibliotecas Core Dalvik
    • Implementação nova e muito mais rápida do NIO (biblioteca moderna de E/S)
    • Melhoria das mensagens de exceção
    • Correção e correções de desempenho em todo o processo

Relatório de diferenças de API

Para ter uma visão detalhada de todas as mudanças da API no Android 3.0 (nível 11 da API), consulte o Relatório de diferenças da API.

Nível de API

A plataforma Android 3.0 oferece uma versão atualizada da API de framework. Um identificador inteiro (11) é atribuído à API Android 3.0, que é armazenado no próprio sistema. Esse identificador, chamado de "nível da API", permite que o sistema determine corretamente se um aplicativo é compatível com ele antes da instalação.

Para usar as APIs introduzidas no Android 3.0, você precisa compilar o aplicativo na biblioteca do Android fornecida na plataforma SDK do Android 3.0. Dependendo das suas necessidades, talvez também seja necessário adicionar um atributo android:minSdkVersion="11" ao elemento <uses-sdk> no manifesto do aplicativo. Se o aplicativo for projetado para ser executado apenas no Android 2.3 e versões mais recentes, a declaração do atributo vai impedir que o aplicativo seja instalado em versões anteriores da plataforma.

Para mais informações, leia O que é o nível da API?