详解:
今天我们讲解的是ContentProvider关于系统的提供,如果你想了解自定义的提供者与访问者的话你可以百度一下,因为那个比较简单而且我们用到的几率是很小的,我们一般都会用系统提供的,像我们平时用的联系人,图库,音乐等,都是系统自己提供的,我们不需要去写只要调用它就可以了,话说ContentProvider是什么呢?它是我们的Android端四大组件之一,下面我们就来实践吧
实践:
我们就来实践获取联系人和获取短信吧
我们先用listview把数据排列出来,写个xml布局文件
<LinearLayout tools:context="com.example.g160828_android23_systemprovider.MainActivity" android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
<Button android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="获取联系人"
android:onClick="getContacast"/>
<Button android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="获取信息"
android:onClick="getsms"/>
<ListView android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/lv_main_syspro">
</ListView>
</LinearLayout>
在ainActivity获取控件,并得到数据
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private List<String> list=new ArrayList();
private ListView lv_main_syspro;
private MyAdapter m;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
lv_main_syspro = (ListView) findViewById(R.id.lv_main_syspro);
contentResolver = getContentResolver();
//设置设配器
m = new MyAdapter();
lv_main_syspro.setAdapter(m);
}
//得到联系人方法
blic void getContacast(View view) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); //<1>content://com.android.contacts/raw_contacts(获得联系人的id,姓名)这是系统里面的地址
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("display_name"));
Log.i("test", id + " " + name); //得到联系人id和姓名
Uri uri1=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
<2>content://com.android.contacts/raw_contacts/"+id+"/data(根据联系人的id获得联系人的信息)
Cursor cursor1=contentResolver.query(uri1,null,null,null,null);
while (cursor1.moveToNext()){
String phone=cursor1.getString(cursor1.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/phone_v2".equals(phone)){
String data=cursor1.getString(cursor1.getColumnIndex("data1")); //得到联系人电话,因为系统表的结构是这样的所以我们需要先判断一个表里面的字段是否与电话地址一样
Log.i("test"," "+data);
list.add(name);
list.add(data);
}
}
}
m.notifyDataSetChanged();
}
//得到短信方法
public void getsms(View view){
Uri urisms = Uri.parse("content://sms/"); //短信协议地址
Cursor cursor = contentResolver.query(urisms, null, null, null, null);
while(cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String address=cursor.getString(cursor.getColumnIndex("address"));
String body=cursor.getString(cursor.getColumnIndex("body"));
Log.i("test",id+" "+address +body);
list.add(address);
list.add(body);
}
m.notifyDataSetChanged();
}
class MyAdapter extends BaseAdapter{
private TextView tv_main_mylist;
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if (view==null){
view=getLayoutInflater().inflate(R.layout.activity_mylist,null); //把布局文件转换为view
//我们需要重写一个布局文件,里面放一个文本框就可以了,用来输出数据,如果你不想自己写的话就可以引用系统的布局,但是别把id获取错误了
tv_main_mylist = (TextView) view.findViewById(R.id.tv_main_mylist);
}
tv_main_mylist.setText(""+list.get(i));
return view;
}
}
}
别忘记配置权限哦
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>