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 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. 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 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.1, use o SDK Manager do Android 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 de 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, dependendo do dispositivo Android estar atuando como host ou do hardware externo agir como host:
- Um dispositivo USB é uma parte do 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 se conectar como acessórios, desde controladores de robótica 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, assim 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
e, em seguida, consultar a lista de dispositivos
ou acessórios anexados e, em seguida, se comunicar ou gerenciar esses dispositivos.
O UsbManager
também declara ações da 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 Android atuando como host).UsbAccessory
, representando o hardware externo conectado como o host USB (com o dispositivo Android atuando como um dispositivo USB).UsbInterface
eUsbEndpoint
, que fornecem acesso a interfaces e endpoints USB padrão de um dispositivo.UsbDeviceConnection
eUsbRequest
, para enviar e receber dados e controlar mensagens de ou para um dispositivo USB de forma síncrona e assíncrona.UsbConstants
, que fornece constantes para declarar tipos de endpoint, classes de dispositivo e assim por diante.
Observe que, embora a pilha USB seja integrada à plataforma, o suporte real para os modos 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 no dispositivo Android.
Além disso, os desenvolvedores podem solicitar filtragem no Google Play para que os aplicativos 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 ambos os elementos abaixo ao manifesto do aplicativo, conforme apropriado:
- Se o aplicativo precisar ficar visível apenas para dispositivos com suporte ao modo de 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 este elemento:
<uses-feature android:name="android.hardware.usb.accessory" android:required="true">
Para ver informações completas sobre como desenvolver apps que interagem com acessórios USB, consulte a documentação do desenvolvedor.
Para conferir os aplicativos de exemplo que usam a API de host USB, consulte Teste do adb e Acesso rápido de mísseis.
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, fica mais fácil para um aplicativo receber notificações quando dispositivos são conectados e removidos, gerenciar arquivos e o armazenamento nesses dispositivos e transferir arquivos e metadados para eles. 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, além de 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 pai especificados. Para receber informações sobre um objeto, um aplicativo pode passar um identificador paragetObjectInfo()
.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, 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, correspondendo ao conjunto de dados StorageInfo descrito na seção 5.2.2 da especificação do MTP. Os métodos da classe permitem que um aplicativo consiga a string de descrição, o espaço livre, a capacidade máxima de armazenamento, o ID de armazenamento e o identificador do 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 do MTP. Os métodos da classe permitem que os aplicativos recebam o fabricante, modelo, número de série e versão de um dispositivo.MtpObjectInfo
contém informações sobre um objeto armazenado em um dispositivo MTP, correspondendo ao conjunto de dados ObjectInfo descrito na seção 5.3.1 da especificação MTP. Os métodos da classe permitem que os aplicativos recebam informações sobre o tamanho de um objeto, o formato de dados, o tipo de associação, a data de criação e a miniatura.MtpConstants
fornece constantes para declarar códigos de formato de arquivos 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 aproveitar 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 touchscreen.
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 de uma roda de rolagem do mouse, ocorreu. No MotionEvent, o valor dos eixosAXIS_HSCROLL
eAXIS_VSCROLL
especificam o movimento de rolagem relativo.ACTION_HOVER_MOVE
informa a posição atual do mouse quando nenhum botão é pressionado, além de pontos intermediários desde o último eventoHOVER_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 fontes de dispositivo de entrada:
SOURCE_CLASS_JOYSTICK
: o dispositivo de origem tem eixos de joystick.SOURCE_CLASS_BUTTON
: o dispositivo de origem tem botões ou teclas.SOURCE_GAMEPAD
: o dispositivo de origem tem botões de gamepad, comoKEYCODE_BUTTON_A
ouKEYCODE_BUTTON_B
. ImplicaSOURCE_CLASS_BUTTON
SOURCE_JOYSTICK
: o dispositivo de origem tem eixos de joystick. Implica SOURCE_CLASS_JOYSTICK.
Para descrever eventos de movimento dessas novas origens, bem como de mouses
e trackballs, a plataforma agora define códigos de eixo em MotionEvent
, de forma semelhante a como define códigos de teclas em KeyEvent
. Novos códigos de eixo para joysticks
e controles de jogos incluem
AXIS_HAT_X
, AXIS_HAT_Y
, AXIS_RTRIGGER
, AXIS_ORIENTATION
, AXIS_THROTTLE
e muitos outros.
Os eixos MotionEvent
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 diversos 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 ver uma lista completa de eixos e as interpretações pretendidas, consulte a documentação da classe MotionEvent
.
A plataforma fornece eventos de movimento para aplicativos em lotes. Assim, um único
evento pode conter uma posição atual e vários movimentos históricos, chamados de 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
em ordem usando getHistoricalAxisValue()
. Depois disso, os aplicativos precisam 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 fontes. Quando um dispositivo fornece várias fontes, mais de uma
pode fornecer dados de eixo usando o mesmo eixo. Por exemplo, um evento de toque
da fonte de toque usa o eixo X para os dados de posição da tela, enquanto um evento
de joystick da fonte do joystick usa o eixo X para a posição do
stick. Por esse motivo, é importante que os aplicativos interpretem os valores
de eixo de acordo com a fonte de 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 aplicativos 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 retornados 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 a
View
s por 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 vão para o View
em foco no momento.
Por exemplo, isso significa que um View
precisa ter 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()
nelas.
Para observar 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 o streaming de dados on demand 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 base de streams que enviam e recebem pacotes de rede com payloads de mídia por RTP.AudioStream
, uma subclasse deRtpStream
que carrega payloads de áudio pelo RTP.AudioGroup
, um hub de áudio local para gerenciar e mixar o alto-falante, o microfone e oAudioStream
do dispositivo.AudioCodec
, que contém uma coleção de codecs definidos para umAudioStream
.
Para oferecer suporte a audioconferência e usos semelhantes, um aplicativo instancia duas classes como endpoints do stream:
AudioStream
especifica um endpoint remoto e consiste em mapeamento de rede e umAudioCodec
configurado.AudioGroup
representa o endpoint local para uma ou maisAudioStream
s. OAudioGroup
mistura todos osAudioStream
s e, opcionalmente, interage com o alto-falante do dispositivo e o microfone ao mesmo tempo.
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. Para usar o microfone do dispositivo, a permissão <uses-permission
android:name="android.permission.RECORD_AUDIO">
também é necessária.
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 nos dois eixos. Os usuários tocam em um widget e o mantêm pressionado para mostrar as alças de redimensionamento e, em seguida, arrastam as alças horizontais e/ou verticais para mudar o tamanho na grade de layout.
Os desenvolvedores podem tornar qualquer widget da tela inicial redimensionável definindo um
atributo resizeMode
nos metadados de AppWidgetProviderInfo
. Os valores para o
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 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 propriedades selecionadas em objetosView
. 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 objetoView
.O uso do
ViewPropertyAnimator
é simples. Para animar as propriedades de umView
, chameanimate()
para criar um objetoViewPropertyAnimator
para essaView
. Use os métodos noViewPropertyAnimator
para especificar qual propriedade será animada e de que forma. Por exemplo, para esmaecer oView
para transparente, chamealpha(0);
. O objetoViewPropertyAnimator
processa os detalhes da configuração da classeAnimator
subjacente e a inicia e, em seguida, renderiza a animação.
- Uma nova classe
- Cor do plano de fundo da animação
- Os novos métodos
getBackgroundColor()
esetBackgroundColor(int)
permitem aplicar/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.
- Os novos métodos
- Obtendo 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 umValueAnimator
.
- Um novo método
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 dela imediatamente. 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á pular frames.
- Um novo método
- 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.
- Os aplicativos podem usar um novo método
- Acessar uma visualização da agenda de um DatePicker
- Um novo método
getCalendarView()
permite que você receba umCalendarView
de uma instânciaDatePicker
.
- Um novo método
- Recebimento de callbacks quando as visualizações são desanexadas
- Um novo
View.OnAttachStateChangeListener
permite receber callbacks quando uma visualização é anexada ou removida da janela. UseaddOnAttachStateChangeListener()
para adicionar um listener eaddOnAttachStateChangeListener()
para removê-lo.
- Um novo
- Listener de navegação estrutural do fragmento, nova assinatura onInflate()
- Um novo método,
setOnBreadCrumbClickListener()
, fornece um hook para permitir que os aplicativos interceptem cliques na navegação estrutural e realizem as ações necessárias antes de acessar a entrada ou o fragmento da backstack que foi clicado. - Na classe
Fragment
, o uso deonInflate(attrs, savedInstanceState)
foi descontinuado. UseonInflate(activity, attrs, savedInstanceState)
.
- Um novo método,
- Mostrar o resultado da pesquisa em uma nova guia
- Uma chave de dados
EXTRA_NEW_SEARCH
para intentsACTION_WEB_SEARCH
permite abrir uma pesquisa em uma nova guia do navegador, e não em uma atual.
- Uma chave de dados
- Cursor de texto drawable
- Agora você pode especificar um drawable para usar como o cursor de texto usando o novo
atributo de recurso
textCursorDrawable
.
- Agora você pode especificar um drawable para usar como o cursor de texto usando o novo
atributo de recurso
- Configuração de filho exibido em visualizações remotas
- Um novo método de conveniência,
setDisplayedChild(viewId, childIndex)
, está disponível em subclassesRemoteViews
, para permitir que você defina o filho mostrado nas subclassesViewAnimator
eAdapterViewAnimator
, comoAdapterViewFlipper
,StackView
,ViewFlipper
eViewSwitcher
.
- Um novo método de conveniência,
- Teclas genéricas para gamepads e outros dispositivos de entrada
KeyEvent
adiciona uma variedade de códigos de tecla genéricos para acomodar botões do gamepad. A classe também adicionaisGamepadButton(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 pixels podem conter valores alfa não opacos (verdadeiro). Para algumas configurações (como RGB_565), essa chamada é ignorada, já que ela não é compatível com valores alfa por pixel. Isso é apenas uma dica, já que, em alguns casos, um bitmap que é conhecido como opaco pode ser 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 difere do bitmap atual em dimensão, configuração ou dados de pixels.
- Definir o local e a rotação da câmera
Camera
adiciona dois novos métodos,rotate()
esetLocation()
, para controlar a localização da câmera para transformações 3D.
Rede
- Bloqueio de Wi-Fi de alto desempenho
- Um novo bloqueio de Wi-Fi de alto desempenho permite que os apps mantenham
conexões Wi-Fi de alto desempenho mesmo quando a tela do dispositivo está desligada.
Os aplicativos que fazem streaming de música, vídeo ou voz por longos períodos podem usar 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 aplicativos precisam adquirir o
Wi-Fi de alto desempenho quando há uma necessidade de uma longa
execução ativa.
Para criar um bloqueio de alto desempenho, transmita
WIFI_MODE_FULL_HIGH_PERF
como o modo de bloqueio em uma chamada paracreateWifiLock()
.
- Um novo bloqueio de Wi-Fi de alto desempenho permite que os apps mantenham
conexões Wi-Fi de alto desempenho mesmo quando a tela do dispositivo está desligada.
Os aplicativos que fazem streaming de música, vídeo ou voz por longos períodos podem usar 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 aplicativos precisam adquirir o
Wi-Fi de alto desempenho quando há uma necessidade de uma longa
execução ativa.
- 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.
- Os aplicativos agora podem acessar estatísticas sobre mais tipos de uso de rede
usando novos métodos em
- Nome de usuário da autenticação SIP
- Os aplicativos agora podem receber e definir o nome de usuário da autenticação SIP de um perfil
usando
os novos métodos
getAuthUserName()
esetAuthUserName()
.
- Os aplicativos agora podem receber e definir o nome de usuário da autenticação SIP de um perfil
usando
os novos métodos
Gerenciador de downloads
- Processamento de downloads concluídos
- Agora, os apps podem iniciar downloads que notificam os usuários apenas sobre a
conclusão. Para iniciar esse tipo de download, os aplicativos transmitem
VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION
no métodosetNotificationVisibility()
de um objeto de solicitação. - Um novo método,
addCompletedDownload()
, permite que um aplicativo adicione um arquivo ao banco de dados de downloads para que ele possa ser gerenciado pelo aplicativo Downloads.
- Agora, os apps podem iniciar downloads que notificam os usuários apenas sobre a
conclusão. Para iniciar esse tipo de download, os aplicativos transmitem
- Mostrar downloads classificados por tamanho
- Os apps podem iniciar o aplicativo Downloads no modo de classificação por tamanho
adicionando o novo
INTENT_EXTRAS_SORT_BY_SIZE
extra a uma intentACTION_VIEW_DOWNLOADS
.
- Os apps podem iniciar o aplicativo Downloads no modo de classificação por tamanho
adicionando o novo
Framework do IME
- Receber a chave de valor extra de um método de entrada
- O
InputMethodSubtype
adiciona o métodocontainsExtraValueKey()
para verificar se uma string ExtraValue está armazenada para o subtipo e o métodogetExtraValueOf()
para extrair uma chave-valor específica do hashmap de ExtraValue.
- O
Mídia
- Novos formatos de streaming de áudio
- O framework de mídia adiciona suporte integrado a conteúdo bruto ADTS AAC para melhor streaming de áudio, bem como suporte a áudio FLAC, para conteúdo de áudio compactado com a mais alta qualidade (sem perdas). Consulte o documento Formatos de mídia compatíveis para mais informações.
Controles de inicialização em aplicativos interrompidos
A partir do Android 3.1, o gerenciador de pacotes do sistema monitora 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 parado de um aplicativo não é igual ao estado parado de uma atividade. O sistema gerencia esses dois estados interrompidos separadamente.
A plataforma define duas novas sinalizações de intent que permitem que o remetente especifique se a intent terá permissão para ativar componentes no app interrompido.
FLAG_INCLUDE_STOPPED_PACKAGES
: inclui filtros de intent de aplicativos interrompidos na lista de possíveis destinos para resolver.FLAG_EXCLUDE_STOPPED_PACKAGES
: exclui filtros de intent de aplicativos interrompidos da lista de possíveis destinos.
Quando nenhuma ou ambas as flags são definidas em uma intent, o comportamento padrão é incluir filtros de aplicativos interrompidos na lista de possíveis destinos.
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 involuntariamente ou desnecessariamente componentes de aplicativos interrompidos.
Um serviço ou aplicativo em segundo plano pode substituir esse comportamento adicionando a flag
FLAG_INCLUDE_STOPPED_PACKAGES
para transmitir
intents 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 de primeira inicialização do aplicativo e upgrades com 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 de um estado interrompido. Os dados contêm o nome do pacote.ACTION_MY_PACKAGE_REPLACED
: notifica um aplicativo de que ele foi atualizado, informando que uma nova versão foi instalada em uma versão existente. Ele só será enviado para o aplicativo que foi substituído. Ele não contém dados adicionais. Para recebê-lo, 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 formato adequado após um upgrade.Essa intent é enviada diretamente ao aplicativo, mas somente se o aplicativo tiver sido atualizado enquanto estava no estado iniciado (e não parado).
Principais utilitários
- Cache do LRU
- Uma nova classe
LruCache
permite que seus aplicativos aproveitem o armazenamento em cache eficiente. Os aplicativos podem usar a classe para reduzir o tempo gasto na computação ou download de dados da rede, mantendo um consumo sensível da memória para os dados armazenados em cache.OLruCache
é 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.
- Uma nova classe
- Descritor do arquivo como
int
- Agora é possível receber o int do descritor de arquivo nativo para um
ParcelFileDescriptor
usando um dos novos métodosgetFd()
oudetachFd()
.
- Agora é possível receber o int do descritor de arquivo nativo para um
WebKit
- Cookies do esquema de arquivos
- O
CookieManager
agora oferece suporte a cookies que usam o esquema de URIfile:
. UsesetAcceptFileSchemeCookies()
para ativar/desativar o suporte a cookies de esquema de arquivos antes de criar uma instância deWebView
ouCookieManager
. Em uma instância deCookieManager
, chameallowFileSchemeCookies()
para verificar se os cookies do esquema de arquivo estão ativados.
- O
- 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 do usuário foi processada.
- Para oferecer suporte aos recursos de login automático do navegador introduzidos no Android 3.0, o
novo
método
- 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 compatibilidade com aplicativos da Web:
- Suporte à reprodução inline de vídeo incorporada à 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 recurso
A plataforma adiciona novas constantes de recursos de hardware que os desenvolvedores podem declarar
nos manifestos do aplicativo para informar entidades externas, como o Google
Play, sobre a necessidade do aplicativo por novos recursos de hardware com suporte
nessa versão da plataforma. Os desenvolvedores declaram essas e outras constantes
de recurso em elementos de manifesto <uses-feature>
.
android.hardware.usb.accessory
: o app usa a API USB para se comunicar com dispositivos de hardware externos conectados por USB e funcionar como hosts.android.hardware.usb.host
: o app usa a API USB para se comunicar com dispositivos de hardware externos conectados por USB e funcionar como dispositivos.
O Google Play filtra os aplicativos com base nos recursos declarados nos elementos de manifesto <uses-feature>
. Para mais informações sobre
como declarar recursos em um manifesto de aplicativo, leia Filtros do
Google Play.
Relatório de diferenças da API
Para uma visão detalhada de todas as mudanças da API no Android 3.1 (nível 12 da API), 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 de framework. A API do Android 3.1 recebe um identificador inteiro ( 12), 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.1 no seu aplicativo,
você precisa compilar o aplicativo 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?