2010-07-27 4 views
2

J'ai le morceau de code suivant dans mon application Android qui recherche un ID de contact, je viens de changer la cible de 1.5 à 2.2 mais avec un SDK min de 3 (1.5) pour pouvoir utiliser le ContactsContract Uri dans 2.2 et le peuple Uri en 1.5.Comment coder ContactsContract pour qu'il s'exécute en 2.2 et ne plante pas 1.5?

Cependant le code conduit à l'erreur suivante lorsqu'il est exécuté sur 1,5 appareils:

07-27 15:02:53.382: WARN/dalvikvm(12656): VFY: unable to resolve static field 25 (CONTENT_URI) in Landroid/provider/ContactsContract$Contacts; 

de Google J'ai recueilli que je dois utiliser la réflexion dans ce cas pour permettre la course sur les deux versions de l'application d'Android?

J'ai vu des exemples de comment utiliser la réflexion pour utiliser des méthodes de versions multiples/différentes mais comment puis-je l'utiliser dans mycase où je veux utiliser le Uri ContactsContract?

Voici mon code:


findViewById(R.id.contactimage).setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

        String sdk = android.os.Build.VERSION.SDK; 
        Uri contactUri; 
        Log.d("CDA", "Contact ID Button pressed = " + contactId); 
        if(sdk.equals("8")){ 
         contactUri = ContentUris.withAppendedId 
         (ContactsContract.Contacts.CONTENT_URI, contactId); 

         Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); 
         startActivity(intent); 

        } 
        else{ 
        contactUri = ContentUris.withAppendedId 
        (People.CONTENT_URI, contactId); 

        Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); 
        startActivity(intent); 
        } 

        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD)); 
        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); 
       } 
     }); 

EDIT:

Voici un exemple de la façon dont son fait:

private static Uri CONTENT_URI=null; 
private static String NAME_URI=null; 
private static String ID_URI=null; 
private static String NUMBER_URI = null; 
private static Uri PHONE_LOOKUP = null; 
static int sdk; 
static { 
    sdk=new Integer(Build.VERSION.SDK).intValue(); 

    if (sdk>=5) { 
    try { 
    Class clazz=Class.forName("android.provider.ContactsContract$CommonDataKinds$Phone"); 
    Class clazz_phonelookup=Class.forName("android.provider.ContactsContract$PhoneLookup"); 

    NAME_URI=(String)clazz.getField("DISPLAY_NAME").get(clazz); 
    ID_URI=(String)clazz.getField("_ID").get(clazz); 

    NUMBER_URI=(String)clazz.getField("NUMBER").get(clazz); 
    PHONE_LOOKUP =(Uri)clazz_phonelookup.getField("CONTENT_FILTER_URI").get(clazz); 


    } 
    catch (Throwable t) { 
    Log.e("reflection", "Exception when determining CONTENT_URI", t); 
    } 
    } 
    else { 
    CONTENT_URI=Contacts.People.CONTENT_URI; 

    NAME_URI=People.NAME; 
    ID_URI=People._ID; 

    NUMBER_URI=People.NUMBER; 
    PHONE_LOOKUP = null; 

    } 
    } 
+1

Vous devrez probablement envelopper le code spécifique à la version du SDK dans une classe wrapper. Ceci est un doublon de cette question SO il y a 5 mois, cependant: http://stackoverflow.com/questions/2312321/how-to-use-contacts-api-for-android-1-x-and-2-x -simultanément –

Répondre

1

Cette démonstration de la définit de documentation une classe parente pour deux cl différents du SDK asses qui fonctionnent pour les niveaux API 3/4 et API niveaux 5+.

Cela m'a aidé à comprendre les différences entre Contacts et ContactsContract, et permet d'utiliser à la fois implicitement en obtenant le niveau de l'API OS dans la classe wrapper.

http://developer.android.com/resources/samples/BusinessCard/index.html

Hope this helps!

+0

Si vous trouvez une réponse correcte, veuillez l'augmenter et la corriger. Cela dit, content de pouvoir aider! J'avais lutté avec la même chose récemment. – Codeman

Questions connexes