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.

Другие вопросы по тегам