关于内容提供者这一块,又有一些新的认识,然后就做了一个demo,简单说一下这个demo主要有哪些内容,就是通过内容访问者去访问系统的联系人,然后展示在一个ListView上面。其中还要拿到系统提供的uri匹配器,拿到相应的系统表里联系人相对应的数据。
具体类的代码如下:
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private ListView lv_main_listView;
private TextView tv_main_textView;
private ImageView iv_main_imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得内容访问者
contentResolver = getContentResolver();
lv_main_listView = (ListView) findViewById(R.id.lv_main_listView);
tv_main_textView = (TextView) findViewById(R.id.tv_main_textView);
iv_main_imageView = (ImageView) findViewById(R.id.iv_main_imageView);
}
public void getContacts(View view){
//获取联系人raw_Contacts
Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");
Cursor cursor=contentResolver.query(uri,null,null,null,null);
SimpleCursorAdapter simpleCursorAdapter=new SimpleCursorAdapter(this,R.layout.item_list,cursor,new String[]{"_id","display_name"},new int[]{R.id.tv_item_list_id,R.id.tv_item_list_name});
//设置适配器
lv_main_listView.setAdapter(simpleCursorAdapter);
while(cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("display_name"));
Log.i("test",id+" "+name);
//继续获得相对应联系人的数据
Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
Cursor cursorData=contentResolver.query(uriData,null,null,null,null);
while(cursorData.moveToNext()){
String data1=cursorData.getString(cursorData.getColumnIndex("data1"));
//int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id"));
String type=cursorData.getString(cursorData.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/phone_v2".equals(type)){
Log.i("test"," "+data1+" :"+type);
}
}
}
}
//跳到系统页面去选择联系人
public void jumpSystemContacts(View view){
Intent it = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(it,0);
}
public void getPhoto(View view){
//调用相册
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 0:
if (data==null){
return;
}
//处理返回的data,获取选择的联系人信息
Uri uri=data.getData();
String[] contacts=getPhoneContacts(uri);
break;
case 1:
Uri selectedImage = data.getData();
String[] filePathColumns = {MediaStore.Images.Media.DATA};
Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePathColumns[0]);
String imagePath = c.getString(columnIndex);
showImage(imagePath);
c.close();
break;
}
}
//加载图片
private void showImage(String imaePath){
Bitmap bm = BitmapFactory.decodeFile(imaePath);
iv_main_imageView.setImageBitmap(bm);
}
private String[] getPhoneContacts(Uri uri){
String[] contact=new String[2];
//得到ContentResolver对象
ContentResolver cr = getContentResolver();
//取得电话本中开始一项的光标
Cursor cursor=cr.query(uri,null,null,null,null);
if(cursor!=null)
{
cursor.moveToFirst();
//取得联系人姓名
int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
contact[0]=cursor.getString(nameFieldColumnIndex);
//取得电话号码
String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);
if(phone != null){
phone.moveToFirst();
contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
phone.close();
cursor.close();
tv_main_textView.setText(contact[0]+" "+contact[1]);
}else{
return null;
}
return contact;
}
}
再附上xml的代码:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取联系人"
android:onClick="getContacts"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳系统联系人页面"
android:onClick="jumpSystemContacts"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获得照片"
android:onClick="getPhoto"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_main_textView"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/iv_main_imageView"
/>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lv_main_listView"
>
ListView>
还有ListView所需要的xml代码:
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tv_item_list_id"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tv_item_list_name"
android:layout_weight="1"
/>
其实只要知道uri就可以通过内容访问者去得到系统所提供出来的数据,例如去拿系统的照片,短信等都是可以的。