一、基础知识
ContentProvider:为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。
1. 使用表的形式来组织数据
- 无论数据来源是什么,ContentProvider都会认为是一种表。(把数据组织成表格)
2. 提供的方法
- query:查询 - insert:插入 - update:更新 - delete:删除 - getType:得到数据类型 - onCreate:创建数据时调用的回调函数
3. 公共的URI
- 每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。
- Android所提供的ContentProvider都存放在android.provider包当中。
4. 对比分析
虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同。
- 采用文件方式对外共享数据,需要进行文件操作读写数据;
- 采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。
- 使用ContentProvider共享数据的好处是统一了数据访问方式。
内容访问者访问系统联系人,有两种方式,第一种是用Intent跳转系统自带的Activity(就是android系统自带的联系人界面),显示联系人信息。第二种是从系统数据库中得到联系人数据显示到Listview中。这里我只讲第二种 。
main_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.zking.shuanger_android_25_contentprovider2.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取联系人"
android:onClick="getContact"
/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="20dp"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:id="@+id/main_listview"
android:visibility="gone"
>ListView>
LinearLayout>
自定义联系人展示的activity
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_contact"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical"
tools:context="com.zking.shuanger_android_25_contentprovider2.ContactActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:id="@+id/lv_mian"
>ListView>
<TextView
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="#f9aea3"
android:layout_marginTop="16dp"
/>
LinearLayout>
自定义contact_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/contact_item"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/img_mian_logo"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:src="@drawable/olqbank_tx"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:layout_marginTop="10dp"
android:layout_toRightOf="@id/img_mian_logo"
android:id="@+id/text_mian_name"
android:textColor="#292929"
android:text="ggg"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text_mian_name"
android:layout_marginTop="5dp"
android:layout_alignLeft="@id/text_mian_name"
android:layout_marginBottom="10dp"
android:id="@+id/text_mian_tel"
android:textColor="#818080"
android:text="ggg"
/>
RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="#f9aea3"
android:layout_marginTop="5dp"
/>
LinearLayout>
ContactActivity.java
public class ContactActivity extends AppCompatActivity {
/**
* 获取库Phon表字段
**/
private static final String[] PHONES_PROJECTION = new String[]{
Phone.DISPLAY_NAME, Phone.NUMBER, Phone.CONTACT_ID};
/**
* 联系人显示名称
**/
private static final int PHONES_DISPLAY_NAME_INDEX = 0;
/**
* 电话号码
**/
private static final int PHONES_NUMBER_INDEX = 1;
/**
* 联系人的ID
**/
private static final int PHONES_CONTACT_ID_INDEX = 2;
/**
* 联系人名称
**/
private ArrayList mContactsName = new ArrayList();
/**
* 联系人号码
**/
private ArrayList mContactsNumber = new ArrayList();
private ContentResolver cr;
private ListView lv_mian;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact);
//得到内容访问者
cr = getContentResolver();
//得到listView
lv_mian = (ListView) findViewById(R.id.lv_mian);
getPhoneContacts();
lv_mian.setAdapter(new MyAdapter());
lv_mian.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> adapterView, View view, int i, long l) {
Intent intent=new Intent(ContactActivity.this,MainActivity.class);
intent.putExtra("tel",mContactsNumber.get(i));
intent.putExtra("name",mContactsName.get(i));
startActivity(intent);
finish();
}
});
}
/**
* 得到手机通讯录联系人信息
**/
public void getPhoneContacts() {
//获取联系人
Cursor phoneCurso = cr.query(Phone.CONTENT_URI, PHONES_PROJECTION, null, null, null);
if (phoneCurso != null) {
while (phoneCurso.moveToNext()) {
//得到手机号
String phoneNumber = phoneCurso.getString(PHONES_NUMBER_INDEX);
////当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber)) {
continue;
}
//得到联系人的名称
String contactName = phoneCurso.getString(PHONES_DISPLAY_NAME_INDEX);
//得到联系人的ID
Long contactid = phoneCurso.getLong(PHONES_CONTACT_ID_INDEX);
Log.i("test","本地联系人:"+contactName+"###"+phoneNumber);
mContactsName.add(contactName);
mContactsNumber.add(phoneNumber);
}
phoneCurso.close();
}
}
/**
* 得到手机SIM卡联系人人信息
**/
public void getSIMContacts() {
//获取SIM卡联系人
Uri uri = Uri.parse("content://icc/adn");
Cursor cursor = cr.query(uri, PHONES_PROJECTION, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
//得到手机号
String phoneNumber = cursor.getString(PHONES_NUMBER_INDEX);
////当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber)) {
continue;
}
//得到联系人的名称
String contactName = cursor.getString(PHONES_DISPLAY_NAME_INDEX);
Log.i("test","SIM卡联系人:"+contactName+"###"+phoneNumber);
mContactsName.add(contactName);
mContactsNumber.add(phoneNumber);
}
cursor.close();
}
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
Log.i("test","数量:"+mContactsNumber.size());
return mContactsName.size();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
// text_mian_name = null;
// text_mian_tel = null;
if (view == null) {
view = LayoutInflater.from(ContactActivity.this).inflate(R.layout.contact_item, null);
TextView text_mian_name = (TextView) view.findViewById(R.id.text_mian_name);
TextView text_mian_tel = (TextView) view.findViewById(R.id.text_mian_tel);
text_mian_name.setText(mContactsName.get(i));
text_mian_tel.setText(mContactsNumber.get(i));
}
Log.i("test","所有联系人:"+mContactsName.get(i)+"###"+mContactsNumber.get(i));
return view;
}
}
}
MainActivity.xml
public class MainActivity extends AppCompatActivity {
private ListView main_listview;
private List
在清单文件中配置权限
<uses-permission android:name="android.permission.READ_CONTACTS" />