代码之家  ›  专栏  ›  技术社区  ›  Donal Rafferty

如何对ContactsContract进行编码,使其在2.2版中运行,而不会在1.5版中崩溃?

  •  2
  • Donal Rafferty  · 技术社区  · 15 年前

    在我的Android应用程序中,我有下面一段查找联系人ID的代码,我刚刚将目标从1.5更改为2.2,但minsdk为3(1.5),因此我可以在2.2中使用ContactsContract Uri,在1.5中使用People 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;
    

    我已经看到了如何使用反射来使用多个/不同版本的方法的示例,但是在我想使用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 回复  |  直到 15 年前
        1
  •  1
  •   Codeman    14 年前

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

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

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

    希望这有帮助!