samodum
@samodum
Какой вопрос - такой и ответ

Как получить доступ к файлу из галереи?

Привет всем!
Делаю приложение, в котором есть модуль с выбором файла из галереи (да и вообще, любого файла с устройства).
Выбор происходит успешно. Но потом, когда я хочу получить доступ к этому файлу, то начинаются проблемы - андроиду не нравится путь, по которому я обращаюсь к этому файлу.
Вроде бы всё просто должно быть, но я запутался с этими долбанными путями.
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) 


Как правильно это сделать?
  • Вопрос задан
  • 1104 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Да, этот путь ненастоящий. Это связано с FileProvider'aми и правами на файлы(uri permissions). Нужно использовать ContentResolver.openInputStream.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы