android 使用内容提供者获取手机联系人
2016-02-16 10:17
721 查看
最近在学习安卓的相关内容, 正好在写获取手机联系人的程序, 就想到了内容提供者, 这里有几点需要注意, 写到这里, 以后方便自己查询。
1. 手机联系人的数据库是存储在 data/data/com.android.providers.contacts/database下
contact2.db的, 利用sqlite3 打开数据库, 我们可以方便的看到我们需要的几张表, raw_contact, contact, data, mimetype表
2. 分析表格我们知道 mimetype 决定了后面的data1 所表示内容, 我们只需要根据 raw_contact_id, 提取相应记录的 mimetype, data1, 即可获取我们需要的联系人的信息了。
3. 网上的很多方法, 都是直接写 “ content://com.android.contacts/data” , 来解析uri, 个人不太喜欢这种方式, 于是查了下sdk, 使用Data.content_uri, 实质是一样的, 这里做个说明。
4. 下面的代码,getContactData, 主要用来获取手机联系人的姓名和电话号码, 基本思想在 (2) 中阐述了, onCreate中 使用 simpleAdapter, 将获取的联系人数据填入到相应的控件位置中去。
5. 安卓环境为 android4.2.2, 界面显示有些丑陋, 不过我已经尽力了<-_->!!
6. 运行效果:
1. 手机联系人的数据库是存储在 data/data/com.android.providers.contacts/database下
contact2.db的, 利用sqlite3 打开数据库, 我们可以方便的看到我们需要的几张表, raw_contact, contact, data, mimetype表
2. 分析表格我们知道 mimetype 决定了后面的data1 所表示内容, 我们只需要根据 raw_contact_id, 提取相应记录的 mimetype, data1, 即可获取我们需要的联系人的信息了。
3. 网上的很多方法, 都是直接写 “ content://com.android.contacts/data” , 来解析uri, 个人不太喜欢这种方式, 于是查了下sdk, 使用Data.content_uri, 实质是一样的, 这里做个说明。
4. 下面的代码,getContactData, 主要用来获取手机联系人的姓名和电话号码, 基本思想在 (2) 中阐述了, onCreate中 使用 simpleAdapter, 将获取的联系人数据填入到相应的控件位置中去。
5. 安卓环境为 android4.2.2, 界面显示有些丑陋, 不过我已经尽力了<-_->!!
6. 运行效果:
public class Setup3ActivitySelectContact extends Activity { private static final String TAG = "Setup3ActivitySelectContact"; private ListView lv_contacts; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_safe_setup3_contacts); lv_contacts = (ListView) findViewById(R.id.lv_contacts); List<Map<String,String>> data = getContactsData(); ListAdapter adapter = new SimpleAdapter(this, data, R.layout.activity_safe_setup3_contacts_item, new String[]{"name", "phone"}, new int[]{R.id.name, R.id.phone}); lv_contacts.setAdapter(adapter); } private List<Map<String, String>> getContactsData() { // TODO Auto-generated method stub ContentResolver resolver = getContentResolver(); // get the raw_contact_id Cursor cursor = resolver.query(RawContacts.CONTENT_URI, new String[]{RawContacts._ID}, null, null, null); List<Map<String, String>> list = new ArrayList(); while (cursor.moveToNext()){ //Log.d(TAG, cursor.getString(0)); long id = cursor.getLong(0); Map<String, String> item = new HashMap(); // base on the raw_contact_id select the data1 and mimetype Cursor cursor2 = resolver.query(Data.CONTENT_URI, new String[]{Data.DATA1, Data.MIMETYPE}, Data.RAW_CONTACT_ID + "=?", new String[]{id + ""}, null); while (cursor2.moveToNext()){ String type = cursor2.getString(1); String data = cursor2.getString(0); if (CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE.equals(type)){ item.put("name", data); } else if (CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(type)){ item.put("phone", data); } } list.add(item); } return list; } }
相关文章推荐
- Can not perform this action after onSaveInstanceState
- [Android] AS 中 Gradle 配置运行浅析
- 认清Android Studio下的Gradle是什么
- Android Studio ADB响应失败 Waiting for adb
- Mac OS下Android开发环境配置详解
- Android Studio新建工程时SDK缺少extra-android-m2repository解决办法
- Android电源管理-休眠简要分析
- Android获取屏幕或View宽度和高度的方法
- 优化布局在Android–减少过度渲染
- Android蓝牙4.0BLE
- 查看android api的网址,速度非常快
- android安全添加新版本中的代码
- 2016_完整的Android课程
- Android快速开发(2)
- 干货分享:分析Android应用使用的技术框架和开源库
- 刮刮卡的实现
- Android Studio系列教程四--Gradle基础
- Android 下的EXIF
- 使用帧动画在5.0以上不会自动播放
- android布局属性详解