ContentProvider 简介

1. 介绍:四大组件之一,与Activity 和 Service 相同,使用前是需要注册的;

2. 作用:需要将自己的数据暴露给其他应用程序使用时,该程序就可以通过提供ContentProvider 来实现,其他的应用程序就可以通过ContentResolver 来操作Content Provider 暴露的数据; 开放了应用程序不需要启动,其他应用程序都可以操作开放的数据,包括增删该查;

3. 开发步骤:
a) 继承Android 的 ContentProvider 基类实现自己的ContentProvider 类;
b) 在主配置文件中注册,并制定以下信息:
i. Uri : 类似于访问中使用的URL 地址;
ii. Uri 以content//: 固定开头,包括注册时指定的路径和资源;
iii. 为每个Uri指定访问时需要返回的数据和其他操作;

4. 提示:应用程序使用ContentRsolver 通过ContentProvider 的Uri 访问开放的数据;

5. 案例 - ---- 访问手机通讯簿
a) 主表介绍:
i. Raw_contacts :这个表放的是联系人的唯一标识ID ,靠外键进行对应
ii. Data: 存放的是具体的信息 ,各种数据
iii. Contacts: 这个表放的是一条条的联系人,主要存的是display_name,没有号码。
iv. Calls 表: 存放的的呼叫记录;

6. Uri:
a) 管理联系人的Uri: ContactsContract.Contacts.CONTENT_URI
b) 管理联系人电话的Uri:ContactsContract.CommonDataKinds.phone.CONTENT_URL
c) 管理联系人Email 的 Uri:ContactsContract.CommonDataKinds.Email.CONTENT_URL


7. 使用通讯簿的权限:
    a)  <uses-permission android:name=”android.permission.READ_CONACTS”/>    b)  <uses-permission.android:name=”android.permission.WRITE_CONTACTS”/>




下列代码演示如何获取手机通讯簿中的数据以及插入数据:
<!-- 权限:用于读取系统通讯簿 -->


<uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_CONTACTS"/>



// 主程序代码public class MainActivity extends Activity {    private Button getInfo,add;        // 程序入口    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                add = (Button) findViewById(R.id.add);        getInfo = (Button) findViewById(R.id.getInfo);                getInfo.setOnClickListener(new OnClickListener() {                        public void onClick(View v) {                                Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);                for (cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()) {                    int _id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));  // ID 编号                    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // 姓名                    Toast.makeText(MainActivity.this,"编号:"+_id+"\n姓名:"+name , 1000).show();                }            }        });                add.setOnClickListener(new OnClickListener() {                        public void onClick(View v) {                                // 插入数据前必须先在 rawContactID 占一个空位                ContentValues cv = new ContentValues();                Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, cv); // 返回的是一个Uri                                // 解析出ID 的值 -- 占位的ID 值,记录标识的是属于哪一个人                long rawContactID = ContentUris.parseId(rawContactUri);                                // 根据对应的ID 值,插入数据                                /* 插入姓名 */                cv.clear();                cv.put(Data.RAW_CONTACT_ID, rawContactID);                /*  mimitype_id 字段,用于描述此数据的类型:姓名、电话号码、e_mail...  */                cv.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);                cv.put(StructuredName.GIVEN_NAME, "xiaobaibai"); // 具体数据                getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, cv);                                /* 向data表中插入电话数据 */                cv.clear();                cv.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactID);                cv.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);  // 号码的数据类型                cv.put(Phone.NUMBER, "19915200");   // 号码                cv.put(Phone.TYPE, Phone.TYPE_MOBILE); // 号码类型为手机号                getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, cv);                                /* 向Data 中插入Email 数据 */                cv.clear();                cv.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactID); // 对应的ID                 cv.put(ContactsContract.Contacts.Data.MIMETYPE,Email.CONTENT_ITEM_TYPE); // 数据类型                cv.put(Email.DATA, "hao123@qq.com"); // 数据                cv.put(Email.TYPE,Email.TYPE_WORK); // Email 类型,工作,家庭                getContentResolver().insert(ContactsContract.Data.CONTENT_URI,cv); }        });                    }}

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. sharedPreferences保存数据和TextWatcher监听输入框的技术介绍
  5. listView单选实现(一)
  6. Android(安卓)publickey获取
  7. android content provider概述
  8. mac下配置Android开发环境完全指南
  9. Android(安卓)完全退出应用程序back和home键

随机推荐

  1. php echo什么意思
  2. 如何下载php开源代码
  3. USDT PHP开发包OmniTool简介
  4. php中什么是魔术引号
  5. php如何设置日期
  6. php之日期时间操作一箩筐
  7. wampserver怎么下载
  8. PHP如何实现短网址
  9. php适合做微服务么
  10. php array_chunk函数怎么用