Проверьте, существует ли метод - PullRequest
0 голосов
/ 22 июля 2011

Я хочу проверить, существует ли на устройстве метод Camera.Parameters.getHorizontalViewAngle() (он доступен только из API 8, а мой min 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();
}

Ответы [ 3 ]

1 голос
/ 22 июля 2011

Лично я рекомендую условную загрузку классов, где вы изолируете код new-API в классе, который вы касаетесь только на совместимом устройстве. Я использую отражение только для действительно легких вещей (например, нахожу правильное значение CONTENT_URI для использования Contacts или ContactsContract).

Например, этот пример проекта использует две реализации абстрактного класса для обработки поиска объекта Camera - на устройстве Gingerbread он пытается использовать фронтальную камеру.

Или в этом примере проекта показано использование панели действий в Honeycomb, включая добавление в нее пользовательского представления, при сохранении обратной совместимости со старыми версиями Android.

1 голос
/ 22 июля 2011

m.invoke(params, hVA);

должно быть

m.invoke(params, null);

Camera.Parameters.getHorizontalViewAngle() не принимает никаких аргументов, а в строке выше указан аргумент hVA. Если вы ищете возвращаемую переменную, выполните hVA = m.invoke(params, null);

0 голосов
/ 22 июля 2011

Я знаю, что это хак, но почему вы не можете поместить первый вызов метода в собственный метод try / catch и вложить туда оставшуюся часть кода try / catch. Если внешний catch выполняется, метод не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...