一.内容提供器基本概念
内容提供器主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。详细资料请看下图:
二.示例代码
2.1 读取系统联系人
其实很多时候我们用到ContentProvider并不是自己暴露自己的数据,更多的时候通过ContentResolver来读取其他应用的信息,最常用的莫过于读取系统APP,信息,联系人, 多媒体信息等!如果你想来调用这些ContentProvider就需要自行查阅相关的API资料了! 另外,不同的版本,可能对应着不同的URL!这里给出如何获取URL与对应的数据库表的字段, 这里以最常用的联系人为例。哈哈哈哈~我们还是开始动手吧!
编写一个布局文件,读取出来的的联系人信息能够在ListView中显示,代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/lvContacts" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
编写一个Activity,用来读取数据,展示数据,代码如下所示:
package com.nyl.contentprovidercontacts; import android.app.Activity; import android.database.Cursor; import android.provider.ContactsContract; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private ListView lvContacts; private ArrayAdapter<String> arrayAdapter; private List<String> contactsList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvContacts = (ListView) findViewById(R.id.lvContacts); arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList); lvContacts.setAdapter(arrayAdapter); readContacts(); } /** * 读取联系人 */ private void readContacts() { Cursor cursor = null; //查询联系人数据 cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null,null); //循环cursor中的数据 while (cursor.moveToNext()){ //获取联系人名字 String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); //获取联系人手机号 String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); //将数据添加到contactsList集合 contactsList.add(displayName+" "+number); } } }
别忘了加读联系人的权限,代码如下:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
加入了android.permission.READ_CONTACTS的权限,程序就可以访问到系统的联系人数据,效果如下: