Android Api Demos登顶之路(十四)Quick Contacts

Android Api Demos登顶之路(十四)Quick Contacts

分类:Android ApiDemos

这个demeo主要演示的是使内容提供者和内容解析者来获取其它应用的数据。Content Provider为不同应用之间共享数据提供了统一的接口,,Android系统的每个Content Provider都定义了一个CONTENT_URI,Android中每个Context对象(如Activity)对含有一个ContentResolver,ContentResolver可以根据CONTENT_URI获取对应的Content Provider。 在本例中使用了startManagingCursor(c);对cursor进行托管,但在android3.0以后推出了更为安全和灵活的cursor管理方式,即使用LoaderManager,本例就是在原有的基础上进行了改造,使用LoaderManager来完成这个demo。 在本例中让ManiActivity继承了ListActivity,所以需要去掉setContentView(),不然会报错。 activity_main.xml只做为了listActivity的每个条目的布局。在这里使用了QuickContactBadge组件,该组件继承ImageView,用于显示联系人左侧的图标。

======”@drawable/ic_launcher”style=”?android:attr/quickContactBadgeStyleSmallWindowSmall”/><TextView==>

MainActivity:这里使用了ResourceCursorAdapter的子类作为listActivity的适配器。

{String[] CONTACTS_SUMMARY_PROJECTION = new String[] {Contacts._ID,// 0Contacts.DISPLAY_NAME,// 1Contacts.STARRED,// 2Contacts.TIMES_CONTACTED,// 3Contacts.CONTACT_PRESENCE,// 4Contacts.PHOTO_ID,// 5Contacts.LOOKUP_KEY,// 6Contacts.HAS_PHONE_NUMBER // 7};SUMMARY_ID_COLUMN_INDEX = 0;SUMMARY_NAME_COLUMN_INDEX = 1;SUMMARY_STARRED_COLUMN_INDEX = 2;SUMMARY_TIMES_CONTACTED_COLUMN_INDEX = 3;SUMMARY_CONTACT_PRESENCE_COLUMN_INDEX = 4;SUMMARY_PHOTO_ID_COLUMN_INDEX = 5;SUMMARY_LOOKUP_KEY_COLUMN_INDEX = 6;SUMMARY_HAS_PHONE_NUMBER_COLUMN_INDEX = 7;LOADER_ID = 1;private String selection;private ContactListItemAdapter adapter;/*** android 3.0以后提供了更加安全和灵活的对数据进行异步加载的方式,就是使用LoaderManager* 通过它可以轻松地实现对cursor的管理*/(Bundle savedInstanceState) {super.onCreate(savedInstanceState);selection = “((” + Contacts.DISPLAY_NAME + ” NOTNULL) And (“+ Contacts.DISPLAY_NAME + “!=”) And (“+ Contacts.HAS_PHONE_NUMBER + “=1))”;adapter = new ContactListItemAdapter(MainActivity.this,R.layout.activity_main, null,CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);setListAdapter(adapter);// 获取LoaderManagerLoaderManager manager = getLoaderManager();// 初始化loader对象manager.initLoader(LOADER_ID, null, MyLoader);//将游标交给activity托管 startManagingCursor(c);}private LoaderCallbacks<Cursor> MyLoader = new LoaderCallbacks<Cursor>() {Loader<Cursor> onCreateLoader(int id, Bundle args) {CursorLoader cl = new CursorLoader(MainActivity.this,Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION,selection, null, Contacts.DISPLAY_NAME+ ” COLLATE LOCALIZED ASC”);return cl;}(Loader<Cursor> loader, Cursor cursor) {if (loader.getId() == LOADER_ID) {if (cursor == null) {Toast.makeText(MainActivity.this, “查询失败!”, 0).show();return;}if (cursor.getCount() == 0) {Toast.makeText(MainActivity.this, “查询结果为空!”, 0).show();}// 更新UI信息/** 使用内容解析者根据联系人的URI对联系人进行查询,第一个参数为联系人Uri,第二个参数为* 要查询出哪些列,第三个参数指定查询的条件,第四个参数为查询的参数,最后一个参数表示 按本地语言的名字降序进行排序*/Cursor c = getContentResolver().query(Contacts.CONTENT_URI,CONTACTS_SUMMARY_PROJECTION, selection, null,Contacts.DISPLAY_NAME + ” COLLATE LOCALIZED ASC”);adapter.swapCursor(c);}}(Loader<Cursor> loader) {Log.i(“TAG”, “loader was reseted”);}};{public ContactListItemAdapter(Context context, int layout, Cursor c,int flags) {super(context, layout, c, flags);}/*** 找到各个组件*/@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {View view = super.newView(context, cursor, parent);ContactListItemCache cache = new ContactListItemCache();cache.nameView = (TextView) view.findViewById(R.id.tv_name);cache.badge = (QuickContactBadge) view.findViewById(R.id.badge);view.setTag(cache);return view;}/*** 为组件赋值*/(View view, Context context, Cursor cursor) {ContactListItemCache cache = (ContactListItemCache) view.getTag();// 将当前查询到的名字复制到可变长度数组中cursor.copyStringToBuffer(SUMMARY_NAME_COLUMN_INDEX,cache.nameBuffer);int size = cache.nameBuffer.sizeCopied;cache.nameView.setText(cache.nameBuffer.data, 0, size);// 为quickContactBadge赋值long contactId = cursor.getLong(SUMMARY_ID_COLUMN_INDEX);String lookupKey = cursor.getString(SUMMARY_LOOKUP_KEY_COLUMN_INDEX);Uri lookupUri = Contacts.getLookupUri(contactId,lookupKey);//System.out.println(“=====:”+lookupUri.toString());// 指定和QuickContactBadge关联的联系人URIcache.badge.assignContactUri(lookupUri);}{public TextView nameView;public QuickContactBadge badge;// 构造一个可变长度的字符数组public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);}}}

最后就是需要在配置文件中设置读取系统联系人的权限:

<uses-permission android:name=”android.permission.READ_CONTACTS”/>

耿耿于怀着过去和忐忑不安着未来的人,也常常挥霍无度着现在。

Android Api Demos登顶之路(十四)Quick Contacts

相关文章:

你感兴趣的文章:

标签云: