Android 11 (R) 的 Uri 为空

问题描述

我想用文本文件创建子目录(自定义文件夹)并在其中写入字符串数据。和 Android 11 一样有限制,所以我做了这个代码

private val filepath = "mysubdirectory"
private val filename = "test.txt"

private fun writeExternalStorage(list: MutableList<String>) {
    if (VERSION.SDK_INT >= VERSION_CODES.Q) {
        val resolver = contentResolver
        val values = ContentValues()
        values.put(MediaStore.MediaColumns.disPLAY_NAME,filename)
        values.put(MediaStore.MediaColumns.MIME_TYPE,"text/plain")
        values.put(
            MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY_DOCUMENTS + "/" + filepath
        )
        val uri = resolver.insert(MediaStore.Files.getContentUri("external"),values)
        Log.v("MYATGAGAA",uri!!.toString())
        val file = FileUtil.from(this,uri!!) as File
        Log.v("MYATGAGAA",file.absolutePath)
        try {
            file.parentFile.mkdirs()
            file.bufferedWriter().use { out ->
                for (item in list) {
                    Log.v("MYATGAGAA",item)
                    out.write(item)
                }
            }

        } catch (e: IOException) {
            Toast.makeText(this,"Error Q",Toast.LENGTH_LONG).show()
            return

        }
        Toast.makeText(this,"Saved for Q",Toast.LENGTH_LONG).show()


      }

但是我在这null

得到了 uri Log.v("MYATGAGAA",uri!!.toString())

我已在下方授予存储权限:

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

对于 Android R 台设备,我已手动检查

if (SDK_INT >= Build.VERSION_CODES.R) {
        try {
            val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
            intent.addCategory("android.intent.category.DEFAULT")
            intent.data =
                Uri.parse(String.format("package:%s",applicationContext.packageName))
            startActivityForResult(intent,2296)
        } catch (e: Exception) {
            val intent = Intent()
            intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
            startActivityForResult(intent,2296)
        }
    }

这是我的 FileUtil 类。

class FileUtil {

companion object {

    private const val EOF = -1
    private const val DEFAULT_BUFFER_SIZE = 1024 * 4

    @Throws(IOException::class)
    fun from(context: Context,uri: Uri): File? {
        val inputStream: InputStream = context.contentResolver.openInputStream(uri)!!
        val fileName = getFileName(context,uri)
        val splitName = splitFileName(fileName)
        var tempFile: File = File.createTempFile(splitName[0],splitName[1])
        tempFile = rename(tempFile,fileName)
        tempFile.deleteOnExit()
        var out: FileOutputStream? = null
        try {
            out = FileOutputStream(tempFile)
        } catch (e: FileNotFoundException) {
            e.printstacktrace()
        }
        if (inputStream != null) {
            copy(inputStream,out!!)
            inputStream.close()
        }
        out?.close()
        return tempFile
    }

    private fun splitFileName(fileName: String): Array<String> {
        var name = fileName
        var extension = ""
        val i = fileName.lastIndexOf(".")
        if (i != -1) {
            name = fileName.substring(0,i)
            extension = fileName.substring(i)
        }
        return arrayOf(name,extension)
    }

    private fun getFileName(context: Context,uri: Uri): String {
        var result: String? = null
        if (uri.scheme.equals("content")) {
            val cursor: Cursor = context.contentResolver.query(uri,null,null)!!
            try {
                if (cursor != null && cursor.movetoFirst()) {
                    result =
                        cursor.getString(cursor.getColumnIndex(OpenableColumns.disPLAY_NAME))
                }
            } catch (e: Exception) {
                e.printstacktrace()
            } finally {
                if (cursor != null) {
                    cursor.close()
                }
            }
        }
        if (result == null) {
            result = uri.path
            val cut: Int = result!!.lastIndexOf(File.separator)
            if (cut != -1) {
                result = result.substring(cut + 1)
            }
        }
        return result
    }

    private fun rename(file: File,newName: String): File {
        val newFile = File(file.parent,newName)
        if (newFile != file) {
            if (newFile.exists() && newFile.delete()) {
                Log.d("FileUtil","Delete old $newName file")
            }
            if (file.renameto(newFile)) {
                Log.d("FileUtil","Rename file to $newName")
            }
        }
        return newFile
    }

    @Throws(IOException::class)
    private fun copy(input: InputStream,output: OutputStream): Long {
        var count: Long = 0
        var n: Int
        val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
        while (EOF != input.read(buffer).also { n = it }) {
            output.write(buffer,n)
            count += n.toLong()
        }
        return count
    }
}
}

仍然出错。所以请帮我解决这个问题。提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)