在Android 11中,Scoped Storage(作用域存储)是默认的存储访问方式,它对应用程序的文件和目录的访问权限进行了更加严格的限制。下面是一种解决方法,展示了如何在Android 11上使用Scoped Storage。
android {
// ...
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
// ...
targetSdkVersion 30
// ...
}
// ...
}
dependencies {
// ...
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.core:core-ktx:1.6.0'
// ...
}
创建一个新的Activity,并在布局文件中添加一个按钮,用于触发文件读写操作。
在Activity中添加以下代码示例,以进行文件读写操作:
import android.Manifest
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
class MainActivity : AppCompatActivity() {
private val REQUEST_PERMISSION_CODE = 101
private val FILE_NAME = "example.txt"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 检查存储权限
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
REQUEST_PERMISSION_CODE
)
}
// 按钮点击事件
button.setOnClickListener {
writeFile()
readFile()
}
}
// 写入文件
private fun writeFile() {
try {
val file = File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), FILE_NAME)
val fileOutputStream = FileOutputStream(file)
fileOutputStream.write("Hello, Scoped Storage!".toByteArray())
fileOutputStream.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
// 读取文件
private fun readFile() {
try {
val file = File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), FILE_NAME)
val fileInputStream = FileInputStream(file)
val data = ByteArray(file.length().toInt())
fileInputStream.read(data)
fileInputStream.close()
textView.text = String(data)
} catch (e: Exception) {
e.printStackTrace()
}
}
// 权限请求结果回调
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予,执行相应操作
}
}
}
}
这个示例代码演示了如何在Android 11上使用Scoped Storage进行文件读写操作。当用户点击按钮时,它会将字符串写入文件并读取文件内容,并将内容显示在TextView中。在应用程序启动时,它将检查存储权限并请求用户授权。请确保在运行应用程序之前将权限授予应用程序。