簡體   English   中英

將文件寫入下載文件夾(Android 11 SDK 30)

[英]Writing A File to Download Folder (Android 11 SDK 30)

我正在使用 Android 11 和 Kotlin 開發應用程序。 我已成功將文件寫入設備上的下載文件夾。 當使用相同的文件名再次寫入文件夾時,結果是另一個具有相同名稱的文件。 所以現在我有兩個同名的文件。

在此處輸入圖片說明

所以首先我想我只是刪除文件然后再寫一次。 我花了幾個小時來嘗試,但無濟於事。 刪除代碼將無一例外地執行,但文件永遠不會刪除。 我很確定我通過使用設置了正確的權限

  if (!isWriteExternalStoragePermissionGranted()) {
            val permissions = arrayOf(WRITE_EXTERNAL_STORAGE)
            for (i in permissions.indices) {
                requestPermission(permissions[i], i)
            }
        }


 private fun isWriteExternalStoragePermissionGranted(): Boolean {
        val permissionCheck = ActivityCompat.checkSelfPermission(this,  WRITE_EXTERNAL_STORAGE)
        return permissionCheck == PackageManager.PERMISSION_GRANTED
    }

然后我想我會截斷文件的內容並覆蓋文件內容。 那沒有用。 只是一次又一次的另一個文件副本。 我已經花了一整天的時間來解決這個問題。 真的不應該這么難。 我已經嘗試了很多例子......沒有任何效果。 這是我編寫文件的代碼...

 fun writeToFile(applicationContext: Context, filename: String, data: String) {

    try {
        val resolver = applicationContext.contentResolver
        val values = ContentValues()
        values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
        values.put(MediaStore.MediaColumns.MIME_TYPE, "text/xml")
        values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
        val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values)

        //val cr: ContentResolver = getContentResolver()
        val os: OutputStream? = uri?.let { resolver.openOutputStream(it,"wt") }

        if (os != null) {
            os.write(data.toByteArray())
            os.flush()
            os.close()
        }
        /*
        if (uri != null) {
            resolver.openFileDescriptor(uri, "wt")?.use {
                FileOutputStream(it.fileDescriptor).use {
                     it.write(data.toByteArray()
                    )
                }
            }
        }
        */

        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
}

這是我的代碼,首先刪除從不工作的文件。 我嘗試了多種變體...

fun deleteFile(context: Context, filename: String, applicationContext: Context){

    val myFile = File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), filename)
    if (myFile.exists()) {
        myFile.delete()
    }
}


fun deleteFile(context: Context, filename: String, applicationContext: Context){

    val resolver = applicationContext.contentResolver
    val values = ContentValues()
    values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
    values.put(MediaStore.MediaColumns.MIME_TYPE, "text/xml")
    values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
    val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values)

    if (uri != null) {
        resolver.delete(uri, null, null)
    }

}

您應該使用在創建文件的第一個 insert() 中獲得的 uri。

暫無
暫無

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

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