Android 如何对ContactsContract进行编码,使其在2.2中运行,而不会';t崩溃1.5?

Android 如何对ContactsContract进行编码,使其在2.2中运行,而不会';t崩溃1.5?,android,cross-platform,contactscontract,Android,Cross Platform,Contactscontract,在我的Android应用程序中,我有下面一段查找联系人ID的代码,我刚刚将目标从1.5更改为2.2,但最小SDK为3(1.5),因此我可以使用2.2中的ContactsContract Uri和1.5中的People Uri 但是,在1.5设备上运行时,该代码会导致以下错误: 07-27 15:02:53.382: WARN/dalvikvm(12656): VFY: unable to resolve static field 25 (CONTENT_URI) in Landroid/prov

在我的Android应用程序中,我有下面一段查找联系人ID的代码,我刚刚将目标从1.5更改为2.2,但最小SDK为3(1.5),因此我可以使用2.2中的ContactsContract Uri和1.5中的People Uri

但是,在1.5设备上运行时,该代码会导致以下错误:

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

从谷歌那里我了解到,在这种情况下,我需要使用反射来允许应用程序在两个版本的Android上运行

我已经看到了如何使用反射来使用多个/不同版本的方法的示例,但是在我想使用ContactsContract Uri的mycase中如何使用它

这是我的密码:



编辑:

下面是一个示例,说明了如何执行此操作:

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;

     }
     }

文档中的这个演示为适用于API级别3/4和API级别5+的两个不同SDK特定类定义了一个父类

这有助于我理解Contacts和ContactsContract之间的区别,并允许通过在包装类中获取OS API级别来隐式地使用这两者


希望这有帮助

很可能,您必须将任何特定于SDK版本的代码包装在包装器类中。这是5个月前这个问题的翻版:如果你发现一个答案是正确的,请把它投上一票,并把它标为正确。也就是说,很高兴我能帮忙!我最近一直在为同样的事情挣扎。
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;

     }
     }