2010-11-25 21 views
9

Dans Android-je obtenir la version du SDK facilement (Build.VERSION.SDK) mais je dois utiliser LabeledIntent que si la plate-forme est plus récente que 1,6 (>Build.VERSION_CODES.DONUT)Android: comment coder selon la version de l'API?

Je suppose que la réflexion est nécessaire (j'ai lu this link mais il est pas clair pour une classe ou pour moi).

Voici le code mais il me donne une exception parce que dans mon Android 1.6, le compilateur vérifie si le package existe même si la condition est pas appliquée:

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); 
    } 

COMMENT je l'ai résolu, QUELQUES NOTES À LA BONNE RÉPONSE

@Commonsware montre moi la façon de le faire. Nous créons une classe de pont de sorte qu'en fonction de l'API LEVEL, vous installez une classe qui utilise un NIVEAU d'API ou une autre classe qui utilise une autre NIVEAU d'API. Le seul détail qu'un débutant pourrait oublier est que vous devez compiler votre application avec le nouveau SDK que vous êtes en train de faire référence.

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()); 
} 
} 

Ainsi, dans le LabeledIntentNew, je compris tout le code qui fait référence à LabeledIntent uniquement disponible dans l'API NIVEAU 5. Dans LabeledIntentOld, je peux mettre en œuvre un autre type de contrôle, dans mon cas, je retourne l'intention elle-même sans rien faire plus.

L'appel à cette classe se fait comme ceci:

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

Quelle version du framework utilisez-vous dans votre projet? – Flo

+0

@ Flo.- Mon AndroidManifest définit minSdkVersion = "4". LabeledIntent est uniquement inclus dans le SDK à partir de API LEVEL 5 sur. – netadictos

+0

Oui, mais quelle version du framework utilise réellement dans votre projet? minSdkVersion est juste une méta-information dans le fichier manifeste. Lorsque vous avez créé votre projet, vous devez avoir sélectionné une version de cadre dans la boîte de dialogue de création. – Flo

Répondre

2

suivre le modèle de classe wrapper documented in the page you linked to above.

+0

Je ne vois pas clairement. Dans le lien, ils utilisent la méthode Debug.class.getMethod(), qui serait la méthode pour récupérer la classe LabeledIntent? Merci de fournir du code. – netadictos

+0

@netadictos: Consultez https://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ pour une autre approche du problème. – CommonsWare

+0

cela peut m'aider d'une autre manière la façon dont vous créez des fileurs, mais pour rendre compatible le code que vous m'indiquez ne compile pas pour 1.6, car quand j'utilise l'Android 1.6, il ne reconnaît pas la classe android.provider.ContactsContract. Doit-il être compilé pour 2.2 et cela fonctionne sur les téléphones 1.6? – netadictos

1

Vous devez utiliser la réflexion ... L'idée est bonne, mais dans votre code, vous faites référence à LabeledIntent qui n'est pas disponible en 1.6. Ainsi, lorsque votre application s'exécute sur 1,6 périphériques, elle ne peut pas trouver la classe et se bloque. Donc, l'idée est d'écrire du code où vous ne vous référez pas à LabeledIntent lors de l'exécution en 1.6. Pour ce faire, vous pouvez écrire une classe wrapper (LabeledIntentWrapper) qui étend LabeledIntent et l'appelle dans votre fonction. Ainsi, en 1.6, le périphérique verra une référence à une classe connue: LabeledIntentWrapper.

+0

le problème est que vous utilisez la référence à LabeledIntent de toute façon. C'est pourquoi je parle de réflexion, c'est essentiel, mais je ne sais vraiment pas comment l'implémenter car elle a des paramètres. – netadictos