日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

uniapp在Android 10對公共目錄的非媒體文件讀取上傳失敗問題

作者:景影隨形 更新時間: 2023-10-14 編程語言

本文覆蓋的問題場景:

  • uniapp的文件IO接口報“targetSdkVersion設置>=29后在Android10+系統設備不支持當前路徑。請更改為應用運行路徑!具體請看…”錯誤
  • uni.uploadFile接口上傳圖片視頻正常,上傳pdf,doc等非媒體文件報400,但無明確錯誤原因。
  • Android 10及以上,使用uni或plus讀取公共目錄文件報錯。(或Android 11及以上正常,Android 10報錯)

關于外部存儲讀寫

我們知道Android開發中關于存儲主要分兩大部分:內部存儲和外部存儲。
內部存儲是給每個應用自動授權的一個僅供此應用自身讀寫的目錄,無需申請。
外部存儲則包括了:本應用外部存儲目錄、其他應用外部存儲目錄、公共目錄媒體文件、公共目錄非媒體文件四類。

在最初的Android開發中,應用可以隨意讀取上面的四類文件。

從Android 4.4(API 19)開始,默認授予本應用外部存儲目錄訪問權限,無需申請;但如果需要訪問公共目錄的媒體文件或非媒體文件,必須申請外部存儲的讀取權限。(其他應用外部存儲目錄是申請任何權限也無法訪問的)

出于安全考慮,從Android 10開始,對外部存儲的讀取權限進行了限制,默認只能訪問:公共目錄媒體文件

但為了方便過度,在Android 10和Android 11下,如果應用在AndroidManifest.xml注冊了android:requestLegacyExternalStorage="true"的話,應用可以暫時停用分區存儲,繼續上面除了其他應用外部存儲目錄外的其他三類文件。(如果目標版本是Android 11+,則在Android 11+上這個屬性不生效。)

從Android 11開始,新增了【管理所有文件】(也叫:所有文件訪問權限)權限,如果應用申請了這個權限,可以訪問本應用外部存儲目錄、公共目錄媒體文件、公共目錄非媒體文件三類文件。多了一個公共目錄非媒體文件的訪問。
但這個權限授予條件比較苛刻,建議如果選擇單個文件的話,盡量使用存儲訪問框架

Uniapp中對外部存儲的訪問

主要可以參考適配Android10+設備注意事項。
uniapp中訪問文件相關的包括plus.iouni.getFileInfouni.uploadFile等一些API。
uniapp為了適配Android 10+,針對外部存儲的訪問,默認也是只能訪問本應用外部存儲目錄、公共目錄媒體文件
針對Android 11+,如果應用有管理所有文件權限的話,也可以訪問公共目錄非媒體文件,就是有三類權限。
但uniapp沒有兼容android:requestLegacyExternalStorage,所以即使添加了這個標簽,在Android 10上面,uniapp的文件API依然無法訪問公共目錄非媒體權限。

針對公共目錄非媒體文件的訪問:

版本 管理所有文件 原生APP開發 uniapp開發
Android 10 可讀 不可讀
Android 11 可申請 可讀 申請后可讀
Android 12 可申請 申請后可讀 申請后可讀

公共目錄非媒體文件訪問實踐

針對Android 11及以上的設備,有兩種方法:

  • 申請管理所有文件權限,原生開發和uniapp都可以訪問
  • 通過存儲訪問框架選擇文件,未測試

針對Android 10,也有兩種方法:

  • 添加android:requestLegacyExternalStorage,原生開發可訪問,uniapp開發依然不可訪問。(可將對文件的操作讀取上傳等轉移到原生邏輯實現,或者可通過原生插件將文件復制到本應用外部存儲私有目錄下,uniapp即可訪問文件副本)
  • 通過存儲訪問框架選擇文件,未測試

注意

上面總結的內容可能部分有誤,如果發現請評論告知更新~

原文鏈接:https://blog.csdn.net/anjingshen/article/details/124823595

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新