Обнаружение аппаратного ускорения во время выполнения: Android

Можно ли постоянно определять, включено ли для Activity аппаратное ускорение при его создании? Я беспокоюсь, что пользователи моей библиотеки включат ее через манифест, когда они не должны, специально не отключив ее для моей деятельности (как я им приказываю).

Единственная достоверная информация, которую я могу найти (http://android-developers.blogspot.com/2011/03/android-30-hardware-acceleration.html) говорит, что я могу запрашивать View.isHardwareAccelerated() и Canvas.isHardwareAccelerated(). Однако для моих целей я хотел бы убедиться, что он выключен, когда отображается активность моей библиотеки. До сих пор я не могу получить ничего, чтобы сообщить о последовательном да / нет, когда он включен или выключен. Я попытался взломать фиктивное представление, настроив его на свою активность, а затем протестировав его, но он всегда возвращает false. Кроме того, я пытался протестировать Window.getAttributes( ).flags, но они его тоже не показывают.

Я тестирую это, потому что путь отрисовки с аппаратным ускорением для моей библиотеки работает неправильно, и, похоже, нет никакого способа это исправить.


person Jesse    schedule 22.07.2011    source источник


Ответы (2)


Try FLAG_HARDWARE_ACCELERATED в flags в ActivityInfo за активность, которую вы получите от PackageManager через getActivityInfo().

person CommonsWare    schedule 22.07.2011
comment
Другой способ сделать это — вызвать getDecorView().isHardwareAccelerated() из метода Activity onCreate(). - person Romain Guy; 31.03.2012

Я новичок в Android, поэтому я застрял даже с подсказками, данными в ответе выше ... пошел искать и нашел этот код где-то в море Google. Надеюсь, это поможет кому-то.

/**
 * Returns true if the given Activity has hardware acceleration enabled
 * in its manifest, or in its foreground window.
 *
 * TODO(husky): Remove when initialize() is refactored (see TODO there)
 * TODO(dtrainor) This is still used by other classes.  Make sure to pull some version of this
 * out before removing it.
 */
public static boolean hasHardwareAcceleration(Activity activity) {
    // Has HW acceleration been enabled manually in the current window?
    Window window = activity.getWindow();
    if (window != null) {
        if ((window.getAttributes().flags
                & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0) {
            return true;
        }
    }

    // Has HW acceleration been enabled in the manifest?
    try {
        ActivityInfo info = activity.getPackageManager().getActivityInfo(
                activity.getComponentName(), 0);
        if ((info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
            return true;
        }
    } catch (PackageManager.NameNotFoundException e) {
        Log.e("Chrome", "getActivityInfo(self) should not fail");
    }

    return false;
}
person Bruce    schedule 03.09.2013
comment
Привет, Брюс. Пожалуйста, ответьте также на следующий вопрос. stackoverflow.com/questions/12481198/ - person saa; 30.01.2014