如何编码ContactsContract使其在2.2中运行并且不会崩溃1.5?

时间:2010-07-27 14:06:15

标签: android cross-platform contactscontract

我的Android应用程序中有以下代码,用于查找联系人ID,我刚刚将目标从1.5更改为2.2,但最小SDK为3(1.5),以便我可以使用ContactsContract Uri 2.2和1.5中的人民Uri。

但是,在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 个答案:

答案 0 :(得分:1)

该文档中的演示为两个不同的SDK特定类定义了一个父类,这些类适用于API级别3/4和API级别5 +。

这有助于我理解Contacts和ContactsContract之间的区别,并允许通过在包装类中获取OS API级别来隐式使用它们。

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

希望这有帮助!