联系人数据库设计之PhotoPriorityResolver
来源:互联网 发布:ubuntu 中文界面 编辑:程序博客网 时间:2024/06/11 22:01
转载请注明地址:http://blog.csdn.net/droyon/article/details/9185437
联系人数据库设计代码分析,源代码下载请访问android官网
package com.android.providers.contacts;import com.android.internal.util.XmlUtils;import com.google.android.collect.Maps;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import android.accounts.AccountManager;import android.accounts.AuthenticatorDescription;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.ServiceInfo;import android.content.pm.PackageManager.NameNotFoundException;import android.content.res.XmlResourceParser;import android.util.Log;import java.io.IOException;import java.util.HashMap;/** * Maintains a cache of photo priority per account type. During contact aggregation * photo with a higher priority is chosen for the the entire contact, barring an * explicit override by the user, which is captured as the is_superprimary flag * on the photo itself. * 为每一个accountType保持一个photo priority缓冲。在整个联系期间,选择优先级较高的photo。 * 用户显式重写,用于photo的is_superprimary标志 */public class PhotoPriorityResolver { private static final String TAG = "PhotoPriorityResolver"; public static final int DEFAULT_PRIORITY = 7; /** * Meta-data key for the contacts configuration associated with a sync service. * 联系人配置的Metadata关键字和syncService相关 */ private static final String METADATA_CONTACTS = "android.provider.CONTACTS_STRUCTURE"; /** * The XML tag capturing the picture priority. The syntax is: * <code><Picture android:priority="6"/></code> */ private static final String PICTURE_TAG = "Picture"; /** * Name of the attribute of the Picture tag capturing the priority itself. */ private static final String PRIORITY_ATTR = "priority"; private Context mContext; private HashMap<String, Integer> mPhotoPriorities = Maps.newHashMap(); public PhotoPriorityResolver(Context context) { mContext = context; } /** * Returns the photo priority for the specified account type. Maintains cache * of photo priorities. * 为指定account_typt返回photo priority */ public synchronized int getPhotoPriority(String accountType) { if (accountType == null) { return DEFAULT_PRIORITY; } Integer priority = mPhotoPriorities.get(accountType); if (priority == null) { priority = resolvePhotoPriority(accountType); mPhotoPriorities.put(accountType, priority); } return priority; } /** * Finds photo priority for the specified account type. * 为指定account_type返回photo priority */ private int resolvePhotoPriority(String accountType) { final AccountManager am = AccountManager.get(mContext); for (AuthenticatorDescription auth : am.getAuthenticatorTypes()) { if (accountType.equals(auth.type)) { return resolvePhotoPriorityFromMetaData(auth.packageName); } } return DEFAULT_PRIORITY; } /** * Finds the meta-data XML containing the contacts configuration and * reads the picture priority from that file. * 返回指定packageName的含有meta-Data 联系人配置的XML文件,读取其中picture priority属性 */ /* package */ int resolvePhotoPriorityFromMetaData(String packageName) { final PackageManager pm = mContext.getPackageManager(); try { PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); if (pi != null && pi.services != null) { for (ServiceInfo si : pi.services) { final XmlResourceParser parser = si.loadXmlMetaData(pm, METADATA_CONTACTS); if (parser != null) { return loadPhotoPriorityFromXml(mContext, parser); } } } } catch (NameNotFoundException e) { Log.w(TAG, "Problem loading photo priorities: " + e.toString()); } return DEFAULT_PRIORITY; } /** * 读取xml文件内容,解析picture priority属性 * @param context * @param parser * @return */ private int loadPhotoPriorityFromXml(Context context, XmlPullParser parser) { int priority = DEFAULT_PRIORITY; try { int type; while ((type = parser.next()) != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) { // Drain comments and whitespace } if (type != XmlPullParser.START_TAG) { throw new IllegalStateException("No start tag found"); } final int depth = parser.getDepth(); while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { String name = parser.getName(); if (type == XmlPullParser.START_TAG && PICTURE_TAG.equals(name)) { int attributeCount = parser.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { String attr = parser.getAttributeName(i); if (PRIORITY_ATTR.equals(attr)) { priority = XmlUtils.convertValueToInt(parser.getAttributeValue(i), DEFAULT_PRIORITY); } else { throw new IllegalStateException("Unsupported attribute " + attr); } } } } } catch (XmlPullParserException e) { throw new IllegalStateException("Problem reading XML", e); } catch (IOException e) { throw new IllegalStateException("Problem reading XML", e); } return priority; }}
- 联系人数据库设计之PhotoPriorityResolver
- 联系人数据库设计之ContactsTransaction
- 联系人数据库设计之AbstractContactsProvider
- Android ContentProvider之联系人数据库及操作
- 四大组件之contentProvider联系人数据库DIY
- android 监听联系人数据库
- Android联系人数据库全
- android 联系人数据库
- Android联系人数据库
- android 联系人数据库
- Android 读取联系人数据库
- 读取联系人数据库信息
- Android联系人数据库读取
- Android 联系人 数据库解析
- Android 联系人数据库操作
- 数据库设计之物理设计
- 数据库原理之数据库设计
- [联系人]监听联系人数据库刷新数据
- javah 命令记录
- 心声
- hdu4514
- CGI编程错误总结
- 左侧TIPS 滑进滑出效果JQUERY
- 联系人数据库设计之PhotoPriorityResolver
- LeetCode_Gray Code
- C#实现远程控制及桌面监控功能(服务端)
- LoadRunner工具的设置技巧问题
- hibernate.hbm2ddl.auto 的设置
- 基于SVG的web页面图形绘制API介绍
- 图的DFS
- CAS3.4 代理模式详细配置
- 个人博客 收藏