Загрузка нескольких изображений из папки «Фотографии» вызывает исключение «Недостаточно памяти»Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Загрузка нескольких изображений из папки «Фотографии» вызывает исключение «Недостаточно памяти»

Сообщение Anonymous »

У меня есть небольшое приложение, которое представляет собой оболочку веб-сайта, обрабатывающего изображения. Не могу загрузить с телефона более 5 фотографий, приложение вылетает с ошибкой:

java.lang.OutOfMemoryError: Не удалось выделить xxxxx байт.
Как оптимизировать управление памятью? Буду очень признателен за любые советы.
Пользователь выбирает изображения
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {
val selectedImageBlobs = mutableListOf()

if (data?.clipData != null) {
val clipData = data.clipData
for (i in 0 until clipData!!.itemCount) {
val uri = clipData.getItemAt(i).uri
val base64Image = convertUriToBase64(uri)
val mimeType = contentResolver.getType(uri)
val fileName = getFileNameWithExtension(uri)
if (base64Image != null && mimeType != null && fileName.isNotEmpty()) {
selectedImageBlobs.add(Triple(base64Image, mimeType, fileName))
}
}
} else {
val uri = data?.data
if (uri != null) {
val base64Image = convertUriToBase64(uri)
val mimeType = contentResolver.getType(uri)
val fileName = getFileNameWithExtension(uri)
if (base64Image != null && mimeType != null && fileName.isNotEmpty()) {
selectedImageBlobs.add(Triple(base64Image, mimeType, fileName))
}
}
}

// Send selected image blobs, MIME types, and filenames to JSBridge
jsBridge.sendImagePaths(selectedImageBlobs)
}
}

В этой функции данные изображения считываются из хранилища устройства, преобразуются в строку Base64 и возвращаются (занимает значительный объем памяти


private fun convertUriToBase64(uri: Uri): String? {
return try {
val inputStream: InputStream? = contentResolver.openInputStream(uri)
val byteArrayOutputStream = ByteArrayOutputStream()
val buffer = ByteArray(1024)
var bytesRead: Int

while (inputStream!!.read(buffer).also { bytesRead = it } != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead)
}

val byteArray = byteArrayOutputStream.toByteArray()
Base64.encodeToString(byteArray, Base64.DEFAULT)
} catch (e: Exception) {
e.printStackTrace()
null
}
}

А затем отправляю данные:

private inner class JSBridge(val context: Context, private val webView: WebView) {
fun sendData(imageFiles: List) {
val jsonArray = JSONArray()

for (imageFile in imageFiles) {
val jsonObject = JSONObject()
jsonObject.put("type", imageFile.second)
jsonObject.put("name", imageFile.third)
jsonObject.put("blob", imageFile.first)
jsonArray.put(jsonObject)
}

val jsonData = """
{
"method": "upload_files_from_app",
"result": {
"imageFiles": $jsonArray
}
}
""".trimIndent()

val jsonObject = JSONObject(jsonData)
val jsonObjectString = jsonObject.toString()
Log.d("WebViewBridge", "JSBridge JSON Object: $jsonObjectString")

// Call JavaScript function with JSON data
webView.evaluateJavascript("javascript: window.mobile2web.onMessage($jsonObjectString)", null)
}

On Create:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// Request location permissions if not already granted
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
arrayOf(ACCESS_FINE_LOCATION),
LOCATION_PERMISSION_REQUEST_CODE
)
}

val settings: WebSettings = myWebView.settings
settings.javaScriptEnabled = true
settings.domStorageEnabled = true

myWebView.webViewClient = MyWebViewClient()
myWebView.webChromeClient = MyWebChromeClient()
myWebView.loadUrl("https://********************")

val jsInterface = JSBridge(this, myWebView)
myWebView.addJavascriptInterface(jsInterface, "androidBridge")
}



Подробнее здесь: https://stackoverflow.com/questions/786 ... -exception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»