Как правильно обрабатывать PixelCopy.ERROR_SOURCE_NO_DATA? - PullRequest
0 голосов
/ 27 февраля 2020

На некоторых устройствах, если контекст активности теряется из-за нехватки памяти, когда приложение было приостановлено, эффект размытия на фоне диалога не может быть воссоздан. В журнале такая ситуация связана с ошибкой 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
        }
    }
}
...