Visão geral de recursos e APIs

O Android 15 introduz ótimos recursos e APIs para desenvolvedores. As seções a seguir resumem esses recursos para ajudar você a começar a usar as APIs relacionadas.

Para uma lista detalhada das APIs adicionadas, modificadas e removidas, leia o Relatório de diferenças da API. Para detalhes sobre as APIs adicionadas, acesse a Referência da API do Android. Para o Android 15, procure APIs que foram adicionadas no nível 35 da API. Para saber mais sobre as áreas em que as mudanças na plataforma podem afetar seus apps, confira as mudanças de comportamento do Android 15 para apps destinados ao Android 15 e para todos os apps.

Câmera e mídia

O Android 15 inclui vários recursos que melhoram a experiência de mídia e câmera e dão acesso a ferramentas e hardware para ajudar os criadores de conteúdo a dar vida à visão deles no Android.

Para saber mais sobre os recursos e as soluções para desenvolvedores mais recentes de mídia e câmera do Android, assista à palestra Como criar experiências modernas de mídia e câmera no Android do Google I/O.

Aumento do modo pouca luz

O Android 15 apresenta o Modo pouca luz refinado, um modo de exposição automática disponível para a Câmera 2 e a extensão de câmera do modo noturno. O aumento do modo pouca luz ajusta a exposição do fluxo de visualização em condições de pouca luz. Isso é diferente de como a extensão da câmera do modo noturno cria imagens estáticas, porque o modo noturno combina uma série de fotos para criar uma única imagem aprimorada. Embora o modo noturno seja muito bom para criar uma imagem estática, ele não pode criar um fluxo contínuo de frames, mas o Modo pouca luz pode. Assim, o Modo de baixa luminosidade ativa os recursos da câmera, como:

  • Fornecer uma visualização de imagem aprimorada para que os usuários possam enquadrar melhor as fotos com pouca luz
  • Como ler QR codes em locais com pouca luz

Se você ativar o Modo pouca luz, ele será ativado automaticamente quando houver um nível baixo de iluminação e desativado quando houver mais luz.

Os apps podem gravar o fluxo de visualização em condições de pouca luz para salvar um vídeo mais claro.

Para mais informações, consulte Aprimoramento com pouca luz.

Controles da câmera no app

O Android 15 adiciona uma extensão para mais controle sobre o hardware da câmera e os algoritmos em dispositivos com suporte:

  • Ajustes avançados de intensidade do flash, que permitem o controle preciso da intensidade do flash nos modos SINGLE e TORCH durante a captura de imagens.

Controle de headroom de HDR

O Android 15 escolhe o headroom HDR apropriado para os recursos do dispositivo e a profundidade de bits do painel. Para páginas com muito conteúdo SDR, como um app de mensagens que mostra uma única miniatura HDR, esse comportamento pode acabar influenciando negativamente o brilho percebido do conteúdo SDR. O Android 15 permite controlar o headroom HDR com setDesiredHdrHeadroom para encontrar um equilíbrio entre conteúdo SDR e HDR.

O brilho dos elementos da interface SDR na tela esquerda parece mais uniforme do que o brilho na tela direita, o que simula possíveis problemas de headroom quando o conteúdo HDR e SDR são misturados. Ao ajustar o headroom do HDR, você pode alcançar um melhor equilíbrio entre o conteúdo SDR e HDR.

Controle de intensidade

O Android 15 oferece suporte ao padrão de volume CTA-2075 para evitar inconsistências de volume de áudio e garantir que os usuários não precisem ajustar constantemente o volume ao alternar entre conteúdos. O sistema aproveita os dados características dos dispositivos de saída (fones de ouvido e alto-falantes), além de metadados de volume disponíveis no conteúdo de áudio AAC para ajustar de forma inteligente o volume do áudio e níveis de compactação do intervalo dinâmico.

Para ativar esse recurso, você precisa garantir que os metadados de intensidade de som estejam disponíveis no conteúdo AAC e ativar o recurso da plataforma no app. Para isso, instancie um objeto LoudnessCodecController chamando o método de fábrica create com o ID da sessão de áudio do AudioTrack associado. Isso começa a aplicar automaticamente as atualizações de áudio. É possível transmitir um OnLoudnessCodecUpdateListener para modificar ou filtrar loudness antes de serem aplicados ao MediaCodec

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = 
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

O ExoPlayer da AndroidX media3 também será atualizado para usar a LoudnessCodecController APIs para uma integração perfeita de apps.

Dispositivos MIDI 2.0 virtuais

O Android 13 adicionou suporte à conexão com dispositivos MIDI 2.0 usando USB, que se comunicam usando pacotes MIDI universais (UMPs). O Android 15 estende o suporte de UMP a apps MIDI virtuais, permitindo que apps de composição controlem apps de sintetizador como um dispositivo MIDI 2.0 virtual, assim como fariam com um dispositivo USB MIDI 2.0.

Decodificação de software AV1 mais eficiente

dav1d 徽标

dav1d 是 VideoLAN 推出的热门 AV1 软件解码器,适用于不支持硬件 AV1 解码的 Android 设备。与旧版 AV1 软件解码器相比,dav1d 的性能最高可提升 3 倍,让更多用户(包括一些低端和中端设备)能够播放高清 AV1 视频。

您的应用需要选择启用 dav1d,方法是通过名称 "c2.android.av1-dav1d.decoder" 调用它。在后续更新中,dav1d 将成为默认的 AV1 软件解码器。此支持已标准化,并向后移植到收到 Google Play 系统更新的 Android 11 设备。

Produtividade e ferramentas para desenvolvedores

Embora a maior parte do nosso trabalho para melhorar sua produtividade se concentre em ferramentas como o Android Studio, o Jetpack Compose e as bibliotecas do Android Jetpack, sempre buscamos maneiras na plataforma para ajudar você a realizar sua visão com mais facilidade.

Atualizações do OpenJDK 17

O Android 15 continua atualizando as principais bibliotecas para se alinhar aos recursos das versões mais recentes do LTS do OpenJDK.

Os seguintes recursos e melhorias principais estão incluídos:

Essas APIs são atualizadas em mais de um bilhão de dispositivos com o Android 12 (nível 31 da API) e versões mais recentes usando as atualizações do sistema do Google Play. Assim, você pode direcionar os recursos de programação mais recentes.

Melhorias no PDF

O Android 15 inclui melhorias substanciais no PdfRenderer. APIs de terceiros. Os aplicativos podem incorporar recursos avançados, como renderização arquivos protegidos por senha, anotações, edição de formulários, pesquisa e seleção com cópia. PDF linearizado são suportadas para acelerar a visualização do PDF local e reduzir o uso de recursos. A biblioteca PDF do Jetpack usa essas APIs para simplificar a adição de recursos de visualização de PDF ao app.

As últimas atualizações para a renderização de PDF incluem recursos como pesquisar um arquivo PDF incorporado.

O PdfRenderer foi movido para um módulo que pode ser atualizado usando o Google As atualizações do sistema do Google Play são independentes da versão da plataforma, e temos suporte para essas mudanças de volta para o Android 11 (nível 30 da API), criando uma versão anterior ao Android 15 da plataforma da API, chamada PdfRendererPreV.

Refinamentos da troca automática de idioma

Android 14 在音频中添加了设备端多语言识别功能,并支持在语言之间自动切换,但这可能会导致丢失字词,尤其是当两次语音之间语言切换的间隔时间较短时。Android 15 添加了其他控件,以帮助应用根据其用例调整此切换。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS 会将自动切换限制在音频会话开始时,而 EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES 会在发生指定次数的切换后停用语言切换。如果您预计会话期间只会使用一种语言,并且该语言应被自动检测到,这些选项会特别有用。

API OpenType Variable Font aprimorada

O Android 15 melhora a usabilidade da fonte variável OpenType. É possível criar uma instância FontFamily de uma fonte variável sem especificar os eixos de peso com a API buildVariableFamily. O renderizador de texto substitui o valor do eixo wght para corresponder ao texto exibido.

O uso da API simplifica o código para criar uma Typeface consideravelmente:

Kotlin

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Java

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

Antes, para criar o mesmo Typeface, era necessário muito mais código:

Kotlin

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Java

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

Confira um exemplo de como uma Typeface foi criada com a API antiga e a nova. renderiza:

Um exemplo de como a renderização de família tipográfica é diferente usando as versões novas e antigas
APIs

Neste exemplo, a Typeface criada com a API antiga não tem a para criar pesos de fonte precisos para os tamanhos 350, 450, 550 e 650 instâncias de Font, então o renderizador retorna ao peso mais próximo. Portanto, neste caso, 300 é renderizado em vez de 350, 400 é renderizado em vez de 450 e assim por diante. Por outro lado, o Typeface criado com as novas APIs cria dinamicamente uma instância Font para um determinado peso. Assim, pesos precisos são renderizados para 350, 450, 550 e 650.

Controles granulares de quebra de linha

从 Android 15 开始,TextView 和底层行断开符可以将给定部分文本保留在同一行中,以提高可读性。您可以通过在字符串资源或 createNoBreakSpan 中使用 <nobreak> 标记来充分利用此换行符自定义功能。同样,您可以使用 <nohyphen> 标记或 createNoHyphenationSpan 来防止对字词进行分词。

例如,以下字符串资源不包含换行符,在呈现时,文本“Pixel 8 Pro”会在不合适的位置换行:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

相比之下,此字符串资源包含 <nobreak> 标记,该标记会将字词“Pixel 8 Pro”换行,并防止换行:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

以下图片展示了这些字符串呈现方式的差异:

一行文本的布局,其中显示短语“Pixel 8 Pro.”未使用 <nobreak> 标记换行。
使用 <nobreak> 标记封装“Pixel 8 Pro.”短语的同一行文本的布局。

Arquivamento de apps

O Android e o Google Play anunciaram o suporte ao arquivamento de apps por último ano, permitindo que os usuários liberem espaço removendo parcialmente apps usados com pouca frequência do dispositivo que foram publicados usando o app Android Pacote no Google Play. O Android 15 inclui suporte no nível do SO para arquivamento e desarquivamento de apps, facilitando a implementação em todas as app stores.

Apps com a permissão REQUEST_DELETE_PACKAGES podem chamar o PackageInstaller requestArchive para solicitar o arquivamento de um do pacote de apps instalado, que remove o APK e todos os arquivos em cache, mas persiste dados do usuário. Os apps arquivados são retornados como apps que podem ser exibidos por meio do APIs do LauncherApps os usuários verão um tratamento de interface para destacar e os apps são arquivados. Se um usuário tocar em um app arquivado, o instalador responsável receberá uma solicitação para desarquivá-la. Nesse caso, será possível monitorado pela transmissão ACTION_PACKAGE_ADDED.

Ativar o modo de 16 KB em um dispositivo usando as opções do desenvolvedor

Ative a opção de desenvolvedor Inicializar com tamanho de página de 16 KB para inicializar um dispositivo no modo de 16 KB.

A partir do Android 15 QPR1, é possível usar a opção do desenvolvedor disponível em alguns dispositivos para inicializar o aparelho no modo de 16 KB e realizar testes no dispositivo. Antes de usar a opção do desenvolvedor, acesse Configurações > Sistema > Atualizações de software e aplique as atualizações disponíveis.

Essa opção de desenvolvedor está disponível nos seguintes dispositivos:

  • Pixel 8 e 8 Pro (com Android 15 QPR1 ou mais recente)

  • Pixel 8a (com Android 15 QPR1 ou mais recente)

  • Pixel 9, 9 Pro e 9 Pro XL (com Android 15 QPR2 Beta 2 ou versões mais recentes)

Gráficos

O Android 15 traz as melhorias gráficas mais recentes, incluindo ANGLE e adições ao sistema de gráficos Canvas.

Modernização do acesso à GPU do Android

Logotipo do Vulkan

O hardware do Android evoluiu bastante desde os primeiros dias, quando o SO principal era executado em uma única CPU e as GPUs eram acessadas usando APIs baseadas em pipelines de função fixa. A API gráfica Vulkan® está disponível no NDK desde o Android 7.0 (nível 24 da API) com uma abstração de nível mais baixo que reflete melhor o hardware de GPU moderno, dimensiona melhor para oferecer suporte a vários núcleos de CPU e oferece uma sobrecarga reduzida do driver de CPU, o que resulta em um melhor desempenho do app. O Vulkan é compatível com todos os mecanismos de jogo modernos.

O Vulkan é a interface preferida do Android para a GPU. Portanto, o Android 15 inclui o ANGLE como uma camada opcional para executar o OpenGL® ES em cima do Vulkan. A mudança para o ANGLE padroniza a implementação do OpenGL do Android para melhorar a compatibilidade e, em alguns casos, o desempenho. Para testar a estabilidade e o desempenho do app OpenGL ES com o ANGLE, ative a opção do desenvolvedor em Configurações -> Sistema -> Opções do desenvolvedor -> Experimental: Ativar ANGLE no Android 15.

Planejamento do ANGLE no Vulkan para Android

Roteiro de mudanças futuras nas APIs de GPU do Android.

Como parte do aperfeiçoamento da pilha de GPU, vamos enviar o ANGLE como o driver do sistema GL em mais dispositivos novos, com a expectativa de que o OpenGL/ES só estará disponível pelo ANGLE. No entanto, planejamos continuar oferecendo suporte ao OpenGL ES em todos os dispositivos.

Próximas etapas recomendadas

Use as opções para desenvolvedores para selecionar o driver ANGLE para OpenGL ES e testar seu app. Para novos projetos, recomendamos o uso do Vulkan para C/C++.

Melhorias no Canvas

O Android 15 continua a modernizar o sistema de gráficos Canvas do Android com mais recursos:

  • Matrix44 fornece uma matriz 4x4 para transformar coordenadas que precisam ser usadas quando você quer manipular a tela em 3D.
  • clipShader cruza o clipe atual com o shader especificado, enquanto clipOutShader define o clipe como a diferença entre o clipe atual e o shader, cada um tratando o shader como uma máscara alfa. Isso oferece suporte ao desenho de formas complexas de maneira eficiente.

Desempenho e bateria

O Android continua focado em ajudar você a melhorar a performance e a qualidade dos seus apps. O Android 15 apresenta APIs que ajudam a tornar as tarefas no seu app mais eficientes, otimizar a performance e coletar insights sobre seus apps.

Para conferir práticas recomendadas de eficiência da bateria, depurar o uso de rede e energia e detalhes sobre como estamos melhorando a eficiência da bateria do trabalho em segundo plano no Android 15 e em versões recentes do Android, assista à palestra Como melhorar a eficiência da bateria do trabalho em segundo plano no Android do Google I/O.

API ApplicationStartInfo

在以前的 Android 版本中,应用启动一直是个谜。在应用中确定应用是从冷启动、温启动还是热启动状态启动很困难。您还很难了解应用在各种启动阶段(分叉进程、调用 onCreate、绘制第一个帧等)所花的时间。在 Application 类被实例化时,您无法知道应用是通过广播、content provider、作业、备份、启动完成、闹钟还是 Activity 启动的。

Android 15 上的 ApplicationStartInfo API 提供了所有这些功能,以及更多功能。您甚至可以选择在流程中添加自己的时间戳,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 ApplicationStartInfo 直接优化应用启动;例如,您可以消除在应用因广播而启动时在 Application 类中实例化与界面相关的库所带来的高昂开销。

Informações detalhadas sobre o tamanho do app

Desde o Android 8.0 (nível 26 da API), o Android inclui a API StorageStats.getAppBytes, que resume o tamanho instalado de um app como um único número de bytes, que é a soma do tamanho do APK, do tamanho dos arquivos extraídos do APK e dos arquivos gerados no dispositivo, como o código compilado antecipadamente (AOT). Esse número não é muito útil para entender como o app está usando o armazenamento.

O Android 15 adiciona a API StorageStats.getAppBytesByDataType([type]), que permite que você saiba como o app está usando todo esse espaço, incluindo divisões de arquivo APK, código relacionado ao AOT e à aceleração, metadados dex, bibliotecas e perfis guiados.

Criação de perfil gerenciada pelo app

O Android 15 inclui a classe ProfilingManager, que permite coletar informações de perfil do app, como despejos de heap, perfis de heap, amostragem de pilha e muito mais. Ele fornece um callback para o app com uma tag fornecida para identificar o arquivo de saída, que é enviado para o diretório de arquivos do app. A API faz a limitação de taxa para minimizar o impacto no desempenho.

Para simplificar a criação de solicitações de criação de perfil no seu app, recomendamos usar a API AndroidX Profiling correspondente, disponível no Core 1.15.0-rc01 ou mais recente.

Melhorias no banco de dados SQLite

Android 15 引入了 SQLite API,这些 API 可公开底层 SQLite 引擎的高级功能,以解决可能在应用中出现的特定性能问题。将 SQLite 更新到版本 3.44.3

开发者应参阅 SQLite 性能最佳实践 以便充分利用其 SQLite 数据库,尤其是在处理大型 或运行对延迟敏感的查询时

Atualizações do Android Dynamic Performance Framework

Android 15 继续投资于 Android 动态性能框架 (ADPF),这是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。在受支持的设备上,Android 15 添加了 ADPF 功能:

  • 针对提示会话的节能模式,用于指明其关联的线程应优先节能而非性能,非常适合长时间运行的后台工作负载。
  • 系统可以在提示会话中报告 GPU 和 CPU 工作时长,以便同时调整 CPU 和 GPU 频率,以最佳方式满足工作负载需求。
  • 热余量阈值,用于根据余量预测来解读可能的热节流状态。

如需详细了解如何在应用和游戏中使用 ADPF,请参阅相关文档

Privacidade

O Android 15 inclui vários recursos que ajudam os desenvolvedores de apps a proteger a privacidade dos usuários.

Detecção de gravação de tela

Android 15 增加了对应用的支持,以检测 正在录制。每当应用转换时,系统都会调用回调 在屏幕录制内容中处于可见与隐藏状态之间。如果正在记录注册进程的 UID 拥有的 activity,则系统会将应用视为可见。这样一来,如果您的应用执行敏感操作,您就可以告知用户正在录制他们的操作。

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

Recursos expandidos do IntentFilter

O Android 15 oferece suporte a uma resolução de Intent mais precisa usando UriRelativeFilterGroup, que contém um conjunto de objetos UriRelativeFilter que formam um conjunto de regras de correspondência de Intent que precisam ser satisfeitas, incluindo parâmetros de consulta de URL, fragmentos de URL e regras de bloqueio ou exclusão.

Essas regras podem ser definidas no arquivo XML AndroidManifest com a tag <uri-relative-filter-group>, que pode incluir uma tag android:allow. Essas tags podem conter tags <data> que usam atributos de tag de dados existentes, além dos atributos android:query e android:fragment.

Confira um exemplo da sintaxe AndroidManifest:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:host="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

Espaço privado

可通过解锁和锁定私密空间,在设备上显示或隐藏敏感应用。

借助私密空间,用户可以在设备上创建一个单独的空间,在额外的身份验证层保护下,防止敏感应用遭到窥探。私密空间使用单独的用户个人资料。用户可以选择使用设备锁定方式或为私密空间使用单独的锁定方式。

私密空间中的应用会显示在启动器的单独容器中,并且当私密空间处于锁定状态时,这些应用不会显示在“最近用过”视图、通知、“设置”和其他应用中。用户生成的内容和下载的内容(例如媒体内容或文件)以及账号在私密空间和主空间之间是分开的。在私密空间处于解锁状态时,您可以使用系统 Sharesheet照片选择器向应用授予对各个空间中内容的访问权限。

用户无法将现有应用及其数据移至私密空间。相反,用户可以在私密空间中选择安装选项,以便使用他们偏好的任意应用商店安装应用。私密空间中的应用会作为主空间中任何应用的单独副本进行安装(同一应用的新副本)。

当用户锁定私密空间时,系统会停止该个人资料。在个人资料停止运行时,私密空间中的应用将不再处于活动状态,无法执行前台或后台活动,包括显示通知。

我们建议您使用私密空间测试应用,以确保应用能按预期运行,尤其是当您的应用属于以下某一类别时:

Consultar a seleção de usuário mais recente para o acesso a fotos selecionadas

Agora os apps podem destacar apenas as fotos e os vídeos selecionados mais recentemente quando acesso parcial às permissões de mídia é concedido. Esse recurso pode melhorar a experiência do usuário em apps que solicitam acesso frequente a fotos e vídeos. Para usar esse recurso no app, ative o Argumento QUERY_ARG_LATEST_SELECTION_ONLY ao consultar MediaStore usando ContentResolver.

Kotlin

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Java

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

Sandbox de privacidade no Android

Android 15 包含最新的 Android 广告服务扩展,其中包含最新版本的 Privacy Sandbox on Android。我们一直致力于开发可更好地保护用户隐私,并为移动应用打造高效的个性化广告体验的技术,此次添加新功能就是其中的一项举措。我们的 Privacy Sandbox 页面详细介绍了 Privacy Sandbox on Android 开发者预览版和 Beta 版计划,可帮助您上手使用。

Conexão Saúde

Android 15 集成了与 Health Connect by Android 相关的最新扩展程序。Health Connect by Android 是一个安全的集中式平台,可用于管理和共享应用收集的健康与健身数据。此次更新 增加了对健身营养、体表温度、训练计划等。

体表温度追踪功能让用户可以更精确地存储和分享体表温度 来自穿戴式设备或其他跟踪设备的体温数据。

训练计划是一种结构化的锻炼计划,可帮助用户实现健身目标。训练计划支持各种完成和表现目标:

如需详细了解 Android 中 Health Connect 的最新更新,请参阅 利用 Android 打造自适应体验 健康演讲。

Compartilhamento de tela de app

Android 15 支持应用屏幕共享,因此用户可以仅共享或录制应用窗口,而不是整个设备屏幕。此功能首次在 Android 14 QPR2 中启用,包含 MediaProjection 回调,可让您的应用自定义应用屏幕共享体验。请注意,对于以 Android 14(API 级别 34)或更高版本为目标平台的应用,每个 MediaProjection 捕获会话都需要征得用户同意

Experiência do usuário e interface do sistema

O Android 15 oferece aos desenvolvedores de apps e usuários mais controle e flexibilidade para configurar o dispositivo de acordo com as necessidades.

Para saber mais sobre como usar as melhorias mais recentes do Android 15 para melhorar a experiência do usuário do seu app, assista à palestra Melhorar a experiência do usuário do seu app Android no Google I/O.

Prévia de widgets mais completa com a API Generated Previews

Antes do Android 15, a única maneira de fornecer visualizações do seletor de widgets era especificar um recurso de imagem ou layout estático. Essas visualizações geralmente são muito diferentes da aparência do widget real quando ele é colocado na tela inicial. Além disso, recursos estáticos não podem ser criados com o Jetpack Glance, então um Resumo o desenvolvedor teve que fazer uma captura de tela do widget ou criar um layout XML para ter um visualização do widget.

O Android 15 adiciona suporte a visualizações geradas. Isso significa que os provedores de widgets de apps podem gerar RemoteViews para usar como a visualização do seletor, em vez de um recurso estático.

Os apps podem fornecer visualizações remotas ao seletor de widgets para atualizar o conteúdo no seletor de forma que ele seja mais representativo do que o usuário vai ver.

API Push

Os apps podem fornecer visualizações geradas por uma API push. Os apps podem fornecer visualizações em qualquer ponto do ciclo de vida e não recebem uma solicitação explícita do host para fornecer visualizações. As prévias são mantidas em AppWidgetService, e os hosts podem solicitá-las sob demanda. O exemplo a seguir carrega um recurso de layout de widget XML e o define como a visualização:

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

O fluxo esperado é:

  1. A qualquer momento, o provedor de widgets chama setWidgetPreview. O As visualizações são mantidas em AppWidgetService com outras informações do provedor.
  2. O setWidgetPreview notifica os hosts de uma visualização atualizada pelo callback AppWidgetHost.onProvidersChanged. Em resposta, o widget host recarrega todas as informações do provedor.
  3. Ao mostrar uma visualização de widget, o host verifica AppWidgetProviderInfo.generatedPreviewCategories e, se a categoria escolhida estiver disponível, chama AppWidgetManager.getWidgetPreview para retornar a visualização salva para esse provedor.

Quando ligar para setWidgetPreview

Como não há callback para fornecer visualizações, os apps podem optar por enviar visualizações a qualquer momento durante a execução. A frequência de atualização da visualização depende do caso de uso do widget.

A lista a seguir descreve as duas principais categorias de casos de uso de visualização:

  • Provedores que mostram dados reais nas visualizações de widget, como informações personalizadas ou recentes. Esses provedores podem definir a visualização depois que o usuário faz login ou faz a configuração inicial no app. Depois disso, eles podem definir uma tarefa periódica para atualizar as visualizações na cadência escolhida. Exemplos desse tipo de widget podem ser um widget de fotos, de agenda, de clima ou de notícias.
  • Provedores que mostram informações estáticas em visualizações ou widgets de ação rápida que não exibem nenhum dado. Esses provedores podem definir as prévias uma vez, quando o app é iniciado pela primeira vez. Exemplos desse tipo de widget incluem um widget de ações rápidas do Drive ou um widget de atalhos do Chrome.

Alguns provedores podem mostrar visualizações estáticas no seletor de modo Hub, mas as informações no seletor da tela inicial. Esses provedores precisam seguir as orientações para definir as prévias nesses dois casos de uso.

Picture-in-picture

Android 15 引入了画中画 (PiP) 方面的变更,确保实现 更流畅的过渡效果。对于在主界面上叠加界面元素的应用,这将非常有用,因为这些界面元素会进入 PiP。

开发者使用 onPictureInPictureModeChanged 回调来定义逻辑 用于切换叠加界面元素的可见性。此回调是 在画中画进入或退出动画播放完毕时触发。距离开始还有 Android 15 中,PictureInPictureUiState 类包含另一种状态。

在此界面状态下,以 Android 15(API 级别 35)为目标平台的应用将遵守 使用以下参数调用 Activity#onPictureInPictureUiStateChanged 回调: isTransitioningToPip()。还有 在画中画模式下,有很多与应用无关的界面元素, 包含建议、 评分和标题当应用进入画中画模式时,请使用 onPictureInPictureUiStateChanged 回调以隐藏这些界面元素。当 应用从画中画窗口进入全屏模式,使用 onPictureInPictureModeChanged 回调以取消隐藏这些元素,如 请参阅以下示例:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

不相关界面元素的快速可见性切换(适用于画中画窗口)有助于 确保画中画播放动画更流畅、无闪烁。

Regras do modo "Não perturbe" aprimoradas

AutomaticZenRule 允许应用自定义注意力机制 管理(勿扰)规则,并确定何时启用或停用 。Android 15 极大地增强了这些规则,旨在提高 用户体验。其中包含以下增强功能:

  • AutomaticZenRule 添加类型,让系统能够应用特殊类型 对某些规则的处理
  • AutomaticZenRule 添加图标,使模式更加丰富 易于识别。
  • triggerDescription 字符串添加到 AutomaticZenRule,用于描述 规则应当对用户生效的条件。
  • 已添加 ZenDeviceEffects 更改为AutomaticZenRule,从而允许规则触发灰度等操作 显示、夜间模式或调暗壁纸。

Definir VibrationEffect para canais de notificação

O Android 15 oferece suporte à configuração de vibrações avançadas para notificações recebidas canal usando NotificationChannel.setVibrationEffect, então os usuários podem distinguir entre diferentes tipos de notificação sem sem olhar para o dispositivo.

Chip da barra de status de projeção de mídia e parada automática

媒体投放可能会泄露用户的私密信息。一个醒目的新状态栏条状标签可让用户了解任何正在进行的屏幕投影。用户可以点按该条状标签停止投屏、共享或录制屏幕。此外,为了提供更直观的用户体验,当设备屏幕锁定后,所有正在进行的屏幕投影都会自动停止。

Bloco da barra de status para compartilhamento de tela, transmissão e gravação.

Telas grandes e formatos

O Android 15 oferece aos seus apps o suporte necessário para aproveitar ao máximo os formatos do Android, incluindo telas grandes, dispositivos dobráveis e flip.

Mais facilidade para várias tarefas em telas grandes

O Android 15 oferece aos usuários maneiras melhores de realizar várias tarefas em dispositivos de tela grande. Por exemplo, os usuários podem salvar as combinações de apps favoritos na tela dividida para acesso rápido e fixar a barra de tarefas na tela para alternar rapidamente entre os apps. Isso significa que garantir que seu app seja adaptável é mais importante do que nunca.

O Google I/O tem sessões sobre Como criar versões adaptáveis para Android apps e Como criar uma interface com o Material Design 3 biblioteca adaptável isso pode ajudar, e nossa documentação tem mais informações para ajudar você a criar para projetos de telas.

Suporte à tela de capa

O app pode declarar uma propriedade que o Android 15 usa para permitir que o Application ou o Activity seja apresentado nas telas de cobertura pequenas de dispositivos dobráveis compatíveis. Essas telas são muito pequenas para serem consideradas como destinos compatíveis para execução de apps Android, mas seu app pode ativar o suporte a elas, tornando-o disponível em mais lugares.

Conectividade

O Android 15 atualiza a plataforma para dar ao seu app acesso aos avanços mais recentes em tecnologias de comunicação e sem fio.

Suporte a satélite

Android 15 继续扩大对卫星连接的平台支持,并包含一些界面元素,以确保在整个卫星连接环境中提供一致的用户体验。

应用可以使用 ServiceState.isUsingNonTerrestrialNetwork() 执行以下操作: 检测设备是否连接到卫星,让他们更清楚地了解 可能会导致完全网络服务不可用的原因此外,Android 15 支持短信和彩信应用以及预加载的 RCS 应用,以便使用卫星连接发送和接收消息。

当设备连接到卫星时,系统会显示通知。

Experiências de NFC mais fluidas

O Android 15 está trabalhando para tornar a experiência de pagamento por aproximação mais simples e confiável, além de continuar oferecendo suporte ao ecossistema robusto de apps NFC do Android. Em dispositivos com suporte, os apps podem solicitar que o NfcAdapter entre no modo de observação, em que o dispositivo detecta, mas não responde aos leitores NFC, enviando os PollingFrame objetos do serviço NFC do app para processamento. Os objetos PollingFrame podem ser usados para autenticação antes da primeira comunicação com o leitor NFC, permitindo uma transação com um toque em muitos casos.

Além disso, os apps podem registrar um filtro em dispositivos com suporte para ser notificados sobre a atividade do loop de polling, o que permite uma operação suave com vários aplicativos compatíveis com NFC.

Função da carteira

Android 15 引入了钱包角色,可与用户的首选钱包应用更紧密地集成。此角色会取代 NFC 默认的感应式付款设置。用户可以前往设置 > 应用 > 默认应用,管理钱包角色持有者。

在为在付款类别中注册的 AID 路由 NFC 感应式付款时,系统会使用钱包角色。点按操作始终会转到 Google 钱包角色持有者,除非有已注册相同 AID 的其他应用在前台运行。

此角色还用于确定“Google 钱包”快速访问功能块在启用后应显示在何处。将角色设为“无”时,“快速访问”功能块不可用,并且支付类别 NFC 点按仅传送到前台应用。

Segurança

O Android 15 ajuda você a melhorar a segurança do app, proteger os dados dele e dar aos usuários mais transparência e controle sobre os próprios dados. Confira a palestra Proteção da segurança do usuário no Android (em inglês) do Google I/O para saber mais sobre o que estamos fazendo para melhorar as proteções do usuário e proteger seu app contra novas ameaças.

Integrar o Gerenciador de credenciais ao preenchimento automático

从 Android 15 开始,开发者可以将用户名或密码字段等特定视图与 Credential Manager 请求相关联,从而更轻松地在登录过程中提供量身定制的用户体验。当用户聚焦于其中一个视图时,系统会向 Credential Manager 发送相应请求。系统会汇总来自各个提供商的凭据,并在自动填充后备界面(例如内嵌建议或下拉菜单建议)中显示这些凭据。Jetpack androidx.credentials 库是开发者首选的端点,很快将在 Android 15 及更高版本中推出,以进一步增强此功能。

Integrar o processo de login e inscrição com um único toque às solicitações biométricas

Credential Manager将生物识别提示集成到凭据创建过程中 和登录流程,这样提供商就无需管理 生物识别提示。因此,凭据提供程序只需专注于创建和获取流程的结果,并辅以生物识别流程结果。这一简化的流程创建了更高效、更精简的凭据 创建和检索过程。

Gerenciamento de chaves para criptografia de ponta a ponta

Estamos lançando o E2eeContactKeysManager no Android 15, que facilita a criptografia de ponta a ponta (E2EE, na sigla em inglês) nos seus apps Android, fornecendo uma API no nível do SO para o armazenamento de chaves públicas criptográficas.

O E2eeContactKeysManager foi projetado para se integrar ao app de contatos da plataforma e oferecer aos usuários uma maneira centralizada de gerenciar e verificar as chaves públicas dos contatos.

Verificações de permissão em URIs de conteúdo

O Android 15 introduz um conjunto de APIs que executam verificações de permissão em URIs de conteúdo:

Acessibilidade

O Android 15 adiciona recursos que melhoram a acessibilidade para os usuários.

Melhorias no braille

在 Android 15 中,我们让 TalkBack 能够支持通过 USB 和安全蓝牙使用 HID 标准的盲文显示屏。

此标准与鼠标和键盘使用的标准非常相似,将有助于 Android 随着时间的推移支持更多类型的盲文显示屏。

Internacionalização

O Android 15 adiciona recursos e funcionalidades que complementam a experiência do usuário quando um dispositivo é usado em diferentes idiomas.

Fonte variável CJK

A partir do Android 15, o arquivo de fonte para idiomas chinês, japonês e coreano (CJK), NotoSansCJK, agora é uma fonte variável. As fontes variáveis oferecem possibilidades de tipografia criativa em idiomas CJK. Os designers podem explorar uma gama mais ampla de estilos e criar layouts visualmente atraentes que antes eram difíceis ou impossíveis de alcançar.

Como a fonte variável para idiomas chinês, japonês e coreano (CJK) aparece com larguras de fonte diferentes.

Justificação entre caracteres

No Android 15 e versões mais recentes, o texto pode ser justificado usando o espaçamento entre letras usando JUSTIFICATION_MODE_INTER_CHARACTER. A justificação entre palavras foi introduzida pela primeira vez no Android 8.0 (nível 26 da API), e a justificação entre caracteres oferece recursos semelhantes para idiomas que usam o caractere de espaço em branco para segmentação, como chinês, japonês e outros.

Layout para texto em japonês usando JUSTIFICATION_MODE_NONE.
Layout para texto em inglês usando JUSTIFICATION_MODE_NONE.


Layout para texto em japonês usando JUSTIFICATION_MODE_INTER_WORD.
Layout para texto em inglês usando JUSTIFICATION_MODE_INTER_WORD.


Layout para texto em japonês usando JUSTIFICATION_MODE_INTER_CHARACTER.
Layout para texto em inglês usando JUSTIFICATION_MODE_INTER_CHARACTER.

Configuração automática de quebra de linha

O Android passou a oferecer suporte a quebras de linha baseadas em frases em japonês e coreano em Android 13 (nível 33 da API). No entanto, embora as quebras de linha baseadas em frase melhorem legibilidade de linhas de texto curtas, eles não funcionam bem para linhas de texto longas. No Android 15, os apps só podem aplicar quebras de linha baseadas em frases para linhas curtas de texto usando o método LINE_BREAK_WORD_STYLE_AUTO é a melhor opção. Essa opção seleciona a melhor opção de estilo de palavra para o texto.

Para linhas de texto curtas, são usadas quebras de linha baseadas em frases, funcionando da mesma como LINE_BREAK_WORD_STYLE_PHRASE, conforme mostrado no imagem a seguir:

Para linhas de texto curtas, LINE_BREAK_WORD_STYLE_AUTO aplica quebras de linha baseadas em frases para melhorar a legibilidade do texto. Isso é o mesmo que aplicar LINE_BREAK_WORD_STYLE_PHRASE.

Para linhas de texto mais longas, LINE_BREAK_WORD_STYLE_AUTO usa um "no" estilo de palavra com quebra de linha, funcionando da mesma forma LINE_BREAK_WORD_STYLE_NONE, conforme mostrado no imagem a seguir:

Para linhas de texto longas, LINE_BREAK_WORD_STYLE_AUTO não aplica estilo de palavra com quebra de linha para melhorar a legibilidade do texto. Isso é o mesmo que aplicar LINE_BREAK_WORD_STYLE_NONE.

Fonte Hentaigana japonesa adicional

在 Android 15 中,旧版日语平假名(也称为 Hentaigana)字体文件 捆绑在一起半形人物的独特形状可以增加 风格或设计独特的风格 传播和理解古代日本文件的能力。

日文半角字符和文本样式 字体。

VideoLAN 圆锥图标 版权所有 (c) 1996-2010 VideoLAN。任何人都可以使用此徽标或修改版徽标来提及 VideoLAN 项目或 VideoLAN 团队开发的任何产品,但这并不表示该项目对其表示认可。

Vulkan 和 Vulkan 徽标是 Khronos Group Inc.的注册商标。

OpenGL 是注册商标,OpenGL ES 徽标是 Hewlett Packard Enterprise 的商标,已获得 Khronos 的许可。