2010-11-25 1 views
9

В Android я получаю версию SDK легко (Build.VERSION.SDK), но мне нужно использовать LabeledIntent только если платформа новее, чем 1,6 (>Build.VERSION_CODES.DONUT)Android: как закодировать в зависимости от версии API?

Я полагаю, что Reflection надо (я прочитал this link но не понятно для класса или для меня).

Это код, но это дает мне исключение, потому что в моем 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 LEVEL вы добавляете один класс, который использует УРОВЕНЬ API или другой класс, который использует другой уровень API LEVEL. Единственная деталь, которую один новичок может забыть, заключается в том, что вам нужно скомпилировать приложение с помощью новейшего 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 Level 5. В LabeledIntentOld, можно реализовать еще один вид контроля, в моем случае, я вернусь сам замысел без ничего не делая Больше.

Вызов этого класса делается так:

LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent); 
+0

Какую версию рамки вы используете в проекте? – Flo 2010-11-25 13:17:42

+0

@ Flo.- Мой AndroidManifest определяет minSdkVersion = "4". LabeledIntent включен только в SDK с уровня API 5. – netadictos 2010-11-25 13:34:25

+0

Да, но какая версия каркаса на самом деле используется в вашем проекте? minSdkVersion - это просто метаинформация в файле манифеста. Когда вы создали свой проект, вы должны выбрать версию рамки в диалоговом окне создания. – Flo 2010-11-25 13:40:22

ответ

1

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

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

Смежные вопросы