The following code works on Android 10, but fails on Android 11. Specifically listFiles() returns null. The path does look weird, but it seems to work for other tasks rather than listing files in a dir.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initialize a list of required permissions to request runtime
val list = listOf<String>(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.MANAGE_EXTERNAL_STORAGE
)
ActivityCompat.requestPermissions(this, list.toTypedArray(), 123)
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.setFlags(FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
intent.addFlags(FLAG_GRANT_WRITE_URI_PERMISSION)
startActivityForResult(intent, REQUEST_DOCUMENT_TREE)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_DOCUMENT_TREE) {
if (resultCode == RESULT_OK && data != null) {
data.data?.let { uri ->
val docId = DocumentsContract.getTreeDocumentId(uri)
val dirUri = DocumentsContract.buildDocumentUriUsingTree(uri, docId)
val path = DocumentsContract.findDocumentPath(getContentResolver(), dirUri)?.path
path?.let {
val files = File(path[0].replaceFirst("raw:", "", true))
val ret = files.listFiles()
Log.d("OUR_LOG", "ret is ${ret}")
}
}
}
}
}
}
In manifest I added
...
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<application
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true"
android:allowBackup="true"
...
How to list files from dirUri on Android 11?
Thank you in advance!