我想检查方法Camera.Parameters.getHorizontalViewAngle()
是否存在于设备上(它只能从API 8和我的最小SDK API是7)。我试图使用"反射",如这里所解释的,但它捕获了一个错误,说参数的数量是错误的:
java.lang.IllegalArgumentException: wrong number of arguments
有人能帮忙吗?
Camera camera;
camera = Camera.open();
Parameters params = camera.getParameters();
Method m = Camera.Parameters.class.getMethod("getHorizontalViewAngle", new Class[] {} );
float hVA = 0;
try {
m.invoke(params, hVA);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.invoke(params, hVA);
应为
m.invoke(params, null);
Camera.Parameters.getHorizontalViewAngle()
不接受任何参数,上面一行有参数hVA。如果您正在寻找返回变量,请执行hVA = m.invoke(params, null);
我个人建议有条件的类加载,在这种情况下,您将新api代码隔离在仅在兼容设备上触摸的类中。我只在真正轻量级的东西上使用反射(例如,为Contacts
或ContactsContract
找到正确的CONTENT_URI
值)。
例如,这个示例项目使用一个抽象类的两个实现来处理查找Camera对象——在Gingerbread设备上,它尝试使用前置摄像头。
或者,这个示例项目展示了在Honeycomb上使用操作栏,包括在其中放置一个自定义视图,同时仍然保持对旧版本Android的向后兼容性。
我知道这是一个hack,但是为什么你不能把对方法的第一个调用放在它自己的try/catch中,并在那里嵌套剩下的try/catch代码呢?如果外部catch执行,则方法不存在。