检查方法是否存在

时间:2011-07-21 20:37:18

标签: android reflection methods

我想检查设备上是否存在方法Camera.Parameters.getHorizontalViewAngle()(它仅在API 8中可用,而我的最小SDK API为7)。我尝试使用“反射”,正如here所解释的那样,但它会发出一个错误,说明参数的数量是错误的:

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

3 个答案:

答案 0 :(得分:1)

m.invoke(params, hVA);

应该是

m.invoke(params, null);

Camera.Parameters.getHorizontalViewAngle()不接受任何参数,上面的行有参数hVA。如果您正在寻找返回变量,请执行hVA = m.invoke(params, null);

答案 1 :(得分:1)

就个人而言,我建议使用条件类加载,您可以在只在兼容设备上触摸的类中隔离新的API代码。我只对真正轻量级的东西使用反射(例如,找到用于CONTENT_URIContacts的正确的ContactsContract值。

例如,this sample project使用抽象类的两个实现来处理查找Camera对象 - 在Gingerbread设备上,它尝试使用前置摄像头。

或者,this sample project显示使用Honeycomb上的操作栏,包括在其中放置自定义视图,同时仍保持向旧版Android的向后兼容性。

答案 2 :(得分:0)

我知道这是一个hack,但为什么你不能在它自己的try / catch中对方法进行第一次调用,并将其余的try / catch代码嵌套在那里。如果执行外部catch,则该方法不存在。