Привет всем!
Делаю приложение, в котором есть модуль с выбором файла из галереи (да и вообще, любого файла с устройства).
Выбор происходит успешно. Но потом, когда я хочу получить доступ к этому файлу, то начинаются проблемы - андроиду не нравится путь, по которому я обращаюсь к этому файлу.
Вроде бы всё просто должно быть, но я запутался с этими долбанными путями.
compileSdkVersion 28
minSdkVersion 15
targetSdkVersion 28
Код:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
FILE_SELECT_CODE ->
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
var uri = data?.data
Log.d(javaClass.simpleName, "File Uri: " + uri.toString()) // => File Uri: content://com.android.providers.media.documents/document/image%3A213701
var fileInputStream1 = FileInputStream(File("/sdcard/MyApp/my_file.jpg")) //если задать путь так, то всё работает
Log.d(javaClass.simpleName, "fileInputStream1: $fileInputStream1") // => fileInputStream1: java.io.FileInputStream@ab7a92a
var fileInputStream2 = FileInputStream(File(uri?.path)) // <- в этой строке падает
Log.d(javaClass.simpleName, "fileInputStream2: $fileInputStream2")
}
}
super.onActivityResult(requestCode, resultCode, data)
}
Лог с падением:
File Uri: content://com.android.providers.media.documents/document/image%3A213701
fileInputStream1: java.io.FileInputStream@ab7a92a
27101-27101/com.my_app.android E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my_app.android, PID: 27101
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:213701 flg=0x1 }} to activity {com.my_app.android/com.my_app.android.ChatActivity}: java.io.FileNotFoundException: /document/image:213701 (No such file or directory)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4398)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4440)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.io.FileNotFoundException: /document/image:213701 (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:231)
at java.io.FileInputStream.<init>(FileInputStream.java:165)
at com.my_app.android.ChatActivity.onActivityResult(ChatActivity.kt:611)
at android.app.Activity.dispatchActivityResult(Activity.java:7462)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4391)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4440)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Как правильно это сделать?