Android: как кодировать в зависимости от версии API?
В Android я легко получаю версию SDK (Build.VERSION.SDK
) но мне нужно использовать LabeledIntent, только если платформа новее 1.6 (>Build.VERSION_CODES.DONUT
)
Я полагаю, что Reflection необходим (я прочитал эту ссылку, но она не ясна ни для класса, ни для меня).
Это код, но он дает мне исключение, потому что в моем Android 1.6 компилятор проверяет, существует ли пакет, даже если условие не применяется:
Intent theIntent=....;
if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT)
{
try{
Intent intentChooser = Intent.createChooser(intent,"Choose between these programs");
Parcelable[] parcelable = new Parcelable[1];
parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0);
intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable);
activity.startActivity(intentChooser);
}
catch(Exception e)
{
activity.startActivity(theIntent);
}
} else
{
activity.startActivity(intentMedicamento);
}
КАК Я РЕШЕН, НЕКОТОРЫЕ ЗАМЕЧАНИЯ К ПРАВИЛЬНОМУ ОТВЕТУ
@Commonsware покажи мне, как это сделать. Мы создаем класс моста, чтобы в зависимости от уровня API вы устанавливали один класс, который использует уровень API, или другой класс, который использует другой уровень API. Единственная деталь, которую может забыть новичок, - это то, что вы должны скомпилировать свое приложение с самым новым SDK, который вы собираетесь использовать.
public abstract class LabeledIntentBridge {
public abstract Intent BuildLabeledIntent(String URL, Intent theintent);
public static final LabeledIntentBridge INSTANCE=buildBridge();
private static LabeledIntentBridge buildBridge() {
int sdk=new Integer(Build.VERSION.SDK).intValue();
if (sdk<5) {
return(new LabeledIntentOld());
}
return(new LabeledIntentNew());
}
}
Так что в LabeledIntentNew
Я включил весь код, который относится к LabeledIntent
доступно только в API УРОВЕНЬ 5. В LabeledIntentOld
Я могу реализовать другой вид контроля, в моем случае я возвращаю само намерение, не делая ничего больше.
Вызов этого класса делается так:
LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent);
2 ответа
Следуйте шаблону класса оболочки, задокументированному на странице, на которую вы ссылались выше.
Вы должны использовать отражение... Идея хорошая, но в вашем коде вы ссылаетесь на LabeledIntent, который недоступен в 1.6. Поэтому, когда ваше приложение работает с устройствами 1.6, оно не может найти класс и вылетает.
Таким образом, идея состоит в том, чтобы написать код, в котором вы не обращаетесь к LabeledIntent при запуске в 1.6. Для этого вы можете написать класс-оболочку (LabeledIntentWrapper), который расширяет LabeledIntent и вызывает его в вашей функции. Итак, в 1.6 устройство увидит ссылку на известный класс: LabeledIntentWrapper.