关于内容提供者这一块,又有一些新的认识,然后就做了一个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就可以通过内容访问者去得到系统所提供出来的数据,例如去拿系统的照片,短信等都是可以的。
新闻热点
疑难解答