web-dev-qa-db-fra.com

Comment gérer une encoche (découpe d'écran) dans l'API Android inférieure à 28?

Android a ajouté le support d'encoche sur l'API 28, mais comment le gérer sur les appareils exécutant l'API 27 (Honor 10, Huawei P20, etc.)? 

J'essayais d'utiliser DisplayCutoutCompat mais je n'ai pas pu en créer une instance car la documentation ne précise pas vraiment comment en créer une. 

Comment créer les valeurs du paramètre constructeur: Rect safeInsets, List<Rect> boundingRects

J'ai aussi examiné le code source du constructeur, ce qui me laisse un peu déroutant: 

public DisplayCutoutCompat(Rect safeInsets, List<Rect> boundingRects) {
        this(SDK_INT >= 28 ? new DisplayCutout(safeInsets, boundingRects) : null);
    }

Cela renverra toujours la valeur null sur les appareils exécutant API <28 . Merci d’avance.

6
blade

Google a fourni des API liées à l'encoche sous Android P. Les appareils dotés d'une encoche et la version de l'API inférieure à P implémentaient leurs propres API.

De plus, je n'ai pas vu la création d'instance de DisplayCutoutCompat dans la documentation officielle, mais vous pouvez créer DisplayCutout comme suit:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            DisplayCutout displayCutout = getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();
}
9
fujino ryougi

J'avais un problème similaire et je devais avoir recours à la réflexion pour accéder à ce dont j'avais besoin ... Mon problème était que j'avais quelques calculs en fonction de la taille de l'écran et que, même sans accéder à l'encoche, les calculs étaient erronés et le code ne fonctionnait pas bien. .

    public static final String CLASS_DISPLAY_CUTOUT = "Android.view.DisplayCutout";
    public static final String METHOD_GET_DISPLAY_CUTOUT = "getDisplayCutout";
    public static final String FIELD_GET_SAFE_INSET_TOP = "getSafeInsetTop";
    public static final String FIELD_GET_SAFE_INSET_LEFT = "getSafeInsetLeft";
    public static final String FIELD_GET_SAFE_INSET_RIGHT = "getSafeInsetRight";
    public static final String FIELD_GET_SAFE_INSET_BOTTOM = "getSafeInsetBottom";


    try {
            WindowInsets windowInsets = activity.getWindow().getDecorView().getRootWindowInsets();
            if (windowInsets == null) {
                return;
            }
            Method method = WindowInsets.class.getMethod(METHOD_GET_DISPLAY_CUTOUT);
            Object displayCutout = method.invoke(windowInsets);
            if (displayCutout == null) {
                return;
            }
            Class clz = Class.forName(CLASS_DISPLAY_CUTOUT);
            int top = (int) clz.getMethod(FIELD_GET_SAFE_INSET_TOP).invoke(displayCutout);
            int left = (int) clz.getMethod(FIELD_GET_SAFE_INSET_LEFT).invoke(displayCutout);
            int right = (int) clz.getMethod(FIELD_GET_SAFE_INSET_RIGHT).invoke(displayCutout);
            int bottom = (int) clz.getMethod(FIELD_GET_SAFE_INSET_BOTTOM).invoke(displayCutout);
            Rect rect = new Rect(left, top, right, bottom);

        } catch (Exception e) {
            Log.e(TAG, "Error when getting display cutout size");
        }
0
M.Baraka