禁用硬件加速,向后兼容

时间:2012-03-27 09:30:26

标签: android compatibility

我遇到api> = 11中可用的函数(setLayerType(LAYER_TYPE_NONE, null))的问题,我的代码也应该在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 个答案:

答案 0 :(得分:4)

这应该很有用:http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html

如果它确实与硬件加速有关,您可以在清单中添加以下内容:

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

src:http://developer.android.com/guide/topics/graphics/hardware-accel.html

答案 1 :(得分:4)

只需删除

view.setLayerType(LAYER_TYPE_NONE, null);

你应该没问题,出于安全考虑,Java / Android会首先验证它在继续运行前至少有一个运行给定类的镜头,而在较旧的Android OS上它不知道如何执行“查看”。 setLayerType(LAYER_TYPE_NONE,null);“,它会在该类中的任何代码运行之前抛出一个硬错误。

由于您使用反射运行代码,因此无论如何都不需要那行代码。

答案 2 :(得分:1)

我无法使用您的代码。我发现的问题是方法类型参数化。此外,您没有在要设置硬件加速的视图上调用该方法。这是我的解决方案:

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);
    }
}