APIs do Android 3.1

Nível da API: 12

Para desenvolvedores, a plataforma Android 3.1 (HONEYCOMB_MR1) 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. A plataforma para download não inclui bibliotecas externas.

Para desenvolvedores, a plataforma Android 3.1 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.1, 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.1, incluindo novos recursos e mudanças na API do framework desde a versão anterior.

APIs USB

O Android 3.1 apresenta novas APIs poderosas para integrar periféricos conectados a aplicativos em execução na plataforma. As APIs são baseadas em uma pilha USB (Universal Serial Bus) e em serviços integrados à plataforma, incluindo suporte a interações de host e dispositivo USB. Com as APIs, os desenvolvedores podem criar aplicativos capazes de descobrir, se comunicar e gerenciar vários tipos de dispositivos conectados via USB.

A pilha e as APIs distinguem dois tipos básicos de hardware USB, com base em o dispositivo Android atuar como host ou o hardware externo agir como host:

  • Um dispositivo USB é um hardware conectado que depende do dispositivo Android para servir como host. Por exemplo, a maioria dos dispositivos de entrada, mouses e joysticks são dispositivos USB, assim como muitas câmeras, hubs e assim por diante.
  • Um acessório USB é um hardware conectado que tem um controlador host USB, fornece energia e é projetado para se comunicar com dispositivos Android por USB. Vários periféricos podem ser conectados como acessórios, desde controles robóticos até equipamentos musicais, bicicletas ergométricas e muito mais.

Para os dois tipos (dispositivos USB e acessórios USB), as APIs USB da plataforma oferecem suporte à descoberta por transmissão de intent quando anexadas ou desconectadas, bem como interfaces padrão, endpoints e modos de transferência (controle, em massa e interrupção).

As APIs USB estão disponíveis no pacote android.hardware.usb. A classe central é UsbManager, que fornece métodos auxiliares para identificar e se comunicar com dispositivos USB e acessórios USB. Os aplicativos podem adquirir uma instância de UsbManager, consultar a lista de dispositivos ou acessórios conectados e, em seguida, se comunicar ou gerenciar esses dispositivos. O UsbManager também declara ações de intent que o sistema transmite para anunciar quando um dispositivo ou acessório USB é conectado ou removido.

Outras classes incluem:

  • UsbDevice, uma classe que representa o hardware externo conectado como um dispositivo USB (com o dispositivo com tecnologia Android atuando como host).
  • UsbAccessory, representando o hardware externo conectado como o host USB (com o dispositivo Android atuando como dispositivo USB).
  • UsbInterface e UsbEndpoint, que fornecem acesso a interfaces e endpoints USB padrão para um dispositivo.
  • UsbDeviceConnection e UsbRequest, para enviar e receber dados e mensagens de controle de ou para um dispositivo USB de maneira síncrona e assíncrona.
  • UsbConstants, que fornece constantes para declarar tipos de endpoint, classes de dispositivos e assim por diante.

Embora a pilha USB seja integrada à plataforma, o suporte real aos modos de host USB e acessório aberto em dispositivos específicos é determinado pelos fabricantes. Em particular, o modo host depende do hardware do controlador USB adequado do dispositivo Android.

Além disso, os desenvolvedores podem solicitar a filtragem no Google Play, de modo que os apps não fiquem disponíveis para usuários com dispositivos que não oferecem o suporte adequado para USB. Para solicitar a filtragem, adicione um ou os dois elementos abaixo ao manifesto do aplicativo, conforme apropriado:

  • Se o aplicativo precisar ficar visível apenas para dispositivos com suporte ao modo host USB (conexão de dispositivos USB), declare esse elemento:

    <uses-feature android:name="android.hardware.usb.host" android:required="true">

  • Se o aplicativo estiver visível apenas para dispositivos com suporte a acessórios USB (conexão de hosts USB), declare esse elemento:

    <uses-feature android:name="android.hardware.usb.accessory" android:required="true">

Para ter informações completas sobre como desenvolver apps que interajam com acessórios USB, consulte a documentação do desenvolvedor.

Para ver os aplicativos de exemplo que usam a API de host USB, consulte Teste do adb e Acesso rápido do Missile.

API MTP/PTP

O Android 3.1 expõe uma nova API MTP que permite que os aplicativos interajam diretamente com câmeras conectadas e outros dispositivos PTP. Com a nova API, um aplicativo pode receber notificações quando dispositivos são conectados e removidos, gerenciar arquivos e armazenamento nesses dispositivos e transferir arquivos e metadados para e a partir deles. A API MTP implementa o subconjunto PTP (Protocolo de transferência de imagens) da especificação MTP (Protocolo de transferência de mídia).

A API MTP está disponível no pacote android.mtp e fornece estas classes:

  • O MtpDevice encapsula um dispositivo MTP conectado pelo barramento de host USB. Um aplicativo pode instanciar um objeto desse tipo e usar os métodos dele para receber informações sobre o dispositivo e os objetos armazenados nele, bem como abrir a conexão e transferir dados. Estes são alguns dos métodos:
    • getObjectHandles() retorna uma lista de identificadores para todos os objetos no dispositivo que correspondem a um formato e um pai especificados. Para receber informações sobre um objeto, um aplicativo pode passar um handle para getObjectInfo().
    • importFile() permite que um aplicativo copie dados de um objeto para um arquivo no armazenamento externo. Essa chamada pode ser bloqueada por um período arbitrário de tempo, dependendo do tamanho dos dados e da velocidade dos dispositivos. Portanto, ela precisa ser feita em uma linha de execução espaçada.
    • open() permite que um aplicativo abra um dispositivo MTP/PTP conectado.
    • getThumbnail() retorna a miniatura do objeto como uma matriz de bytes.
  • MtpStorageInfo contém informações sobre uma unidade de armazenamento em um dispositivo MTP, correspondente ao conjunto de dados StorageInfo descrito na seção 5.2.2 da especificação MTP. Os métodos dessa classe permitem que um aplicativo receba uma string de descrição, espaço livre, capacidade máxima de armazenamento, ID de armazenamento e identificador de volume de uma unidade de armazenamento.
  • MtpDeviceInfo contém informações sobre um dispositivo MTP correspondente ao conjunto de dados DeviceInfo descrito na seção 5.1.1 da especificação MTP. Os métodos da classe permitem que os aplicativos recebam o fabricante, o modelo, o número de série e a versão de um dispositivo.
  • MtpObjectInfo contém informações sobre um objeto armazenado em um dispositivo MTP, correspondente ao conjunto de dados ObjectInfo descrito na seção 5.3.1 da especificação MTP. Os métodos dessa classe permitem que os aplicativos recebam informações sobre o tamanho, o formato dos dados, o tipo de associação, a data de criação e a miniatura de um objeto.
  • O MtpConstants fornece constantes para declarar códigos de formato de arquivo MTP, tipo de associação e status de proteção.

Suporte a novos dispositivos de entrada e eventos de movimento

O Android 3.1 estende o subsistema de entrada para oferecer suporte a novos dispositivos de entrada e novos tipos de eventos de movimento em todas as visualizações e janelas. Os desenvolvedores podem desenvolver esses recursos para permitir que os usuários interajam com os aplicativos usando mouses, trackballs, joysticks, gamepads e outros dispositivos, além de teclados e touchscreens.

Para processar entradas do mouse, da roda de rolagem e do trackball, a plataforma oferece suporte a duas novas ações de eventos de movimento:

  • ACTION_SCROLL, que descreve o local do ponteiro em que um movimento de rolagem sem toque, como uma roda de rolagem do mouse, ocorria. No MotionEvent, o valor dos eixos AXIS_HSCROLL e AXIS_VSCROLL especificam o movimento de rolagem relativo.
  • ACTION_HOVER_MOVE informa a posição atual do mouse quando nenhum botão é pressionado, bem como qualquer ponto intermediário desde o último evento HOVER_MOVE. Ainda não há suporte para notificações de entrada e saída ao passar o cursor.

Para oferecer suporte a joysticks e gamepads, a classe InputDevice inclui estas novas origens de dispositivos de entrada:

Para descrever eventos de movimento dessas novas origens, bem como de mouses e trackballs, a plataforma agora define códigos de eixo em MotionEvent, da mesma forma que define códigos de teclas em KeyEvent. Os novos códigos de eixo para joysticks e controles de jogo incluem AXIS_HAT_X, AXIS_HAT_Y, AXIS_RTRIGGER, AXIS_ORIENTATION, AXIS_THROTTLE e muitos outros. Os eixos MotionEvent existentes são representados por AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR e AXIS_ORIENTATION.

Além disso, MotionEvent define vários códigos de eixo genéricos que são usados quando o framework não sabe como mapear um eixo específico. Dispositivos específicos podem usar os códigos de eixo genéricos para transmitir dados de movimento personalizados para apps. Para uma lista completa de eixos e as interpretações pretendidas, consulte a documentação da classe MotionEvent.

A plataforma fornece eventos de movimento aos aplicativos em lotes. Assim, um único evento pode conter uma posição atual e vários movimentos históricos. Os aplicativos precisam usar getHistorySize() para receber o número de amostras históricas e, em seguida, recuperar e processar todas elas na ordem usando getHistoricalAxisValue(). Depois disso, os aplicativos vão processar a amostra atual usando getAxisValue().

Alguns eixos podem ser recuperados usando métodos de acesso especiais. Por exemplo, em vez de chamar getAxisValue(), os aplicativos podem chamar getX(). Os eixos com acessadores integrados incluem AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR e AXIS_ORIENTATION.

Cada dispositivo de entrada tem um ID exclusivo atribuído pelo sistema e também pode fornecer várias origens. Quando um dispositivo fornece várias origens, mais de uma pode fornecer dados de eixo usando o mesmo eixo. Por exemplo, um evento de toque proveniente da fonte de toque usa o eixo X para dados de posição na tela, enquanto um evento de joystick proveniente da fonte de joystick usa o eixo X para a posição do stick. Por esse motivo, é importante que os aplicativos interpretem os valores dos eixos de acordo com a origem. Ao processar um evento de movimento, os aplicativos precisam usar métodos na classe InputDevice para determinar os eixos compatíveis com um dispositivo ou uma origem. Especificamente, os apps podem usar getMotionRanges() para consultar todos os eixos de um dispositivo ou todos os eixos de uma determinada origem do dispositivo. Em ambos os casos, as informações de intervalo dos eixos retornadas no objeto InputDevice.MotionRange especificam a origem de cada valor de eixo.

Por fim, como os eventos de movimento de joysticks, gamepads, mouses e trackballs não são eventos de toque, a plataforma adiciona um novo método de callback para transmiti-los a um View como eventos de movimento "genéricos". Especificamente, ele informa os eventos de movimento sem toque para Views com uma chamada para onGenericMotionEvent(), em vez de onTouchEvent().

A plataforma envia eventos de movimento genéricos de maneira diferente, dependendo da classe de origem do evento. Os eventos SOURCE_CLASS_POINTER vão para o View abaixo do ponteiro, da mesma forma que os eventos de toque funcionam. Todos os outros itens vão para o View em foco no momento. Por exemplo, isso significa que um View precisa receber foco para receber eventos de joystick. Se necessário, os aplicativos podem processar esses eventos no nível da atividade ou da caixa de diálogo implementando onGenericMotionEvent() nesse local.

Para ver um aplicativo de exemplo que usa eventos de movimento do joystick, consulte GameControllerInput e GameView.

API RTP

O Android 3.1 expõe uma API à pilha do protocolo de transporte em tempo real (RTP, na sigla em inglês) integrado, que os aplicativos podem usar para gerenciar streaming de dados sob demanda ou interativo. Em especial, apps que oferecem VOIP, "push-to-talk", conferência e streaming de áudio podem usar a API para iniciar sessões e transmitir ou receber fluxos de dados por qualquer rede disponível.

A API RTP está disponível no pacote android.net.rtp. As classes incluem:

  • RtpStream, a classe de base de streams que enviam e recebem pacotes de rede com payloads de mídia por RTP.
  • AudioStream, uma subclasse de RtpStream que carrega payloads de áudio pelo RTP.
  • AudioGroup, um hub de áudio local para gerenciar e mixar o alto-falante, o microfone e o AudioStream do dispositivo.
  • AudioCodec, que contém uma coleção de codecs definidos para uma AudioStream.

Para oferecer suporte a audioconferência e usos semelhantes, um aplicativo instancia duas classes como endpoints para o stream:

O uso mais simples envolve um endpoint remoto e um local. Para usos mais complexos, consulte as limitações descritas para AudioGroup.

Para usar a API RTP, os aplicativos precisam solicitar a permissão do usuário declarando <uses-permission android:name="android.permission.INTERNET"> nos arquivos de manifesto. A permissão <uses-permission android:name="android.permission.RECORD_AUDIO"> também é necessária para o acesso ao microfone do dispositivo.

Widgets de aplicativos redimensionáveis

A partir do Android 3.1, os desenvolvedores podem tornar os widgets da tela inicial redimensionáveis: horizontalmente, verticalmente ou em ambos os eixos. Os usuários tocam em um widget para mostrar as alças de redimensionamento, depois arrastam as alças horizontal e/ou vertical para mudar o tamanho na grade de layout.

Os desenvolvedores podem tornar qualquer widget de tela inicial redimensionável definindo um atributo resizeMode nos metadados AppWidgetProviderInfo do widget. Os valores do atributo resizeMode incluem "horizontal", "vertical" e "nenhum". Para declarar um widget como redimensionável na horizontal e na vertical, forneça o valor "horizontal|vertical".

Veja um exemplo:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical" >
</appwidget-provider>

Para ver mais informações sobre os widgets da tela inicial, consulte a documentação Widgets de apps.

Framework de animação

  • Nova classe ViewPropertyAnimator
    • Uma nova classe ViewPropertyAnimator oferece uma maneira conveniente para os desenvolvedores animarem determinadas propriedades em objetos View. A classe automatiza e otimiza a animação das propriedades, além de facilitar o gerenciamento de várias animações simultâneas em um objeto View.

      O uso do ViewPropertyAnimator é simples. Para animar as propriedades de um View, chame animate() para construir um objeto ViewPropertyAnimator para esse View. Use os métodos na ViewPropertyAnimator para especificar qual propriedade e como ela será animada. Por exemplo, para tornar View transparente, chame alpha(0);. O objeto ViewPropertyAnimator processa os detalhes da configuração da classe Animator subjacente e a inicia e, em seguida, renderiza a animação.

  • Cor do plano de fundo da animação
    • Os novos métodos getBackgroundColor() e setBackgroundColor(int) permitem receber/definir a cor do plano de fundo por trás das animações, apenas para animações de janela. No momento, o plano de fundo precisa ser preto, com qualquer nível alfa desejado.
  • Recebendo fração animada de ViewAnimator
    • Um novo método getAnimatedFraction() permite acessar a fração de animação atual, a fração decorrida/interpolada usada na atualização mais recente do frame, de um ValueAnimator.

Framework da interface

  • Renderização forçada de uma camada
    • Um novo método buildLayer() permite que um aplicativo force a criação de uma camada de visualização e a renderização imediata dela. Por exemplo, um aplicativo pode usar esse método para renderizar uma visualização na camada antes de iniciar uma animação. Se a visualização for complexa, renderizá-la na camada antes de iniciar a animação evitará que os frames sejam pulados.
  • Distância da câmera
    • Os aplicativos podem usar um novo método setCameraDistance(float) para definir a distância da câmera para uma visualização. Isso proporciona aos aplicativos melhor controle sobre as transformações 3D da visualização, como rotações.
  • Como acessar uma visualização da agenda de um DatePicker
  • Recebimento de callbacks quando as visualizações são desanexadas.
  • Listener de navegação estrutural do fragmento, nova assinatura onInflate()
  • Mostrar o resultado da pesquisa em uma nova guia
  • Cursor de texto do drawable
    • Agora você pode especificar um drawable para ser usado como o cursor de texto usando o novo atributo de recurso textCursorDrawable
  • Configuração filha exibida em visualizações remotas
  • Teclas genéricas para gamepads e outros dispositivos de entrada
    • KeyEvent adiciona um intervalo de códigos de tecla genéricos para acomodar botões do gamepad. A classe também adiciona isGamepadButton(int) e vários outros métodos auxiliares para trabalhar com códigos de tecla.

Gráficos

  • Auxiliares para gerenciar bitmaps
    • setHasAlpha(boolean) permite que um app indique que todos os pixels em um bitmap são conhecidos como opacos (falso) ou que alguns podem conter valores Alfa não opacos (verdadeiro). Para algumas configurações (como RGB_565), essa chamada é ignorada, já que ela não oferece suporte a valores alfa por pixel. Isso é apenas uma dica de desenho, porque, em alguns casos, um bitmap que é conhecido como opaco pode demorar um caso de desenho mais rápido do que um que pode ter valores alfa por pixel não opacos.
    • getByteCount() recebe o tamanho de um bitmap em bytes.
    • getGenerationId() permite que um aplicativo descubra se um bitmap foi modificado, por exemplo, para armazenamento em cache.
    • sameAs(android.graphics.Bitmap) determina se um determinado bitmap é diferente do bitmap atual em termos de dimensão, configuração ou dados de pixels.
  • Definir o local e a rotação da câmera

Rede

  • Bloqueio de Wi-Fi de alto desempenho
    • Um novo bloqueio de Wi-Fi de alto desempenho permite que os aplicativos mantenham conexões Wi-Fi de alto desempenho mesmo quando a tela do dispositivo estiver desligada. Aplicativos que transmitem música, vídeo ou voz por longos períodos podem adquirir o bloqueio de Wi-Fi de alto desempenho para garantir o desempenho do streaming mesmo quando a tela está desligada. Como ele usa mais energia, os apps precisam adquirir a conexão Wi-Fi de alto desempenho quando há uma necessidade de uma conexão de longa duração ativa.

      Para criar um bloqueio de alto desempenho, transmita WIFI_MODE_FULL_HIGH_PERF como o modo de bloqueio em uma chamada para createWifiLock().

  • Mais estatísticas de tráfego
    • Os aplicativos agora podem acessar estatísticas sobre mais tipos de uso de rede usando novos métodos em TrafficStats. Os aplicativos podem usar os métodos para receber estatísticas de UDP, contagem de pacotes, bytes de payload de transmissão/recebimento TCP e segmentos para um determinado UID.
  • Nome de usuário da autenticação SIP

Gerenciador de downloads

  • Processamento de downloads concluídos
  • Mostrar downloads ordenados por tamanho

Framework do IME

  • Receber a chave de valor extra de um método de entrada

Mídia

  • Novos formatos de streaming de áudio
    • O framework de mídia adiciona suporte integrado a conteúdo bruto de ADTS AAC, para streaming de áudio aprimorado, bem como suporte a áudio FLAC, para conteúdo de áudio compactado de maior qualidade (sem perdas). Consulte o documento Formatos de mídia compatíveis para mais informações.

Controles de inicialização em aplicativos interrompidos

No Android 3.1 e versões mais recentes, o gerenciador de pacotes do sistema monitora os aplicativos que estão em estado interrompido e fornece um meio de controlar a inicialização a partir de processos em segundo plano e de outros apps.

O estado interrompido de um aplicativo não é igual ao estado parado de uma atividade. O sistema gerencia esses dois estados de interrupção separadamente.

A plataforma define duas novas flags de intent que permitem que o remetente especifique se a intent pode ativar componentes no app parado.

Quando nenhuma ou ambas as flags são definidas em uma intent, o comportamento padrão é incluir filtros de aplicativos interrompidos na lista de destinos em potencial.

O sistema adiciona FLAG_EXCLUDE_STOPPED_PACKAGES a todas as intents de transmissão. Isso é feito para evitar que transmissões de serviços em segundo plano iniciem de forma acidental ou desnecessária componentes de aplicativos interrompidos. Um serviço ou aplicativo em segundo plano pode substituir esse comportamento adicionando a flag FLAG_INCLUDE_STOPPED_PACKAGES às intents de transmissão que precisam ter permissão para ativar aplicativos interrompidos.

Os aplicativos ficam em um estado interrompido quando são instalados pela primeira vez, mas ainda não foram iniciados e quando são interrompidos manualmente pelo usuário (em "Gerenciar aplicativos").

Notificação da primeira inicialização e upgrade do aplicativo

A plataforma adiciona notificações aprimoradas da primeira inicialização do aplicativo e upgrades por duas novas ações de intent:

  • ACTION_PACKAGE_FIRST_LAUNCH: enviado ao pacote do instalador de um aplicativo quando ele é iniciado pela primeira vez, ou seja, na primeira vez que ele sai do estado interrompido. Os dados contêm o nome do pacote.
  • ACTION_MY_PACKAGE_REPLACED: notifica um aplicativo que ele foi atualizado, com uma nova versão instalada em uma versão existente. Ele só é enviado para o app que foi substituído. Ele não contém dados adicionais. Para recebê-la, declare um filtro de intent para essa ação. Você pode usar a intent para acionar o código que ajuda a fazer com que o aplicativo volte ao estado de execução adequado após um upgrade.

    Essa intent será enviada diretamente ao aplicativo, mas somente se o aplicativo tiver sido atualizado enquanto estava no estado iniciado (e não no estado interrompido).

Principais utilitários

  • Cache de LRU
    • Uma nova classe LruCache permite que seus aplicativos aproveitem o armazenamento em cache eficiente. Os aplicativos podem usar essa classe para reduzir o tempo gasto com computação ou download de dados da rede, mantendo um consumo sensível de memória para os dados armazenados em cache.LruCache é um cache que contém fortes referências a um número limitado de valores. Sempre que um valor é acessado, ele é movido para o início de uma fila. Quando um valor é adicionado a um cache completo, o valor no final dessa fila é removido e pode se tornar qualificado para a coleta de lixo.
  • Descritor de arquivo como int

WebKit

  • Cookies do esquema de arquivos
    • O CookieManager agora oferece suporte a cookies que usam o esquema de URI file:. É possível usar setAcceptFileSchemeCookies() para ativar/desativar o suporte a cookies de esquema de arquivo antes de criar uma instância de WebView ou CookieManager. Em uma instância de CookieManager, é possível verificar se os cookies do esquema de arquivo estão ativados chamando allowFileSchemeCookies().
  • Notificação de solicitação de login
    • Para oferecer suporte aos recursos de login automático do navegador introduzidos no Android 3.0, o novo método onReceivedLoginRequest() notifica o aplicativo host de que uma solicitação de login automático para o usuário foi processada.
  • Classes e interfaces removidas
    • Várias classes e interfaces foram removidas da API pública depois de ficarem obsoletas. Consulte o Relatório de diferenças da API para mais informações.

Navegador

O aplicativo Navegador adiciona os seguintes recursos para dar suporte a aplicativos da Web:

  • Suporte à reprodução inline de vídeo incorporado à tag <video> HTML5. A reprodução é acelerada por hardware sempre que possível.
  • Suporte a camadas para elementos de posição fixa em todos os sites (dispositivos móveis e computadores).

Novas constantes de recursos

A plataforma adiciona novas constantes de recursos de hardware que os desenvolvedores podem declarar nos manifestos do aplicativo para informar a entidades externas, como o Google Play, sobre o requisito do aplicativo para novos recursos de hardware com suporte a essa versão da plataforma. Os desenvolvedores declaram essas e outras constantes de recurso em elementos de manifesto <uses-feature>.

O Google Play filtra aplicativos com base nos recursos declarados nos elementos de manifesto <uses-feature>. Para mais informações sobre a declaração de recursos em um manifesto de aplicativo, leia Filtros do Google Play.

Relatório de diferenças da API

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

Nível de API

A plataforma Android 3.1 oferece uma versão atualizada da API do framework. A API do Android 3.1 recebe um identificador de números inteiros (12) 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.1 no seu aplicativo, é necessário compilá-lo na biblioteca Android fornecida na plataforma SDK do Android 3.1. Dependendo das suas necessidades, talvez também seja necessário adicionar um atributo android:minSdkVersion="12" ao elemento <uses-sdk> no manifesto do aplicativo.

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