Отключить аппаратное ускорение, обратную совместимость - PullRequest
4 голосов
/ 27 марта 2012

У меня проблема с функцией (setLayerType(LAYER_TYPE_NONE, null)), доступной в api> = 11, и мой код должен работать и на Android 1.6 (уровень API 4).Я попытался использовать отражение следующим образом:

try {

        Method method = View.class.getMethod("setLayerType", Integer.TYPE, null);
        method.invoke(LAYER_TYPE_NONE, null);
        view.setLayerType(LAYER_TYPE_NONE, null);
    } catch (Throwable e) {
        Log.e("_________________test", "Function not found");
    }

, но мое приложение аварийно завершает работу при view.setLayerType с java.lang.VerifyError ....

Кто-нибудь знает, как я могуобойти этот сбой и получить обратную совместимость с этой функцией в API нижнего уровня?

Спасибо, Arkde

Ответы [ 3 ]

4 голосов
/ 28 марта 2012

Просто удалите

view.setLayerType(LAYER_TYPE_NONE, null);

и вам будет хорошо, из соображений безопасности, Java / Android сначала проверит, что у него есть хотя бы один шанс запустить данный класс, прежде чем продолжить, а в старых ОС Android он не знает, как выполнить "представление". setLayerType (LAYER_TYPE_NONE, null); ", это вызвало бы серьезную ошибку перед тем, как любой код из этого класса может быть запущен.

Поскольку вы запустили код с помощью отражения, вам в любом случае не нужна эта строка кода.

4 голосов
/ 27 марта 2012

Это должно быть полезно: http://android -developers.blogspot.com / 2009/04 / back-compatibility-for-android.html

Если это действительно связано с аппаратным ускорением, вы можете добавить в манифест следующее:

<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>

Источник: http://developer.android.com/guide/topics/graphics/hardware-accel.html

1 голос
/ 08 декабря 2012

Я не мог заставить его работать с вашим кодом. Я обнаружил проблему с параметризацией типа метода. Также вы не вызывали метод в представлении, для которого вы хотите установить аппаратное ускорение. Это было мое решение:

public static void setHardwareAccelerated(View view){
    try {
        Method method = View.class.getMethod("setLayerType", int.class, Paint.class);
        method.invoke(view, View.LAYER_TYPE_HARDWARE, null);
    } catch (Exception e) {
        Log.e("RD", "Hardware Acceleration not supported on API " + android.os.Build.VERSION.SDK_INT, e);
    }
}
...