|
11 | 11 | import android.annotation.TargetApi; |
12 | 12 | import android.content.Context; |
13 | 13 | import android.graphics.Bitmap; |
| 14 | +import android.graphics.Insets; |
14 | 15 | import android.graphics.PixelFormat; |
15 | 16 | import android.media.ImageReader; |
16 | 17 | import android.os.Build; |
|
19 | 20 | import android.util.DisplayMetrics; |
20 | 21 | import android.util.Range; |
21 | 22 | import android.util.Size; |
| 23 | +import android.view.Display; |
22 | 24 | import android.view.Surface; |
| 25 | +import android.view.WindowInsets; |
23 | 26 | import android.view.WindowManager; |
| 27 | +import android.view.WindowMetrics; |
24 | 28 |
|
25 | 29 | import androidx.annotation.NonNull; |
26 | 30 |
|
@@ -96,7 +100,6 @@ private void initSupportedSettings() { |
96 | 100 | Size maxSize = CapabilityUtil.getSupportedMaxSize("video/avc"); |
97 | 101 |
|
98 | 102 | Size originalSize = getDisplaySize(); |
99 | | - |
100 | 103 | List<Size> supportPictureSizes = new ArrayList<>(); |
101 | 104 | List<Size> supportPreviewSizes = new ArrayList<>(); |
102 | 105 | final int num = 4; |
@@ -171,10 +174,40 @@ private Size getDisplaySize() { |
171 | 174 | isSwap = true; |
172 | 175 | break; |
173 | 176 | } |
174 | | - // 画面が回転している場合には、縦横をスワップしておく。 |
175 | | - int width = isSwap ? metrics.heightPixels : metrics.widthPixels; |
176 | | - int height = isSwap ? metrics.widthPixels : metrics.heightPixels; |
177 | | - return new Size(width, height); |
| 177 | + int insetsWidth = 0; |
| 178 | + int insetsHeight = 0; |
| 179 | + Size displaySize; |
| 180 | + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { |
| 181 | + WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); |
| 182 | + final WindowInsets windowInsets = windowMetrics.getWindowInsets(); |
| 183 | + Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() |
| 184 | + | WindowInsets.Type.displayCutout()); |
| 185 | + |
| 186 | + int width = isSwap ? windowMetrics.getBounds().height() :windowMetrics.getBounds().width(); |
| 187 | + int height = isSwap ? windowMetrics.getBounds().width() :windowMetrics.getBounds().height(); |
| 188 | + insetsWidth = insets.right + insets.left; |
| 189 | + insetsHeight = insets.top + insets.bottom; |
| 190 | + |
| 191 | + // Legacy size that Display#getSize reports |
| 192 | + displaySize = new Size(width - insetsWidth, |
| 193 | + height - insetsHeight); |
| 194 | + } else { |
| 195 | + // 画面が回転している場合には、縦横をスワップしておく。 |
| 196 | + int width = isSwap ? metrics.heightPixels : metrics.widthPixels; |
| 197 | + int height = isSwap ? metrics.widthPixels : metrics.heightPixels; |
| 198 | + displaySize = new Size(width, height); |
| 199 | + } |
| 200 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 201 | + Display.Mode[] modes = wm.getDefaultDisplay().getSupportedModes(); |
| 202 | + if(modes.length > 0){ |
| 203 | + Display.Mode mode = modes[modes.length - 1]; |
| 204 | + int width = isSwap ? mode.getPhysicalHeight() : mode.getPhysicalWidth(); |
| 205 | + int height = isSwap ? mode.getPhysicalWidth() : mode.getPhysicalHeight(); |
| 206 | + // 4Kサイズの解像度がある場合はそちらを優先する |
| 207 | + displaySize = new Size(width - insetsWidth, height - insetsHeight); |
| 208 | + } |
| 209 | + } |
| 210 | + return displaySize; |
178 | 211 | } |
179 | 212 |
|
180 | 213 | @Override |
|
0 commit comments