2010-07-27 2 views
2

연락처 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; 

    } 
    } 
+1

SDK 버전 특정 코드를 래퍼 클래스로 래핑해야합니다. 이것은 5 개월 전의이 SO 질문의 중복입니다 : http://stackoverflow.com/questions/2312321/how-to-use-contacts-api-for-android-1-x-and-2-x - 동시에 –

답변

1

문서의 정의에서이 데모 : 여기

그 수행 방법의 예입니다 2 개의 다른 SDK 고유의 cl의 친 클래스 API 수준 3/4 및 API 수준 5 이상에서 작동합니다.

이것은 연락처와 ContactsContract의 차이점을 이해하고 래퍼 클래스에서 OS API 레벨을 가져 와서 암시 적으로 사용할 수있게 해줍니다. 이 도움이

http://developer.android.com/resources/samples/BusinessCard/index.html

희망!

+0

답이 맞다면 올바른 것으로 표시하고 줄여주세요. 그건 내가 도움이 될 수있어서 기뻤다! 나는 최근에 같은 일로 어려움을 겪고 있었다. – Codeman