This issue recently became relevant for me because of the notch in my Pixel 3XL. I really liked android developer's solution, but I wanted to be able to get the status bar height at will, since it was specifically necessary for a full screen animation that I needed to play. The function below enabled a reliable query:
private val DEFAULT_INSET = 96 fun getInsets(view: View?): Int { var inset = DEFAULT_INSET if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET } return inset } fun blurView(rootView: View?, a: SpacesActivity?) { val screenBitmap = getBitmapFromView(rootView!!) val heightDifference = getInsets(rootView) val croppedMap = Bitmap.createBitmap( screenBitmap, 0, heightDifference, screenBitmap.width, screenBitmap.height - heightDifference) val blurredScreen = blurBitmap(croppedMap) if (blurredScreen != null) { val myDrawable = BitmapDrawable(a!!.resources, blurredScreen) a.errorHudFrameLayout?.background = myDrawable a.appBarLayout?.visibility = View.INVISIBLE } }
And then in the activity class:
fun blurView() { this.runOnUiThread { Helper.blurView(this) } }
You will of course want to make pass a weak reference of the activity to the static Helper class method parameter, but for the sake of brevity I refrained in this example. The blurBitmapand errorHudFrameLayout are omitted for the same reason, since they don't directly pertain to obtaining the height of the status bar.