Условная компиляция в Android?
Существует ли какой-либо вид условной компиляции для Android?
Мне пришлось сделать свой проект для Android 3 (API 11) только потому, что ExifInterface практически не имеет полезных атрибутов в Android 2.3 (API 10), несмотря на то, что он появился в API 5 (!!??). Я не хочу ограничивать свое приложение пользователями ICS.
Спасибо!
3 ответов:
Вы можете динамически проверять текущую версию API устройства и делать разные вещи в зависимости от этого:
if(Build.VERSION.SDK_INT < 14) { // Crappy stuff for old devices } else { // Do awesome stuff on ICS }Но будьте осторожны, если вам нужно создать экземпляры классов, которые не доступны для всех API, то вы должны сделать это в runnable или в отдельном классе-оболочке, например:
if(Build.VERSION.SDK_INT < 14) { // Crappy stuff for old devices } else { // Do awesome stuff on ICS new Runnable() { new AmazingClassAvailableOnICS(); (...) }.run(); }
import android.annotation.TargetApi;А затем используйте аннотации:
@TargetApi(11) public void methodUsesAPI11() { ...Использование этого трюка делает очень простую вещь: он позволяет компилировать некоторый код, который содержит вызовы уровня API 11 (классы, методы и т. д.) И все еще установлен
android:minSdkVersion="8"в манифесте. Ничего больше, ничего больше.Все остальное зависит от вас. Перед вызовом
methodUsesAPI11()или обработкой исключений необходимо проверить версию платформы, чтобы предотвратить сбой приложения и выполнить другие действия на старых платформах.
Проверка Сборки.ВЕРСИЯ.SDK_INT или использование аннотаций должно быть достаточно, однако эта ссылка, которую я поставил в закладку, может иметь отношение к вашему случаю: http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html?m=1
Вы можете использовать то, что они там описывают, чтобы иметь классы, которые могут быть несовместимы, но никогда не будут загружены. Это не условная компиляция, но это может быть то, что вам нужно, однако, это немного сложнее.
Comments