Как настроить таргетинг на несколько уровней API?

Я хочу использовать метод Android Camera.open() на двух отдельных уровнях API. Во-первых, это уровень API 7, то есть 2.1 и выше, а во-вторых, 2.3.3 и 2.3.4, которые представляют собой уровень API 9.

На уровне API 7 и 8 метод Camera.open не принимает никаких аргументов. На уровне API 9 и выше камера принимает целочисленный аргумент, который предоставляет ей cameraId для использования.

Как я могу использовать оба уровня API в одном и том же коде? Что-то похожее на этот псевдокод:

Camera lCamera;
if (Platform.APILevel < 7){
  lCamera.open();
}else { 
  lCamera.open(0);
}

person Kevin Parker    schedule 28.06.2011    source источник


Ответы (3)


Мы часто делаем обнаружение отражения. Что-то типа:

    public Camera getCamera() {
        try {
            Method method = Camera.class.getMethod("open", Integer.TYPE);
            return (Camera) method.invoke(null, 0);
        } catch (Exception e) {
                // Yes, I really want to handle all exceptions here!!!!
                Log.d(TAG,"Error when trying to invoke Camera.open(int), reverting to open()",e);
                return Camera.open();
        }
    }
person Jarek Potiuk    schedule 28.06.2011
comment
:) Прохладный. Это работает очень хорошо, если отражение не запускается слишком часто (извлечение камеры в порядке) - потому что отражение медленное. Есть еще один интересный способ, но почему-то я нашел его не очень убедительным... Вы можете скомпилировать (или загрузить) последний и самый лучший файл jar для Android-всех классов в свой проект eclipse (но сохраняя его вне каталога lib). И оберните его в Exception, как указано выше... Это будет очень хорошо компилироваться в eclipse, только во время выполнения вы получите исключение. Это добавляет дополнительную сложность, если вы хотите сделать муравьиную сборку. ... - person Jarek Potiuk; 29.06.2011
comment
Просто продолжение... Как насчет операторов импорта, которые требуют классов, не найденных в предыдущих версиях SDK? - person Kevin Parker; 29.06.2011
comment
Это подход .jar, о котором я писал выше. - person Jarek Potiuk; 29.06.2011
comment
мне нужно установить targetSdk на 9, чтобы сделать это, или я могу оставить его на 7? - person Mohamed Hafez; 19.09.2013

Вообще говоря, вы просто ориентируетесь на самый низкий уровень API, который вам может сойти с рук. Все, что создано для уровня API 7, будет работать для уровней API 8, 9, 10 и т. д. В этом случае просто вызовите lCamera.open();, и он выберет первую найденную заднюю камеру. Если вы хотите использовать переднюю камеру, вы должны использовать более высокий уровень API уровня 9.

person DeeV    schedule 28.06.2011
comment
Неправда. Для версии 3.0 и выше вам может потребоваться вызвать invalidateOptionsMenu(). Во всех более ранних версиях API этот метод не существует, поэтому вам нужно использовать отражение для его вызова, если он существует. - person Graeme; 10.08.2011

Вы можете получить уровень API, прочитав final static целое число android.os.Build.VERSION.SDK_INT.

В своем манифесте убедитесь, что вы установили android:minSdkVersion И android:targetSdkVersion.

person Computerish    schedule 28.06.2011
comment
Это также помогает, просто всегда ориентируясь на API самого высокого уровня, необходимого, а затем охватывая области, которые не поддерживаются на самом высоком требуемом уровне API. Единственный способ проверить, что нужно изменить, чтобы обойти более низкие уровни API, - это постоянно менять целевую сборку вашего проекта. - person Kevin Parker; 29.06.2011
comment
Sorry, I thought you were looking for how to implement the Platform.APILevel`. - person Computerish; 29.06.2011