На некоторых устройствах, если контекст активности теряется из-за нехватки памяти, когда приложение было приостановлено, эффект размытия на фоне диалога не может быть воссоздан. В журнале такая ситуация связана с ошибкой PixelCopy.ERROR_SOURCE_NO_DATA в OnPixelCopyFinishedListener. Ранее в этом случае мы просто пытались возобновить копирование пикселей. Когда я отлаживал создание размытия, оно всегда успешно воссоздавалось. Итак, сейчас я добавил условную задержку, которая активируется при получении ERROR_SOURCE_NO_DATA. Но, может быть, эту ошибку нужно обрабатывать по-другому?
@RequiresApi(Build.VERSION_CODES.O)
private class PixelCopyTask(
val window: Window,
val srcRect: Rect,
val dstViewWeak: WeakReference<View>,
val captureViewBitmap: Bitmap,
val scaleFactor: Float,
val radius: Int,
val startTime: Long
) : PixelCopy.OnPixelCopyFinishedListener {
var wasSourceNoDataError = false
fun start() {
try {
PixelCopy.request(window, srcRect, captureViewBitmap, this, uiHandler)
} catch (e: IllegalArgumentException) {
Timber.d("BlurViewBitmapFactory: PixelCopy fail create screen capture")
}
}
override fun onPixelCopyFinished(copyResult: Int) {
val dst = dstViewWeak.get() ?: return
checkTime(startTime) { return }
when (copyResult) {
PixelCopy.SUCCESS -> setBlurBitmapBackground(captureViewBitmap, dst, scaleFactor, radius, startTime, wasSourceNoDataError)
PixelCopy.ERROR_SOURCE_NO_DATA -> {
wasSourceNoDataError = true
Timber.d("PixelCopy.ERROR_SOURCE_NO_DATA")
start()
}
else -> return
}
}
}