연락처 ID를 찾는 Android 애플리케이션에 다음 코드 조각이 있습니다. 2.2에서 ContactsContract Uri를 사용할 수 있도록 대상을 1.5에서 2.2로 변경했지만 최소 SDK (3) (1.5)로 변경했습니다. 1.5의 인물 Uri.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의?
리플렉션을 사용하여 여러 버전/다른 버전의 메소드를 사용하는 방법을 본 적이 있지만 ContactsContract Uri를 사용하려는 mycase에서 어떻게 사용할 수 있습니까? 여기
내 코드입니다 :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 버전 특정 코드를 래퍼 클래스로 래핑해야합니다. 이것은 5 개월 전의이 SO 질문의 중복입니다 : http://stackoverflow.com/questions/2312321/how-to-use-contacts-api-for-android-1-x-and-2-x - 동시에 –