android 获取系统联系人并展示在ListView上

关于内容提供者这一块,又有一些新的认识,然后就做了一个demo,简单说一下这个demo主要有哪些内容,就是通过内容访问者去访问系统的联系人,然后展示在一个ListView上面。其中还要拿到系统提供的uri匹配器,拿到相应的系统表里联系人相对应的数据。
具体类的代码如下:

public class MainActivity extends AppCompatActivity {

    private ContentResolver contentResolver;
    private ListView lv_main_listView;
    private TextView tv_main_textView;
    private ImageView iv_main_imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得内容访问者
        contentResolver = getContentResolver();

        lv_main_listView = (ListView) findViewById(R.id.lv_main_listView);
        tv_main_textView = (TextView) findViewById(R.id.tv_main_textView);
        iv_main_imageView = (ImageView) findViewById(R.id.iv_main_imageView);
    }

    public void getContacts(View view){
        //获取联系人raw_Contacts
        Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");
        Cursor cursor=contentResolver.query(uri,null,null,null,null);

        SimpleCursorAdapter simpleCursorAdapter=new SimpleCursorAdapter(this,R.layout.item_list,cursor,new String[]{"_id","display_name"},new int[]{R.id.tv_item_list_id,R.id.tv_item_list_name});
        //设置适配器
        lv_main_listView.setAdapter(simpleCursorAdapter);

        while(cursor.moveToNext()){
            int id=cursor.getInt(cursor.getColumnIndex("_id"));
            String name=cursor.getString(cursor.getColumnIndex("display_name"));
            Log.i("test",id+" "+name);

            //继续获得相对应联系人的数据
            Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
            Cursor cursorData=contentResolver.query(uriData,null,null,null,null);
            while(cursorData.moveToNext()){
                String data1=cursorData.getString(cursorData.getColumnIndex("data1"));
                //int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id"));
                String type=cursorData.getString(cursorData.getColumnIndex("mimetype"));
                if ("vnd.android.cursor.item/phone_v2".equals(type)){
                    Log.i("test","      "+data1+" :"+type);
                }
            }
        }
    }
    //跳到系统页面去选择联系人
    public void jumpSystemContacts(View view){
        Intent it = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
        startActivityForResult(it,0);

    }

    public void getPhoto(View view){
        //调用相册
        Intent intent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, 1);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 0:
                if (data==null){
                    return;
                }
                //处理返回的data,获取选择的联系人信息
                Uri uri=data.getData();
                String[] contacts=getPhoneContacts(uri);
                break;
            case 1:
                Uri selectedImage = data.getData();
                String[] filePathColumns = {MediaStore.Images.Media.DATA};
                Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
                c.moveToFirst();
                int columnIndex = c.getColumnIndex(filePathColumns[0]);
                String imagePath = c.getString(columnIndex);
                showImage(imagePath);
                c.close();
                break;
        }


    }

    //加载图片
    private void showImage(String imaePath){
        Bitmap bm = BitmapFactory.decodeFile(imaePath);
        iv_main_imageView.setImageBitmap(bm);
    }

    private String[] getPhoneContacts(Uri uri){
        String[] contact=new String[2];
        //得到ContentResolver对象
        ContentResolver cr = getContentResolver();
        //取得电话本中开始一项的光标
        Cursor cursor=cr.query(uri,null,null,null,null);
        if(cursor!=null)
        {
            cursor.moveToFirst();
            //取得联系人姓名
            int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            contact[0]=cursor.getString(nameFieldColumnIndex);

            //取得电话号码
            String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);
            if(phone != null){
                phone.moveToFirst();
                contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            }
            phone.close();
            cursor.close();

           tv_main_textView.setText(contact[0]+"   "+contact[1]);

        }else{
            return null;
        }
        return contact;
    }
}

再附上xml的代码:

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取联系人"
        android:onClick="getContacts"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳系统联系人页面"
        android:onClick="jumpSystemContacts"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获得照片"
        android:onClick="getPhoto"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_main_textView"
        />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv_main_imageView"
        />
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/lv_main_listView"
        >
    ListView>

还有ListView所需要的xml代码:

<TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/tv_item_list_id"
        android:layout_weight="1"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/tv_item_list_name"
        android:layout_weight="1"
        />

其实只要知道uri就可以通过内容访问者去得到系统所提供出来的数据,例如去拿系统的照片,短信等都是可以的。

你可能感兴趣的:(android)