Не удаётся найти файл, пользуясь системной программой
Я хотел сделать возможность выбора любого файла, который можно открыть как текст, пользователем. Для этого я не стал делать своё подобие проводника и использовал готовые функции андроида. Но, все пошло ни так хорошо, как я хотел.
Поля, к которым я обращаюсь в методах, упомянутых ниже:
private var currentFileName: String? = null
private var currentFilePath: String? = null
private val REQUEST_ACTION_GET_CONTENT_CODE = 11
private val REQUEST_PERMISSIONS_CODE = 426
private val WRITE_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE
private val READ_PERMISSION = Manifest.permission.READ_EXTERNAL_STORAGE
private val PERMISSION_GRANTED = PackageManager.PERMISSION_GRANTED
Метод, в котором я подготавливаю активность для выбора файла пользователем:
open fun openFileChooser() {
if(hasPermissions()) {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "*/*"
startActivityForResult(Intent.createChooser(intent, ""), REQUEST_ACTION_GET_CONTENT_CODE)
} else {
ActivityCompat.requestPermissions(this, arrayOf(WRITE_PERMISSION, READ_PERMISSION), REQUEST_PERMISSIONS_CODE)
}
}
Метод, обрабатывающий выбор пользователя:
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
if(resultCode == RESULT_OK) {
val data = intent?.data
currentFileName = data?.lastPathSegment
currentFilePath = data?.path
val file = File(currentFilePath!!)
println("Выбран файл \"$currentFileName\" в директории \"$currentFilePath\"")
println("Его содержимое: ${file.readText()}")
}
super.onActivityResult(requestCode, resultCode, intent)
}
Запустив код на эмуляторе, в лог вышло следующее сообщение (одно, во втором как раз ошибка, в методе readText)
I/System.out: Выбран файл "file.txt" в директории "/storage_root/file.txt"
Первый раз я запускал на настоящем устройстве с операционной системой MIUI, там путь к файлу был, конечно, совсем другим, как и само имя файла.
Вся проблема в том, что я не могу найти файл по получаемому пути, ошибка:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: kotoffeyapp.example.simpletexteditor, PID: 3631
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=11, result=-1, data=Intent { act=android.intent.action.SEND dat=content://com.amaze.filemanager.FILE_PROVIDER/storage_root/file.txt typ=txt flg=0x1 }} to activity {kotoffeyapp.example.simpletexteditor/kotoffeyapp.example.simpletexteditor.MainActivity}: java.io.FileNotFoundException: /storage_root/file.txt (No such file or directory)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4092)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4135)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1536)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6198)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)
Caused by: java.io.FileNotFoundException: /storage_root/file.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at kotlin.io.FilesKt__FileReadWriteKt.readText(FileReadWrite.kt:125)
at kotlin.io.FilesKt__FileReadWriteKt.readText$default(FileReadWrite.kt:125)
at kotoffeyapp.example.simpletexteditor.utilities.FileHelper.onActivityResult(FileHelper.kt:39)
at android.app.Activity.dispatchActivityResult(Activity.java:6945)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4088)
У приложения есть разрешения на чтение и запись внешнего хранилища, проверял в настройках. Как мне по этому пути находить файл, что я делаю ни так?