簡體   English   中英

Android R – 使用范圍存儲 (MediaStore.Downloads) 在下載文件夾中創建一個文本文件

[英]Android R – Create a text file in Download folder using Scoped storage (MediaStore.Downloads)

我的應用程序需要在下載文件夾中的文本文件中保存一個字符串。 目前(目標:API 29(Q)我正在使用 FILE API 與:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"

但是對於 API 30 (R),如果我理解得很好,我必須將其遷移到范圍存儲 (MediaStore.Downloads)。

在這里,我有點迷路了。 我找不到好的文檔或片段來說明如何在下載中創建文本文件。 如果有人可以解釋或展示如何做到這一點,我會很感激?

剛剛在AndrioidManifest.xml中使用上述設置進行了測試:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"

授予這些權限並在運行 API 30 (R) 的模擬器上,我能夠使用以下簡單代碼寫入/讀取/更新文本文件:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    
    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        val f = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "new_file.txt")
        f.appendText("test ${Instant.now().toEpochMilli()}\n")

        f.readLines().forEach { line -> Log.e("LOG", line)}
    }
}

這篇文章: https://stackoverflow.com/a/64192581/4252352建議如果您創建了文件,您將能夠使用文件 api 訪問它。注意: Environment.getExternalStoragePublicDirectory已被棄用,但似乎甚至可以工作Android 11 如果您是文件的所有者。

只是為了好玩,我在目標版本和編譯版本 29/30 之間進行了交換,以查看在針對不同的 sdk 並在同一模擬器上重新安裝同一應用程序時是否會出現任何問題。 它工作正常,無論如何我都可以完全訪問同一個文件。

老實說,整件事有點混亂——CommonsWare https://commonsware.com/blog/2019/12/21/scoped-storage-stories-storing-mediastore.html的這篇文章值得一讀因為它涉及現在在 Android 11 中強制執行的許多事情,盡管它主要談論 Android 10。

文檔似乎在許多不同的地方被與存儲/范圍存儲等相關的部分分散在一起。 此表格鏈接為根據初始用例篩選文檔提供了良好的啟動平台: https://developer.android.com/training/data-storage

我還附上了文件管理器中出現的文件的屏幕截圖:

文件管理器

PS:這里是可怕的一次性代碼——I/O 在主線程等上工作。僅用於說明目的。

基於評論“R.= 30”:我對“R”和 Api“30”的用法基於 AndroidStudio IDE:

安卓版本

(R = 運行時環境,Api 30 = sdk 運行時)

如果我誤解了某些東西,或者在某種程度上語義上不正確,很高興進行編輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM