OpenCV4.10.0 getDefaultDisplayが非推奨 対策
2024.8.6Coskx Lab
1 概要
OpenCVのandroidソースの一部がAndroid11(API 30)以降で非推奨と警告が出るようになってきたので,対応します。
問題になるのは,CameraBridgeViewBase.javaなので,OpenCV4.10.0のCameraBridgeViewBase.javaを書き換えます。
2 使用環境
- Windows 10 64-bit
- Android Studio Hedgehog | 2023.1.1 Patch 1 Build #AI-231.9392.1.2311.11255304, built on December 27, 2023
- Java
- OpenCV 4.10.0
3 WindowManager getDefaultDisplay()が非推奨
Android11(API 30)以降を開発ターゲットにすると,OpenCVのCameraBridgeViewBaseのgetDefaultDisplay()が非推奨となっており,警告が出ています。
そのままにしていても,当面は大丈夫と思いますが,書換ました。
このCameraBridgeViewBaseは重要なのでいずれOpenCV本家の記述が修正されると思いますが,それまでの間を過ごすための作業です。
4 対策前
非推奨警告が出るのはCameraBridgeViewBase.javaのメソッドprotected int getFrameRotation()内のscreenOrientationを得ているところです。
OPenCV 4.10.0同梱のCameraBridgeViewBase.java getFrameRotation()
/**
* Calculates how to rotate camera frame to match current screen orientation
*/
protected int getFrameRotation(boolean cameraFacingFront, int cameraSensorOrientation) {
WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int screenOrientation = windowManager.getDefaultDisplay().getRotation();
int screenRotation = 0;
switch (screenOrientation) {
case Surface.ROTATION_0:
screenRotation = 0;
break;
case Surface.ROTATION_90:
screenRotation = 90;
break;
case Surface.ROTATION_180:
screenRotation = 180;
break;
case Surface.ROTATION_270:
screenRotation = 270;
break;
}
int frameRotation;
if (cameraFacingFront) {
frameRotation = (cameraSensorOrientation + screenRotation) % 360;
} else {
frameRotation = (cameraSensorOrientation - screenRotation + 360) % 360;
}
return frameRotation;
}
5 対策
修正後のCameraBridgeViewBase.java
/**
* Calculates how to rotate camera frame to match current screen orientation
*/
protected int getFrameRotation(boolean cameraFacingFront, int cameraSensorOrientation) {
int screenOrientation;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
screenOrientation = getContext().getDisplay().getRotation();
} else {
WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
screenOrientation = windowManager.getDefaultDisplay().getRotation();
}
int screenRotation = 0;
switch (screenOrientation) {
case Surface.ROTATION_0:
screenRotation = 0;
break;
case Surface.ROTATION_90:
screenRotation = 90;
break;
case Surface.ROTATION_180:
screenRotation = 180;
break;
case Surface.ROTATION_270:
screenRotation = 270;
break;
}
int frameRotation;
if (cameraFacingFront) {
frameRotation = (cameraSensorOrientation + screenRotation) % 360;
} else {
frameRotation = (cameraSensorOrientation - screenRotation + 360) % 360;
}
return frameRotation;
}
6 まとめ
OpenCV4.10.0のソースのCameraBridgeViewBase.javaがAndroid11(API 30)以降で非推奨メソッドが使用されているため,対応しました。
ただし,CameraBridgeViewBase.java内には互換対応用記述が残るので,コンパイル時の警告は出ます。
なお次の6つのファイルは使われていないので,無効にすると,コンパイル時のdeprecated警告表示は,かなりなくなります。
無効にしても問題なしです。
Camera2Renderer.java
CameraGLRendererBase.java
CameraGLSurfaceView.java
CameraRenderer.java
JavaCameraView.java
NativeCameraView.java