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