ContentResolver

  数据在android中是私有的,当然这而数据包括文件数据和数据库数据以及一些其他类型的数据。那么两个程序之间如何进行数据交换呢?解决这个问题主要靠ContentProvider。一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说一个程序可以通过实现ContentProvider的抽象接口将自己的数据暴露出去。外界根本看不到,也就不用看到这个应用暴露的数据在应用当中如何存储的,或者是用数据库存储还是文件存储,还是网络存储。外界可以通过这套标准及统一的接口和程序中的数据打交道,可以操作程序中的数据。
  外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver可以得到当亲的ContentResolver实例。ContentResolver提供的接口和ContentProvider中需要实现的接口对应。在ContentResolver中到相应的接口的话,ContentProvider会执行相应的接口,把结果返回。 
  要读取通讯录,要配置一下权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>

  稍微解释一下代码,首先通过ContentResolver来查询出所有通讯录中的cursor,然后将Cursor传入一个自定义的CursorAdapter,将该adapter绑定给一个AutoCompleteTextView。
package com.kevin.contentresolver;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;

public class Main extends Activity {
	private AutoCompleteTextView autoTextView;
	private TextView tv_result;
	private Cursor cursor;
	private ContactAdapter adapter;
	private ContentResolver resolver;
	// 要去取出通讯录的字段
	public static final String[] PEOPLE_PROJECTION = {
		ContactsContract.Contacts._ID,
		ContactsContract.CommonDataKinds.Phone.NUMBER,
		ContactsContract.Contacts.DISPLAY_NAME
	};
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        autoTextView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        tv_result = (TextView)findViewById(R.id.tv_result);
        // 取得ContentResolver对象
        resolver = getApplication().getContentResolver();
        // 取得通讯录的Cursor
        /*
         * 第一个参数是一个使用content:// scheme的URI
         * 第二个参数是要返回的列名,为空则返回全部
         * 第三个参数是where条件
         * 第四个参数是条件的值
         * 第五个参数是排序
         */
        cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        		PEOPLE_PROJECTION, null, null, null);
        // 将cursor传入自己实现的ContactsAdapter
        adapter = new ContactAdapter(this, cursor);
        autoTextView.setAdapter(adapter);
        autoTextView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id) {
				// 取得Cursor
				Cursor c = adapter.getCursor();
				// 移动到所点击的位置
				c.moveToPosition(position);
				String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
				// 找不到电话时显示无输入电话
				number = number == null ? "无输入电话" : number;
				tv_result.setText(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
								  + "的电话是 " + number);
			}
		});
    }
}

 

你可能感兴趣的:(android)