如何解决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
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 举报,一经查实,本站将立刻删除。