在应用程序中很多内容是共享的(可以被多个程序访问),如系统的电话本程序,短信,媒体库等程序都实现了数据的共享,当然其使用的就是内容提供器
ContentProvider :主要用于在不同的应用程序之间实现数据共享的功能,允许一个程序访问另一个程序中的数据,同时还能保证数据的安全性,其可以选择对那一部分数据进行共共享,从而保证隐私数据不会泄露。
内容提供器一般有两种用法:
1:使用现有的内容提供器来读取和操作相应程序中的数据,
2:创建自己的内容提供器给我们程序的数据提供外部访问接口。
访问其程序中的数据:
对于每一个引用程序来说,如果想要访问内容提供器中的数据,就一定得借助于ContentResolve类,可以通过Context中的getContentResolve()方法获取该类的实例,ContentResolve提供了对数据进行(增删查改)的方法。不同于SQLiteDatabase , ContentResolve中的增删查改方法都不接受表明参数,而是使用一个Uri参数代替,这个参数被称为内容uri ,内容uri给内容提供器中的数据建立了唯一标识。内容uri可以清楚的表示出我们想要访问那个程序中那张表了的数据。
在得到内容uri字符串后,我们还需要将其解析成uri对象,才可作为参数传入,解析方法非常简单,只需调用uRi.parse()方法,就可以将uri字符串解析成uRi对象。
通过ContentResolve获取手机联系人的姓名,及联系方式
1:在布局文件中添加一个ListView,将读出来的信息展示在ListView上
android1:id="@+id/list_pnum" android1:layout_width="match_parent" android1:layout_height="wrap_content" android1:layout_weight="1" >
在MainActivity.java中完成具体业务处理如下:
public class MainActivity extends Activity {
private ListView list = null;
List
ArrayAdapter
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list_pnum);
adapter = new ArrayAdapter
android.R.layout.simple_list_item_1, contantList);
list.setAdapter(adapter);
readCountacts();
}
private void readCountacts() {
Cursor cursor = null;
try {
cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, null);
while (cursor.moveToNext()) {
// 获取姓名
String name = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
// 获取电话
String number = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contantList.add(name + "\n" + number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
最后,因为读取联系人是要权限的因此在清单文件中添加权限:
然后运行在模拟器上即可
当然首得保证你的通讯录是不为空的,否则将读取空白信息。