OpenCV4.10.0 getDefaultDisplayが非推奨 対策

2024.8.6Coskx Lab  

1 概要

OpenCVのandroidソースの一部がAndroid11(API 30)以降で非推奨と警告が出るようになってきたので,対応します。

問題になるのは,CameraBridgeViewBase.javaなので,OpenCV4.10.0のCameraBridgeViewBase.javaを書き換えます。

2 使用環境

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