2011-07-21 96 views
0

我想检查设备上是否存在方法Camera.Parameters.getHorizontalViewAngle()(它仅适用于API 8,我的min 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(); 
} 

回答

1

m.invoke(params, hVA);

应该是

m.invoke(params, null);

Camera.Parameters.getHorizontalViewAngle()不采取任何参数和上述线具有参数HVA。如果你正在寻找返回变量做hVA = m.invoke(params, null);

+0

我已经给我这个问题的链接,并试图做到这一点... – jul

+0

你可以给我们的错误的堆栈跟踪?此外,如果您有新的Class [] {},只需将null视为空数组即可。 – Nicholas

+0

我编辑了这个问题。 – jul

0

我知道这是一个黑客,但为什么你不能把第一个调用方法在它自己的try/catch中,并且将其余的在那里尝试/捕捉代码。如果执行外部catch,则该方法不存在。

+0

因为它不会编译,因为我正在编译API 7,并且该方法仅存在于API 8中。 – jul

+0

#define #ifdef其中您将def一次设置为主目标版本,然后在你需要的代码中的任何地方使用#ifdef? –

+0

@jul:您可以将您的项目设置为使用支持最高的SDK版本,然后更改清单中的“uses-sdk”部分,如下所示:”android:targetSdkVersion =“”/> 。用替换适当的数字。 – Theo

1

就我个人而言,我建议有条件的类加载,在此类中将新API代码隔离到只能在兼容设备上触摸的类中。我只将反射用于真正轻量级的东西(例如,找到用于ContactsContactsContract的正确CONTENT_URI值)。

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

this sample project展示了如何在Honeycomb上使用操作栏,包括在其中添加自定义视图,同时仍保持向旧版Android的向后兼容性。