Android: как кодировать в зависимости от версии API? - PullRequest
9 голосов
/ 25 ноября 2010

В 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 ]

2 голосов
/ 25 ноября 2010
1 голос
/ 25 ноября 2010

Вы должны использовать отражение ... Идея хорошая, но в вашем коде вы ссылаетесь на LabeledIntent, который недоступен в 1.6.Поэтому, когда ваше приложение работает на устройствах 1.6, оно не может найти класс и вылетает.

Поэтому идея состоит в том, чтобы написать код, который не будет ссылаться на LabeledIntent при работе в 1.6.Для этого вы можете написать класс-оболочку (LabeledIntentWrapper), который расширяет LabeledIntent и вызывает его в вашей функции.Так, в версии 1.6 устройство увидит ссылку на известный класс: LabeledIntentWrapper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...