Android 如何对ContactsContract进行编码,使其在2.2中运行,而不会';t崩溃1.5?
在我的Android应用程序中,我有下面一段查找联系人ID的代码,我刚刚将目标从1.5更改为2.2,但最小SDK为3(1.5),因此我可以使用2.2中的ContactsContract Uri和1.5中的People Uri 但是,在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
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;
}
}