Как реализуется создание нескольких сборок под разный API ?

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Как реализуется создание нескольких сборок под разный API ?

Сообщение Mikhail_dev » 03 окт 2012, 15:24

Ситуация такая. Есть НЕМНОГО кода, который идет с API, который по уровню выше. К примеру нужно мне обращаться к нескольким камерам, но наше приложение заточено к API 7, а там только с API 9. Тут я вижу только вариант двух сборок, либо что-то на подобие дополнительной библиотеки, например как FragmentDialog.
Но хочется чтобы можно было в одном приложении отслеживать параметры устройства и уже решать, что включать. Возможно ли такое дело?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение neoksi » 03 окт 2012, 15:39

Зачем разные сборки?
Можно же реализовать проверку версии API устройства и если она подходит то выполнить нужный метод через invoke.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение Mikhail_dev » 01 ноя 2012, 16:46

Т.е. использовать рефлексию? А если такого кода не один метод? Я думаю это слишком громоздко выйдет. Неужели альтернатив никаких?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение AndreyI » 01 ноя 2012, 18:01

Без проблем, никаких отражений не нужно, пусть приложение отслеживает под какой версией Андроид запускается и по результатам исполняет соответствующий код. Компилировать нужно, естественно, с API в которой поддерживаются все используемые методы и классы (иначе не построится).
Чтобы Lint не ругался на методы которые не поддерживаются в API указанной в minSdkVersion можно пометить их аннотацией @TargetApi() (в скобках указать версию API в которой этот метод поддерживается)

Код: Выделить всё

import android.annotation.TargetApi;
...
if (Build.VERSION.SDK_INT>=9){
methodSupportedAPI9();
}
...

@TargetApi(9)
private void methodSupportedAPI9() {
		
		
}


AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение AndreyI » 04 ноя 2012, 05:27

Кстати, если кто не обратил внимание, гугловцы пометили 9-ю платформу как устаревшую (Obsolete) так же как и 2,5,6. Это означает, что они перестали поддерживать эти версии на уровне SDK.
Я 9-ю вообще удалил, чтоб не мешалась, т.к. пользуюсь последними версиями ADT и SDK-Tools, а в них она глючит, особенно визуальный редактор, а раз она помечена как вышедшая из употребления, то претензий не принимают ))

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение neoksi » 04 ноя 2012, 11:44

А есть такой же простой способ, чтоб определить планшет или смартфон?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение rezak90 » 04 ноя 2012, 11:47

neoksi писал(а):А есть такой же простой способ, чтоб определить планшет или смартфон?
http://stackoverflow.com/questions/9279 ... -or-tablet
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение neoksi » 04 ноя 2012, 23:47

rezak90 писал(а):
neoksi писал(а):А есть такой же простой способ, чтоб определить планшет или смартфон?
http://stackoverflow.com/questions/9279 ... -or-tablet
Спасибо.

П.С. Сначала прочел про решение через разрешение и приуныл, но когда увидел решение через ресурсы, просто возрадовался :D

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение AndreyI » 05 ноя 2012, 15:33

Мне решение через ресурсы (по приведенной ссылке) слишком изящным не показалось, скорее извращенным.
Создавать два файла в ресурсах чтобы косвенным образом определять с каким размером экрана запущена программа?
А почему напрямую не спросить это у системы?

Код: Выделить всё

		int ScreenSize=getResources().getConfiguration().screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK;
		if (ScreenSize==4){
			//Tablet size
		}
где 4 это значение константы Configuration.SCREENLAYOUT_SIZE_XLARGE т.к. она определена начиная с API 9 , чтобы проект нормально компилировался с более ранними API можно просто взять её значение.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение Mikhail_dev » 12 ноя 2012, 11:53

А в чем может быть проблема? Подчеркивает что таких методов нету, а именно getRotation: "The method getRotation() is undefined for the type Display"

Код: Выделить всё

	@TargetApi(8)
	private void setDisplayOrientation(Camera camera, int angle) {
        Parameters parameters = camera.getParameters();
        Display display = ((WindowManager)context.getSystemService(context.WINDOW_SERVICE)).getDefaultDisplay();
        if(display.getRotation() == Surface.ROTATION_0){
            parameters.setPreviewSize(height, width);                           
            camera.setDisplayOrientation(90);
        }
        if(display.getRotation() == Surface.ROTATION_90){
            parameters.setPreviewSize(width, height);                           
        }
        if(display.getRotation() == Surface.ROTATION_180){
            parameters.setPreviewSize(height, width);               
        }
        if(display.getRotation() == Surface.ROTATION_270){
            parameters.setPreviewSize(width, height);
            camera.setDisplayOrientation(180);
        }
        camera.setParameters(parameters);
}
Я ведь понимаю, что если определить метод как targetApi(8), то и внутри него можно использовать API 8. Импорт аннотаций добавил.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение AndreyI » 12 ноя 2012, 11:59

Компилировать нужно с API в котором этот метод есть.
targetApi(8) не подключает библиотеки соответствующего API, а только информирует Lint чтобы он не ругался на несоответствии метода с уровнем API указанным в minSdkVersion в манифесте.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение Mikhail_dev » 12 ноя 2012, 12:21

А как это будет выглядеть? Нужно удалить старую библиотеку (у меня она 2.1) и поставить с API9 ? Или добавочно подгрузить API9? Второй вариант полазив в настройках, никак не смог найти.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение AndreyI » 12 ноя 2012, 12:33

Просто в настройках Project->Properties->Android справа выбираете нужный API и все. ADT автоматически поменяет библиотеку

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Как реализуется создание нескольких сборок под разный AP

Сообщение Mikhail_dev » 12 ноя 2012, 12:48

Да, был там. У меня там только 2.1 стояла. потом до меня дошло, что скачал только 2.1 . Благодарю за помощь, думаю сейчас всё должно получиться.

Ответить