РЕДАКТИРОВАТЬ 2
Я думаю, что нашел решение проблемы.В Google docs упоминается, что доступ к общему файлу даст вам URI .
Серверное приложение отправляет URI содержимого файла обратно клиентскому приложению в Intent.Это намерение передается клиентскому приложению в его переопределении onActivityResult ().Как только клиентское приложение имеет URI содержимого файла, оно может получить доступ к файлу, получив его FileDescriptor.
Ниже приведен обновленный код, который я использую внутри onActivityResult .Убедитесь, что вы наконец вызвали метод super для onActivityResult.
super.onActivityResult (requestCode, resultCode, data)
Рабочий код
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
data?.data?.let {
util._log(TAG, it.toString())
}
if (data!!.data != null && data.data != null) {
try {
val stream = if (data.data!!.toString().contains("com.google.android.apps.photos.contentprovider")) {
val ff = contentResolver.openFileDescriptor(data.data!!, "r")
FileInputStream(ff?.fileDescriptor)
} else {
contentResolver.openInputStream(data.data!!)
}
val createFile = createImageFile()
util.copyInputStreamToFile(stream, createFile)
selectedImagePath = createFile.absolutePath
} catch (e: Exception) {
util._log(TAG, Log.getStackTraceString(e))
}
}
super.onActivityResult(requestCode, resultCode, data)
}
РЕДАКТИРОВАТЬ
Также проверьте это сообщение stackoverflow
Оригинал
Я использую его на Android oreo 8.1.0 (API 27) на моем телефоне Redmi 6 pro, и он работает нормально.
Вы не опубликовали onActivityResult Метод может быть, это то, где вам нужно сделать некоторые изменения.Я пробовал оба:
Ниже приведен мой фрагмент кода
val pickIntent = Intent(Intent.ACTION_VIEW)
pickIntent.type = "image/*"
pickIntent.action = Intent.ACTION_GET_CONTENT
pickIntent.addCategory(Intent.CATEGORY_OPENABLE)
startActivityForResult(pickIntent, SELECT_PICTURE)
, а в onActivityResult я анализирую его следующим образом
if (data!!.data != null && data.data != null) {
try {
// CommonUtilities._Log(TAG, "Data Type " + data.getType());
if (!isFinishing) {
val inputStream = contentResolver.openInputStream(data.data!!)
val createFile = createImageFile()
copyInputStreamToFile(inputStream!!, createFile)
// CommonUtilities._Log(TAG, "File Path " + createFile.getAbsolutePath());
selectedImagePath = createFile.absolutePath
}
} catch (e: IOException) {
util._log(TAG, Log.getStackTraceString(e))
}
}
Способ создания нового файла
@Throws(IOException::class)
private fun createImageFile(): File {
// Create an image file name
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(Date())
val imageFileName = "yesqueen_" + timeStamp + "_"
val storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
return File.createTempFile(imageFileName, ".jpg", storageDir)
}
Способ чтения из inputtream
fun copyInputStreamToFile(`in`: InputStream, file: File) {
var out: OutputStream? = null
try {
out = FileOutputStream(file)
val buf = ByteArray(1024)
var len: Int = 0
while (`in`.read(buf).apply { len = this } > 0) {
out.write(buf, 0, len)
}
/*while (`in`.read(buf).let {
len = it
true
}) {
out.write(buf, 0, len)
}*/
/* while ((len = `in`.read(buf)) > 0) {
out.write(buf, 0, len)
}*/
} catch (e: Exception) {
e.printStackTrace()
} finally {
try {
out?.close()
} catch (e: Exception) {
e.printStackTrace()
}
try {
`in`.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
}