我有以下在我的Android應用,查找聯繫人ID的代碼,我只是改變了目標爲1.5〜2.2,但以3(1.5)一分鐘SDK,這樣我可以在2.2使用ContactsContract烏里和人民Uri在1.5。如何編寫ContactsContract以便它在2.2中運行並且不會崩潰1.5?
然而,這些代碼將導致當在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?
我已經看到了如何使用反射來使用多個/不同版本的方法例子的,但我怎麼可以用它在mycase,我想用ContactsContract烏里?
這裏是我的代碼:
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));
}
});
編輯:
下面是它如何工作的一個示例:
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;
}
}
你必須包裝任何特定的SDK版本代碼的包裝類,最有可能的。這就是一個重複的SO 5個月前的問題,但:http://stackoverflow.com/questions/2312321/how-to-use-contacts-api-for-android-1-x-and-2-x - 同時 – 2010-07-27 14:28:26