2010-07-27 13 views
2

我有以下在我的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; 

    } 
    } 
+1

你必須包裝任何特定的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

回答

1

這個演示從文檔中定義一個父類,用於兩個不同的SDK特定的cl評分適用於API等級3/4和API等級5+。

這幫助我理解了聯繫人和ContactsContract之間的差異,並允許兩個隱含使用通過獲取包裝類的OS API級別。

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

希望這有助於!

+0

如果您發現答案正確,請將其加註並標記爲正確。 這就是說,很高興我能幫助!我最近一直在苦苦掙扎。 – Codeman 2011-06-30 18:06:36

相關問題