Android 13 新特性及適配指南

来源:https://www.cnblogs.com/xiaxveliang/archive/2022/10/24/16821788.html
-Advertisement-
Play Games

Android 13(API 33)於 2022年8月15日 正式發佈(發佈時間較往年早了一些),正式版Release源代碼也於當日被推送到AOSP Android開源項目。 截止到筆者撰寫這篇文章時,國內部分應用軟體開發廠商已逐步接到手機廠商(華米OV等)的新版本適配要求。當前,對於Android... ...


Android13 Logo

Android 13(API 33)2022年8月15日 正式發佈(發佈時間較往年早了一些),正式版Release源代碼也於當日被推送到AOSP Android開源項目。
GoogleSource Android13_r3 20220815
截止到筆者撰寫這篇文章時,國內部分應用軟體開發廠商已逐步接到手機廠商(華米OV等)的新版本適配要求。當前,對於Android應用開發者來說,Android 13 的軟體相容適配已需提上工作日程。

為了貼合這篇文章的標題,本篇文章結合Android Developer官方文檔,圍繞Android13適配點Android13新特性兩個方面進行詳細說明。

適配點:

  • 細分媒體許可權:
    READ_EXTERNAL_STORAGE 細分為IAMGES、VIDEO、AUDIO許可權
    若設置 targetSdk>=33 則此項必需適配!
  • WebView調整:
    廢棄setAppCacheEnabledsetForceDark方法;
    若設置 targetSdk>=33 則此項必需適配!
  • 靜態廣播註冊:
    註冊靜態廣播時,需設置對其他應用的可見性
    若設置 targetSdk>=33 則此項必需適配!
  • 通知許可權:
    新增運行時通知許可權:POST_NOTIFICATIONS
    若設置 targetSdk>=33 則此項必需適配!
  • Wi-Fi :
    新增 NEARBY_WIFI_DEVICES 運行時許可權
    若設置 targetSdk>=33 則此項必需適配!
  • 身體感測器後臺許可權:
    新增 BODY_SENSORS_BACKGROUND 運行時許可權
    若設置 targetSdk>=33 則此項必需適配!
  • 剪切板內容隱藏:
    新增內容隱藏API
    根據業務需求,選擇性適配!
  • 非 SDK 介面的限制
    若設置 targetSdk>=33 則此項必需適配!

新特性:

  • 前臺服務管理器:
    系統新增前臺服務管理器
    系統新特性無需適配!

一、細分媒體許可權

從Android 13開始,以Android13(API 33+)為目標平臺的應用,系統新增運行時許可權READ_MEDIA_IAMGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO 替代原有的READ_EXTERNAL_STORAGE許可權。

許可權 許可權說明
READ_MEDIA_IAMGES 圖片許可權
READ_MEDIA_VIDEO 視頻許可權
READ_MEDIA_AUDIO 音頻許可權

新增細分的媒體許可權說明

當應用升級到targetSdk>=33時:

  • 已授權READ_EXTERNAL_STORAGE許可權的應用:系統將自動賦予對應的細化許可權。
  • 未授權仍請求READ_EXTERNAL_STORAGE許可權:親測系統將不會授予任何許可權。

細分媒體許可權動態申請彈窗樣式:

  • 如果同時請求 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 許可權,系統將會提示如下許可權彈窗:
    READ_MEDIA_IMAGES、READ_MEDIA_VIDEO許可權彈窗
  • 如果請求 READ_MEDIA_AUDIO 許可權,系統將提示如下彈窗:
    READ_MEDIA_AUDIO許可權申請彈窗

官方參考:
Android Developer 細分媒體許可權:
https://developer.android.google.cn/about/versions/13/behavior-changes-13

二、WebView

從Android 13開始,以Android13(API 33+)為目標平臺的應用,WebView存在以下方法與API調整:

  • WebSettings.setAppCacheEnabled() 方法廢棄
  • WebSettings.setForceDark() 方法廢棄

2.1 setAppCacheEnabled 廢棄

WebView 95+版本不再支持 setAppCacheEnabled
WebSettings.setAppCacheEnabled()方法廢棄

Chrome 85+版本不再支持AppCache
Chrome 85+版本不再支持AppCache

2.2 setForceDark 廢棄

從Android 13開始以Android13(API 33+)為目標平臺的應用,系統會根據應用的主題屬性isLightTheme,自動設置WebView的淺色或深色主題樣式(系統會根據 isLightTheme 來設置 prefers-color-scheme)。同時,開發者Webview設置主題樣式相關API WebSettings.setForceDark() 方法將被廢棄。
基於以上更改:

  • 若開發者仍需自定義Webview主題顏色,可以使用:
    WebSettings.setAlgorithmicDarkeningAllowed()WebSettingsCompat.setAlgorithmicDarkeningAllowed()方法。
  • 若開發者仍然使用WebSettings.setForceDark()系統將提示錯誤:
W/cr_WebSettings: setForceDark() is a no-op in an app with targetSdkVersion>=T

官方參考:
Android Developer 靜態廣播註冊官方介紹:
https://developer.android.google.cn/about/versions/13/behavior-changes-13

三、靜態廣播註冊

從Android 13開始,以Android13(API 33+)為目標平臺的應用,註冊靜態廣播時,需設置對其他應用的可見性

  • 若對其他應用可見,廣播註冊時設置:Context.RECEIVER_EXPORTED
  • 若僅應用內使用,廣播註冊時設置:Context.RECEIVER_NOT_EXPORTED
private void registerTestReceiver() {
    IntentFilter filter = new IntentFilter();
    filter.addAction("com.xiaxl.test.action");
    // api >= 33
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        // 跨應用間使用
        MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
        // 應用內使用
        //MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
    }
    // api <= 32
    else {
        MainActivity.this.registerReceiver(mTestReceiver, filter);
    }
}

官方參考:
Android Developer 靜態廣播註冊官方介紹:
https://developer.android.google.cn/about/versions/13/features#java

四、通知許可權

Android 13 引入了一種新的運行時通知許可權:POST_NOTIFICATIONS
POST_NOTIFICATIONS 許可權級別被定義為dangerous 開發者使用該許可權時需動態申請,等待用戶主動授權:
通知運行時許可權

  • 對於以Android13(API 33+)為目標平臺的應用
    在顯示Android通知欄時,一方面需要在AndroidManifest中聲明 android.permission.POST_NOTIFICATION,另一方面代碼中需動態申請該通知欄許可權。
<!-- AndroidManifest許可權聲明 -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiaxl.test">
	
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
</manifest>


// Java代碼動態申請POST_NOTIFICATIONS許可權
if (Build.VERSION.SDK_INT >= 33) {
    int checkPermission =
            ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.POST_NOTIFICATIONS);
    if (checkPermission != PackageManager.PERMISSION_GRANTED) {
        //動態申請
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{
                Manifest.permission.POST_NOTIFICATIONS}, PERMISSION_REQUEST_CODE);
    } else {
        //showRecordNotification();
    }
} else {
    //showRecordNotification();
}

POST_NOTIFICATIONS 動態授權申請彈窗如下圖所示:
POST_NOTIFICATIONS動態授權彈窗

  • 對於以Android12(API 32-)為目標平臺的應用
    對於以API 32-為目標平臺的應用,運行在Android13及以上設備中時,當應用第一次顯示通知時,系統會自動彈出以下提示框,要求用戶動態授權

以Android12(API 32-)為目標平臺的應用,首次顯示通知時,彈窗提醒

官方參考:
Android Developer 通知運行時許可權官方介紹:
https://developer.android.google.cn/guide/topics/ui/notifiers/notification-permission

五、Wi-Fi 許可權

從Android 13開始,Android系統新增了NEARBY_WIFI_DEVICES許可權,將原有的ACCESS_FINE_LOCATION許可權 與 Wi-Fi能力使用進行了區分(避免早先開發者使用Wi-Fi能力時,需要請求用戶位置許可權,從而引起用戶的歧義)。

NEARBY_WIFI_DEVICES許可權

從Android 13開始,開發者只要不通過Wi-Fi推導用戶的物理位置將無需再請求 ACCESS_FINE_LOCATION 許可權,同時官方總結了新增許可權NEARBY_WIFI_DEVICES的如下使用場景:

NEARBY_WIFI_DEVICES許可權使用場景

官方參考:
Android Developer NEARBY_WIFI_DEVICES:
https://developer.android.google.cn/reference/android/Manifest.permission#NEARBY_WIFI_DEVICES

六、剪切板內容隱藏

從Android 13(API 33)開始,Android剪切板新增了一項新API
Android 13(API 33)開始,用戶可以選擇使用API PersistableBundle#(ClipDescription.EXTRA_IS_SENSITIVE, true)隱藏要複製到剪切板的用戶賬戶、密碼登敏感信息。

相關API使用舉例如下:

private void addData2Clipboard() {
    ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clipData = ClipData.newPlainText("111111", "我是密碼");
    ClipDescription description = clipData.getDescription();
    // 隱私內容:剪切板加密
    PersistableBundle persistableBundle = new PersistableBundle();
    if (Build.VERSION.SDK_INT >= 33) {
        persistableBundle.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
    } else {
        persistableBundle.putBoolean("android.content.extra.IS_SENSITIVE", true);
    }
    description.setExtras(persistableBundle);
    // 剪切板添加加密內容
    clipboardManager.setPrimaryClip(clipData);
}

不使用新API使用新API隱藏敏感信息,剪切板前後對比如下所示:

剪切板內容隱藏API使用效果

七、身體感測器後臺許可權

從Android 13開始,以Android13(API 33+)為目標平臺的應用,在後臺訪問身體感測器(例如心率、體溫和血氧飽和度)時,除了需要請求現有的 BODY_SENSORS 許可權外,還需要請求 BODY_SENSORS_BACKGROUND 許可權。

身體感測器後臺許可權

官方參考:
Android Developer BODY_SENSORS_BACKGROUND:
https://developer.android.google.cn/reference/android/Manifest.permission#BODY_SENSORS_BACKGROUND

八、非 SDK 介面限制

官方從 Android 9(API 級別 28)開始,逐步開始對應用使用的非 SDK 介面實施了限制。
如果你的APP通過引用非 SDK 介面或嘗試使用反射或 JNI 來獲取句柄,這些限制就會起作用。官方給出的解釋是為了提升用戶體驗、降低應用崩潰風險

8.1、非SDK介面檢測工具

官方給出了一個檢測工具,下載地址:veridex
https://android.googlesource.com/platform/prebuilts/runtime/+archive/master/appcompat.tar.gz

veridex使用方法:

appcompat.sh --dex-file=apk.apk

veridex檢測截圖

8.2、blacklist、greylist、greylist-max-o、greylist-max-p含義

以上截圖中,blacklist、greylist、greylist-max-o、greylist-max-p含義如下:

  • blacklist 黑名單:禁止使用的非SDK介面,運行時直接Crash(因此必須解決)
  • greylist 灰名單:即當前版本仍能使用的非SDK介面,但在下一版本中可能變成被限制的非SDK介面
  • greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被禁止使用的非SDK介面
  • greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被禁止使用的非SDK介面

官方參考:
Android Developer 非SDK介面限制:
https://developer.android.google.cn/guide/app-compatibility/restrictions-non-sdk-interfaces#test-for-non-sdk

九、前臺服務管理器

從Android 13(API 33)開始,Android通知欄中新增了一項新特性
用戶可以選擇在通知欄中通過“前臺服務管理器”,對“正在運行的前臺服務”進行停止操作。

前臺服務管理器

參考

Android Developer:Andoid13
https://developer.android.google.cn/about/versions/13

AOSP:Android13版本說明
https://source.android.google.cn/docs/setup/start/android-13-release

GoogleSource:Android13_r3
https://android.googlesource.com/platform/build/+/refs/tags/android-13.0.0_r4

= THE END =

文章首發於公眾號”CODING技術小館“,如果文章對您有幫助,歡迎關註我的公眾號。
歡迎關註我的公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 🏆 課程學習中心 | 🚧 電腦基礎課程合輯 | 🌍 課程主頁 | 📺 中英字幕視頻 | 🚀 項目代碼解析 課程介紹 CMU 15-721 是 CMU 卡內基梅隆大學開放的資料庫方向進階課程,討論了很多資料庫方向新的技術研究方向與話題,適合有資料庫基礎又想在該方向有深入研究的同學學習。 課 ...
  • 資料庫方向的專業課程,詳盡介紹了資料庫的基本知識、底層原理、效率優化、查詢優化、新資料庫等,是資料庫管理系統設計與實施方向的權威好課。 ...
  • 目前ClickHouse的表引擎主要有下麵四個系列,合併樹家族、日誌引擎系列、集成的表引擎和其他特殊的引擎。 #合併樹家族 Clickhouse中最強大的表引擎當屬MergeTree(合併樹)引擎及該系列(MergeTree)中的其他引擎。 MergeTree系列的引擎被設計用於插入極大量的數據到一 ...
  • 萬事開頭難,搭建好一套學習、開發PostgreSQL的環境,是重中之重。 因為其他平臺(Ubuntu, CentOS, MAC)的用戶大多數都具備了自行安裝資料庫的能力,在這裡我只寫一個面向Windows用戶的學習環境搭建文檔。 分為三個部分,用戶可以自由選擇。 如果你想深入的學習Postgr... ...
  • redis-cluster是一個高可用,可分片的分散式redis集群解決方案,建議使用springboot2.3及以上版本的腳手架,如果是<2.3版本,你需要手動添加LettuceConnectionFactory來實現因為伺服器宕機引起的節點感應功能;如果沒有添加動態感應,那你的redis-clu ...
  • 上一次使用 MySQL 大概是3年前了,菜鳥依舊是菜鳥😑 最近打算重新學一下,記些筆記督促自己 一、安裝 我的 mac 版本是 10.14.6,到官網找到對應版本的 MySQL 安裝過程比較簡單,一路下一步就行。 如果提示你“無法驗證開發者信息”之類的,到“系統偏好設置”-“安全性與隱私”-“通用 ...
  • 摘要:我是管理員賬號,怎麼還沒有許可權?當小伙伴詢問的時候,我第一時間就會想到都是用戶同名Schema惹的禍 本文分享自華為雲社區《你應該知道的數倉安全——都是同名Schema惹的禍》,作者: zhangkunhn 。 典型場景 經常遇到小伙伴問到: 我是管理員賬號,怎麼還沒有許可權? 管理員給我賦權了 ...
  • 使用SDLocalize高效完成iOS本地化國際化工作 SDLocalize 該方案最大特點是對舊代碼幾乎沒有較多修改就可以完成從單語言項目修改為多語言的項目。並支持XIB的控制項本地化,無需創建不同語言版本的XIB文件。 SDLocalize的工作原理: 首先標記一組需要本地化的控制項 然後在恰當時機 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...