У меня есть небольшое приложение, которое представляет собой оболочку веб-сайта, обрабатывающего изображения. Не могу загрузить с телефона более 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
Загрузка нескольких изображений из папки «Фотографии» вызывает исключение «Недостаточно памяти» ⇐ Android
Форум для тех, кто программирует под Android
1719611901
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")
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78684182/load-multiple-images-from-photos-folder-causes-out-of-memory-exception[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия