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 para download inclui uma biblioteca Android e uma imagem do sistema, além de um conjunto de aparências de 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 para download inclui uma biblioteca Android e uma imagem do sistema, além de um conjunto de aparências do 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.

Fragments

Um fragmento é um novo componente de framework que permite separar elementos distintos de uma atividade em módulos independentes que definem a própria IU e o 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. É possível 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 para a 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 modificados e permitindo que o usuário navegue para trás 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, você precisa usar o FragmentManager, que fornece várias APIs para interagir com eles, 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. Em seguida, 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 de fragmento à atividade.

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

Barra de ações

A Barra de ações substitui a barra de título tradicional na parte superior da janela de atividade. Inclui o logotipo do aplicativo no canto esquerdo e 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 há espaço suficiente, o item de menu aparece 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ção".

    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 executar 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 pela 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 saber mais 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 Demonstrações de API.

Área de transferência do sistema

Os aplicativos agora podem copiar e colar dados (além de textos) de e para a área de transferência do sistema. Os dados recortados podem ser texto simples, um URI ou uma 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 aplicativo e colar em outro aplicativo que ofereça suporte a esse tipo de conteúdo.

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

Para copiar um item para a área de transferência, crie um novo objeto ClipData, que contém 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 o ClipData à área de transferência, transmita-o para setPrimaryClip() da instância ClipboardManager.

Em seguida, você pode ler um arquivo da área de transferência (para colar) chamando getPrimaryClip() no ClipboardManager. O processamento do 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 colar.

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

Para mais informações, leia a documentação sobre copiar e colar. Também é possível conferir 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 de usuário do aplicativo. Uma operação de arrastar é a transferência de algum tipo de dados, transferidos em um objeto ClipData, de um lugar para outro. Os pontos inicial e final da operação de arrastar são 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 embaixo dos 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 um View (receber a ação de soltar), 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 a ação de arrastar, o sistema chama onDrag() repetidamente para a visualização abaixo da ação de arrastar para entregar um stream de eventos de arrastar. A visualização de destino pode consultar o tipo de evento enviado 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 pode colocar os dados arrastados na área de transferência do sistema.

Para mais informações, leia a documentação sobre Arrastar e soltar. Também é possível ver uma implementação de arrastar e soltar nos aplicativos Demonstrações de API 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 é compatível com dois novos campos: autoAdvanceViewId e previewImage. O campo autoAdvanceViewId permite especificar o ID de 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 para o 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 do 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-o como você quer que a imagem apareça e salve-a e coloque-a nos recursos drawable do aplicativo.

Você pode conferir uma implementação dos novos recursos de widget de app nos aplicativos Widget de app StackView e Widget 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 aprimorado, 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 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, para widgets de notificação mais interativos. Por exemplo, uma notificação pode controlar a reprodução de música sem iniciar uma atividade.

Carregadores de conteúdo

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

Tudo o que você precisa fazer é 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 para sua atividade ou seu fragmento.

Para mais informações, leia a documentação sobre Carregadores. Você também pode conferir um exemplo de código usando carregadores nos exemplos LoaderCursor e LoaderThrottle (links em inglês).

APIs de Bluetooth A2DP e headset

O Android agora inclui APIs para aplicativos que verificam o estado dos dispositivos Bluetooth A2DP e com perfil de fone de ouvido conectados. Por exemplo, os aplicativos podem identificar quando um fone de ouvido Bluetooth está conectado para ouvir música e notificar o usuário conforme necessário. Os aplicativos 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 (visualização, drawable, fragmento, objeto ou qualquer outra coisa). 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 a exibição de animações em conjunto, em sequência ou após atrasos especificados
  • Atraso na atualização do frame

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

Há dois animadores que podem ser usados 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ífico 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 ao ObjectAnimator o objeto que será animado, a propriedade dele que vai mudar com o tempo e um conjunto de valores para aplicar à 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 em 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 propriedades. Também é possível 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 usado em conjunto com a barra de ações, os usuários podem selecionar vários itens e, em seguida, selecionar a ação a ser realizada em uma lista de opções, que foi transformada 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 em um item e o mantém pressionado, a barra de ações alterna para o modo de ação de múltipla escolha. O sistema notifica o MultiChoiceModeListener quando os itens são selecionados, chamando onItemCheckedStateChanged().

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

  • Novas APIs para transformar visualizações

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

    Os novos métodos para definir as propriedades de 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 pode ser especificado 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 a 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 de Theme.Holo. Se o aplicativo for compatível com a versão do Android anterior à 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 anima entre duas ou mais visualizações que foram adicionadas a ele. Apenas uma criança aparece por vez. Se solicitado, ele pode alternar automaticamente entre cada filho em um intervalo regular.

    • CalendarView

      Permite que os usuários selecionem datas em uma agenda tocando nela e podem rolar ou deslizar a agenda até uma data desejada. Você pode configurar o intervalo de datas disponíveis no widget.

    • ListPopupWindow

      Ancora-se em uma visualização do 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. O toque no campo de entrada permite que o usuário percorra os valores ou toque novamente para editar diretamente o valor atual. Ele também permite mapear posições para strings para que a string correspondente seja mostrada em vez da posição do índice.

    • PopupMenu

      Exibe 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 dela, se não houver. Se o IME (teclado de software) estiver visível, o pop-up não se sobrepõe 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 a caixa de diálogo de pesquisa tradicional). Esse widget é particularmente útil para oferecer um widget de pesquisa na barra de ações. Para saber mais, 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 app 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 melhor desempenho geral e resposta à interação do usuário.

  • Conferir o 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 em 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 saber mais, consulte a documentação LAYER_TYPE_HARDWARE e LAYER_TYPE_SOFTWARE.

  • Mecanismo de gráficos 3D RenderScript

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

    Para 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. A setCaptureRate() define a taxa em que os frames precisam ser capturados.

  • Suporte a texturas para fluxos de imagem

    O novo SurfaceTexture permite capturar um stream 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 mostrados.

  • Transmissão ao vivo HTTP

    Os aplicativos agora podem transmitir um URL de playlist M3U para o framework de mídia para iniciar uma sessão de transmissão HTTP Live. 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 da foto, ISO e tempo de exposição.

  • Perfis de filmadoras

    O novo método hasProfile() e vários perfis de qualidade de vídeo (como QUALITY_1080P, QUALITY_720P, QUALITY_CIF e outros) permitem determinar as opções de qualidade da filmadora.

  • Transferência de arquivos de mídia digital

    A plataforma inclui suporte integrado ao protocolo de transferência de mídia/imagem (MTP/PTP) por USB, 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. Ele é implementado 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 de framework e expõe uma interface para plug-ins de DRM para lidar com 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 para 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 uma 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 seus dispositivos.

    Todas as APIs de DRM estão disponíveis no pacote android.drm.

Compatibilidade com teclado

  • Suporte aos 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.
  • O TextView agora oferece suporte a recortar, copiar, colar e selecionar tudo baseado em teclado, usando as combinações de teclas Control+X, Control+C, Control+V e Control+A. Ele também é compatível com PageUp/PageDown, Home/End e seleção de texto baseada em teclado.
  • KeyEvent adiciona vários novos métodos para facilitar a verificação do estado do modificador da chave de forma correta e consistente. Consulte hasModifiers(int), hasNoModifiers(), metaStateHasModifiers(), 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 uma tecla 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 área de trabalho que é útil para sintetizar eventos de teclas para testar entradas.

Eventos de toque dividido

Antes, apenas uma visualização podia aceitar eventos de toque por vez. O Android 3.0 adiciona suporte à divisão de eventos de toque em visualizações e até mesmo janelas. Assim, visualizações diferentes podem 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 tiver definido o valor do atributo android:minSdkVersion ou android:targetSdkVersion como "11".

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

  • O atributo android:splitMotionEvents para visualizações em grupo 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 os eventos de toque divididos em janelas, aplicando-a a um tema para a atividade ou todo o app. 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 dentro da janela de atividade atual são aceitos. Por exemplo, ao desativar os eventos de toque divididos nas 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 eventos de toque entre visualizações.

    Para saber mais sobre como criar um tema, leia Aplicar estilos e temas.

WebKit

  • Nova classe WebViewFragment para criar um fragmento composto por uma WebView.
  • Novos métodos WebSettings:
    • setDisplayZoomControls() permite ocultar os controles de zoom na tela e ainda permitir que o usuário aplique zoom com gestos de dedo. É necessário definir setBuiltInZoomControls() 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 o desempenho. Por exemplo, o conteúdo da WebView pode não 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.
    • Callback onResume(), para retomar o processamento associado ao WebView, que foi pausado durante onPause().
    • saveWebArchive() permite que você salve 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 oferecer suporte a 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 capture uma foto e faça o upload dela:

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

    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 se registrar para eventos de movimento registrando o tipo de evento "devicemotion".

  • Transformações CSS 3D

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

Utilitários JSON

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

Você pode 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 o nome de uma 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 adequado. Em seguida, grave os dados JSON de forma 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 rígidas 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 recursos

O elemento do manifesto <uses-feature> precisa ser usado para informar a 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, para cima e arrastar. No entanto, tipos de entrada mais complicados (como gestos, deslizar rapidamente etc.) podem ser mais difíceis ou impossível em dispositivos falsos (e 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 app vai estar disponível para o maior número de tipos de dispositivos, incluindo aqueles que fornecem apenas uma entrada touchscreen emulada.

    Todos os dispositivos que incluem uma tela touchscreen também oferecem suporte a "android.hardware.faketouch", porque os recursos dessa tela são um superconjunto dos recursos de simulação. Assim, 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
    • Compatibilidade com sistema de arquivos ext4 para ativar o armazenamento integrado do eMMC.
    • Sistema de arquivos FUSE para oferecer compatibilidade com dispositivos MTP.
    • Suporte ao modo host USB com suporte a teclados e hubs USB.
    • Compatibilidade com MTP/PTP
  • Kernel do Linux
    • Upgrade feito para a versão 2.6.36
  • VM Dalvik
    • Novo código para compatibilidade e otimização para o SMP
    • Várias melhorias na infraestrutura do 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)
    • Mensagens de exceção aprimoradas
    • Correções de exatidão e desempenho.

Relatório de diferenças da API

Para ter uma visão detalhada de todas as mudanças da API no Android 3.0 (API de nível 11), 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 do framework. A API Android 3.0 recebe um identificador de números inteiros (11) que é armazenado no próprio sistema. Esse identificador, chamado de "nível de API", permite que o sistema determine corretamente se um aplicativo é compatível com ele antes de instalá-lo.

Para usar as APIs introduzidas no Android 3.0 no seu aplicativo, é necessário compilar o aplicativo na biblioteca 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 foi projetado para ser executado apenas no Android 2.3 e versões mais recentes, a declaração do atributo evita que o aplicativo seja instalado em versões anteriores da plataforma.

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