程序员人生 网站导航

Android学习笔记二十一.使用ContentProvider实现数据共享(四).操作系统(联系人)的ContentProvider

栏目:综合技术时间:2015-03-06 08:13:55
䚈௮加௧뙋௬5099,[置顶] iOS 学习资料整理x;ퟘŸএퟨ௪陻௯5072Android开机启动过程分析䥔䚈௮加௧ style="margin-top:0px; margin-bottom:0px; font-family:Menlo; color:rgb(75,209,87)"> //

//  ViewController.swift

//  计算器

//

//  Created by 悦兑科技 on 15/1/14.

//  Copyright (c) 2015 BSY. All rights reserved.

    Android系统本身提供了大量的ContentProvider,例如联系人信息、系统的多媒体信息等,我们开发的利用程序主要是通过ContentResolver来调用系统的ContentProvider提供的query()、insert()、update()和delete()方法来获得Android内部的数据。

1、如何使用ContentResolver操作系统ContentProvider暴露的内部数据?
1.调用Activity的getContentResolver()获得ContentResolver对象;
2.根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据。
2、实战源码剖析
1.加入读写权限
<uses-permission android:name="android.permission.READ_CONTACTS" />     //授与读联系人ContentProvider的权限
<uses-permission android:name="android.permission.WRITE_CONTACTS" />   //授与写联系人ContentProvider的权限
2.联系人ContentProvider的Uri
(1)ContactsContract.Contacts.CONTENT_URI(content://com.android.contacts/contacts):管理联系人的Uri;
(2)ContactsContract.CommonDataKinds.Phone.CONTENT_URI(content://com.android.contacts/data/phones):管理联系人的电话的Uri;
(3)ContactsContract.CommonDataKinds.Email.CONTENT_URI(content://com.android.contacts/data/emails ):管理联系人的E-Mail的Uri。
3.
获得所有联系人的表的Cursor对象:

1)ContentResolver contentResolver=getContentResolver();//获得 ContentResolver对象查询在ContentProvider里定义的同享对象;
2)Cursor cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);//根据URI对象ContactsContract.Contacts.CONTENT_URI查询所有联系人
4.获得指定联系人(_ID)的具体信息
    从Cursor对象里我们关键是要获得联系人的_id。通过它,再通过ContactsContract.CommonDataKinds的各个子类查询该_id联系人的电话(ContactsContract.CommonDataKinds.Phone),email(ContactsContract.CommonDataKinds.Email)等等。
以获得该联系人所有电话为例:
1)int idFieldIndex=cursor.getColumnIndex(ContactsContract.Contacts._ID);
      int id=cursor.getInt(idFieldIndex);//根据列名获得该联系人的id;
2)Cursor phonecursor=contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id, null, null);//再类ContactsContract.CommonDataKinds.Phone中根据查询相应id联系人的所有电话;
    类似地可以ContactsContract.CommonDataKinds的不同的子类查询不同的内容。android文档告知我们推荐使用ContactsContract.Contacts.LOOKUP_KEY代替ContactsContract.Contacts._ID。

升华笔记:
1.Cursor接口
(1)功能概述:该接口主要用于随机读写数据库查询返回set集合情势结果。
(2)经常使用方法
abstract void close() :关闭Cursor,释放所有资源
abstract boolean moveToNext() :将游标移动到下1行
String getString(int columnIndex):将指定的列索引对应的值转换为字符串返回
int getColumnIndex(String columnName) 返回给定列名对应的列索引值(为0开始的整型值),传入参数为列名;
2.由于读取联系人比较的占用资源,为了提高用户的体验度。斟酌将读取的进程放在线程里完成,推荐使用AsyncTask类。
取Android系统的通讯录时1般会先读取联系人然后再读取其号码,嵌套循环读取。如果通讯录人数不多速度尚可,但是通讯录里有1⑵百人恐怕就比较慢了,如果硬件再差点体验就更差了。可使用
ContactsContract.CommonDataKinds.Phone.CONTENT_URI(对应contacts2.db的数据视图view_data_restricted)视图来读取避免嵌套读取,而对PhoneLookup.CONTENT_FILTER_URI确不能直接使用

4.联系人的API
(1)ContactsContract[public final class]
    java.lang.Object
                   ? android.provider.ContactsContract
    ContactsContract是联系人数据提供者和利用程序的契约书,它定义所有支持的Content Provider URI和数据列。 从Android 2.0(API Level 5)开始,Android平台提供了1个改进的Contacts API,以适应1个联系人可以有多个帐户的需求,比如说手机通讯录和GMAIL通讯录,两个通讯录中的两条记录可以是同1个人。新的Contacts API主要是由ContactsContract及其相干的类来管理,旧的API(android.provider.Contacts)已不同意使用,但为了兼容仍可使用,只不过像之前1样,只能返回第1个帐户的信息。
   在新的Contacts API中,联系人数据被放到3张表中:Contacts、RawContacts和Data。这样可以帮助系统更好地存储与管理1个联系人的多个帐户的信息。
ContactsContract表结构介绍:
A.ContactsContract.Data 用于保存个人数据,例如电话号码、邮件、手机铃声、即时通讯方式、照片等等
B.ContactsContract.RawContacts 用于关联联系人信息与账号,由于有可能手机的联系人信息是从不同的Gmail或其他地方导入的,为相互区分并方便同步,特引入账号概念。
C.ContactsContract.Contacts 属于不同账号下的某联系人信息可能描写的是同1个人,这张表就是RawContacts的并集,如果某联系人信息被修改,和它描写同1个人信息肯定也要做相应的更新。

(2)ContactsContract.Data
    Data表存储了联系人的详细信息,表中的每行存储1个特定类型的信息,比如Email、Address或Phone。每行通过1个mimetype_id的字段来表示该行存储的是甚么类型的数据,该字段援用了mimetyps表,此表存储了经常使用的数据类型。Data表的字段主要有:
mimetype_id :表示该行存储的信息的类型 
raw_contact_id: 表示该行所属的RawContact
is_primary :多个data数据组成1个raw contact,该字段表示此data是不是是其所属的raw contact的主data,即其display name会作为raw contact的display name
is_super_primary :该data是不是是其所属的contact的主data,如果is_super_primary为1则is_primary1定为1
data1~data15 :15个数据字段,对不同类型的信息,表示不同的含义,ContactsContract.CommomDataKinds类中定义了与经常使用的数据类型相对应的1些类,这些类中分别定义了相应数据类型中这些字段表示的含义。1般data1表是主信息(如电话,Email地址等),data2表示副信息,data15表示Blob数据。
data_sync1~data_sync4 sync_adapter:要用的字段(sync_adapter用于数据的同步,比如你手机中的Gmail帐户与Google服务器的同步)。
data_version :数据的版本,用于数据的同步。
    Data类中的Data.CONTACT_ID与Data.RAW_CONTACT_ID分别表示该表项对应的联系人在Contact与RawContract表中的ID,我们只需要知道某1个联系人的contactId或rawContractId,并根据其查找的数据的类型就能够查到相应类型的信息
(3)ContactsContract.RawContact
    RawContact表中的1行存储Data表中1些数据行的集合及1些其他的信息,表示1个联系人某1特定帐户的信息,比如Facebook或Exchange的1个联系人。 当插入1个raw contact或当1个raw contact所属的1个data改变时,系统会检查这个raw contact跟其他的raw contact是不是可以匹配(比如如果两个raw contact的data包括相同的电话号码或名字),如果匹配他们就会被综合到1起,也就是说他们会属于同1个cantact,表现为在RawContact表中他们援用的cantact_id是1样的。 联系人姓名、组织、电话号码、Email或昵称的改变会引发raw contact的重新聚合。有两个方法控制聚合的行动Aggregaton Mode与ContactsContract.AggregationExceptions。 
Aggregaton Mode
RawContact表中有1个字段aggregation_mode,通过向特定raw contact行中插入这个字段可以修改系统对这个raw contact的聚合行动,其允许的值以下:AGGREGATION_MODE_DEFAULT:正常模式,允许自动聚合;
AGGREGATION_MODE_DISABLE:不允许聚合;
AGGREGATION_MODE_SUSPENDED:当1个raw contact的aggregation mode修改成suspended时,如果其已经是1个已聚合的contact的1部份,那末它仍会保持与原来聚合到1起的raw contact的关系,即便它已改变不再跟其他raw contact匹配。
ContactsContract.AggregationExceptions
数据库中存在1个表:agg_exceptions。通过字段raw_contact_id1、raw_contact_id2、mode存储两个raw contact聚合的方法,系统定义的聚合行动有3个:
TYPE_AUTOMATIC=0  由系统决定聚合行动,默许值。
TYPE_KEEP_SEPARATE=2  不聚合
TYPE_KEEP_TOGETHER=1  聚合
(4)ContactsContract.Contact
Contact表中的1行表示1个联系人,它是RawContact表中的1行或多行的数据的组合,这些RawContact表中的行表示同1个人的不同的帐户信息。Contact中的数据由系统组合RawContact表中的数据自动生成。 不可以直接向这个表中插入数据,当1个raw contact被插入的时候,系统会首先查找Contact表看是不是有记录跟插入的raw contact表示同1个人,如果找到了,则把找到的这个contact的_ID插入raw contact记录的CONTACT_ID字段,如果没有找到,则系统自动插入1个Contact记录并把它的_ID插入新插入的raw contact的CONTACT_ID列。 
Contact表中只有TIMES_CONTACTED、LAST_TIME_CONTACTED、STARRED、CUSTOM_RINGTONE、SENE_TO_VOICEMAIL列可更改,这些列的更改会致使相应的raw contact被更改。 当删除Contact表中的记录时,会删除1个联系人的所有帐户的信息,也就是说,其对应的所有raw contacts也会被删除,各raw contact对应的data也就被删除了,sync adapter同步时也会删除服务器真个相应记录。 
如果需要读取1个联系人的信息用CONTENT_LOOKUP_RUI代替CONTENT_URI(见后面);
如果需要通过电话号码查找1个联系人,用PhoneLookup.CONTENT_FIILTER_URI,这个URI为这个目的进行了优化;
如果需要通过部份名字的匹配查找,用CONTENT_FILTER_URI;
如果需要通过email,address等信息查找,查找表ContactsContract.Data,结果包括contact ID,名字...
    ContactsContract的子类ContactsContract.Contacts是1张表,代表了所有联系人的统计信息。比如联系人ID(―ID),查询键(LOOKUP_KEY),联系人的姓名(DISPLAY_NAME_PRIMARY),头像的id(PHOTO_ID)和群组的id等等。
(5)ContactsContract.CommonDataKinds类
在前面讲Data表的结构时讲到,Data的data1~data15字段用于存储各类型的数据信息,那末这15个字段分别表示甚么信息呢?
前面提到了,Data表中有1个mimetype_id字段,通过这个字段关联mimetypes表表示该行代表的信息类型,由于Data表中的每行可以表示如Phone或Address等不同类型的信息,所以对不同类型的信息,data1~data15这15列表示不同的含义,如果要靠记忆记住这15列对特定的类型分别表示甚么意义自然不行,因而Google就预定义了1些类,每个类对应1些预先定义好的数据类型,在每一个类中定义了1些语义地、方便记忆的常量,用来对应这15个字段,比如在CommonDataKinds.Email类中有以下定义
publicstaticfinal String ADDRESS = DATA1;
publicstaticfinal String DISPLAY_NAME = DATA4;
DATA1与DATA4为继承自DataColumns中的常量,在DataColumns中是这样定义的:
publicstaticfinal String DATA1 = "data1";
publicstaticfinal String DATA4 = "data4";
这样,当于们要查找Email地址时,只需要通过ContactsContract.CommonDataKinds.Email.ADDRESS援用,而不需要知道它是存储在Data表中的data1列中。
3、源码
public class ContactProviderTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button search=(Button)findViewById(R.id.searchBtn); /*查询联系人*/ search.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { //1.定义两个List来封装系统的联系人信息,指定联系人的电话号码、Email等详情 final ArrayList<String> names=new ArrayList<String>(); final ArrayList<ArrayList<String>> details=new ArrayList<ArrayList<String>>(); //2.使用ContentResolver查找联系人数据(Query the given URI, returning a Cursor over the result set) Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //3.遍历查询结果,获得系统中所有联系人 while(cursor.moveToNext()) { //a.获得联系人ID String contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); //b.获得联系人的名字 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); names.add(name); //将名字顺次添加到List列表中 /*-------------------------------------------------------------------ᨲ鱸Ç૴Ç濌ﶋᘣ㷕뚋ꖝ쎩鱶䧘❷睱栧仆٧䆣襀ዏ詣郤辔Ѯ⺠钊䏄䇖럝ꇠ螛Ȩ慳瘅ƀ茖᝸充៼꯶䞨똝䒜瞢纆䒲垾躯ﯯ믪ﻏ쿬꫿菥謲捉픇摦뺱㏐嘟ﳽ톙붬쳾ㆬ꧝㌶➚믷욨㞨殘꾫꫞酐殟텷ꍣ竁뇽度羧ꚑ壎冯孱ㄡ丙딏Ꭶ⩝퐮⛁봢샎꽜瑣疵㯖ᖕ㽕旿ꆕ洨퇢ꚾ퉕㏀鿲ᮾ鶅떠䗿凉퓖䗜ᣑ暴亣敛ﱀۆ憿ﯧ뫄泉涬飐잚抵噸俴針娑߰渆쵺鵚뫡棕厺穮゙浞媴雴ꍉ딌敇ᯤ䋊ۆḫᷲ톃ᓀ茋嚊꭯쿈Ꮅ❠낝ﻨ碩咏嵽捎ﲶ僂ㅭꗝ▿宠謙ൕ幬췸뙵仲㜛⎆補콭䗖뼋鲎ί蹸ʷꂷ煦鮫譫踼卆蜉쇧庡浗飖ᱟᢁ罉꺪믜ꄣ뫳୅娌㏣䦋놯㘾툭䶮Ꮹ硆ᗕ頄㷡䊫䁏氘㛧ᬎ썷뵇炔⢀컸⸶䠴࣋襋킳ᐱⶅ맄챉뉨罵壔䙵䦃녣ᘰ獼ୟ㕵願䙳ꍛケ稵ꦠ᪇餰빑寮ꍧ瘮遳ﮍ麅㘱⏞⾶굱椋ꘟ⁀츪䋫나캉倄㔶㕵ﳒⴠ쵋騒㚅眹烳撩摺殔靚鈤蓇浦첚双곆ﱻ뜂甀➧觱糴襧ﶳ뉐砃᭖찭ꔹ芌ⵆ柨䘵匭텦鯕뫴뫇爚䲷홣᧪꺫잳䘺⶯䝻㏵ᝂ،浮㯙笄ﶛ杜य़㽯演ᡏ蓆у쐝뜼ز֭ꋉ捆ꤲ꨿⾬泶ꞃ颍ሚ㨧挩占簣⍧ủ쟣츷᜽স荈옒孏䏱ﳆ坔乳㶪ꕏ5왠啠汿樶ጰ纵퓅㨰Ი紿鼓뿐찏Ᶎ؀때草﵉櫓凳됭⧳㞣铽­縏飌䌙ꌍ遾ꭃㆯꯖ諥䊟〳픿铰報꟰Ή籥碗迅ᗥ檚햋ꦬ⊱倝說ꚱꆆ끈㲳Ⳬ玀ﳆ玧喡ᢪ䙬匫散稗巫䙵딗믖長ॆೖꅀ瘝緲縱㌘⼺糖䟾鯑ꡢ㑯Ꟃ˰桺飕垭펿피ꀚ蟑㍖ਐỠ왆掅硢䟦겎鐿◄儙ᦫ픳斁ꈧ聶殸캟君뼉㏡嵲壽Һѿㆌ뙮ᾉ阝嗨૱褭と鬀塝௵玛灼㴦촿昦꼸뜻⳩㜩ဿڛᣐ㊞楈崂Ӷ퍺ω虳釹㘉캱蟷칏娜᚞ʆ波ᜣ蟬Ϲ㥹쒤ㆌ㨌ꘫꮌꪧ콘ꪭ튼惒῕腙块堷螙襚誚䵉袗ᕩ瓖Ჾὴⲫꔬ鎐퉈㠷跓칁ꄑὄ墛껄뼕됲췊켤䫭꩒⧤ꧪ禎ﺦﰃ턪૒档羨鹓녠誂荐秞꿧ۿ픽ᯨ쬘珕ոἯꊟ韒涢饒恍∗ནﳼ厈ⴘߪ猚ꌍ哗駫겓ⓡ祘݌䍹‮숑鵣ꍁ봿￱৺梼騵㯑舿ꨢ圌坔ᬰ羍᭄䈽聏듛鹱턮論ꝕ讨띡죶頤沒월좹ᜪ쑙쥖ඒ揮ᢾ쉙厪㳛놷渤躟喡ꤺᏙ䬆鱄ଜ㱬淎쐹艤쟯⚡膨룳춄ㄾלౖ㈿糖욌㵚웃泜౬낎뭱᪘㺀綤儤ዮ蟮绷꥟膾⺎쓠↴롡㠃꠴ꝲ썄겪ꍆ싞㭆샰ަ庡㘺찹㩱뾖ῑ▦ꓰ፤쉓⍸톘섀ꬺ瓕겧媬걯흕둘딆놁ﶖꊱ웢쨷ꯟ妼옆꺹콆榔꬙Ꝇ钷곝綼뷣閛긷溨ꮼ劺幙祺宊벨໼맹몢﻽㞻ᕕ⮪僔둇䐹೩钚菆᱀즱瓞㋿鰟斤氰づ펢䛞撔┑瑌㡔렽웅烝䙣輌 蓖嘈⠰繑僸艫Ὣ籇豟ᨠ䗅尔ైǍᅞㆷ뗃痪聀ꡦ⤜蛱݀罈㡈ޝ觱펨愗밥븑퀩ꢈ䗔团焋梅֨椩៩쥱鴑袃萛鋴跷㄃狢ҿᠡ᜖⎶ ꑢ霙릢蠆癷鵳⢭ᙏ佼ꏴ魴镠〸矈燃ݜὧ祀䖢㋔僇䗐焲쫜ퟙࢀ႖ꂷቍ䜙棔屇⤪컴ᨠչ瓐㶀㮏☩袓ᱎꝄꈢ娡儘꒲ࡻⷁ⧜픚뚀V袪揎С龳所ᑲ钣᤺砰洀댎ꔔ嵛㉂ᆅ뫛䄉媏컄쑦뱻藩⑾꾌ࡢṑ대䉍ꘀℂ臐⠁$즪㘮仚죩蠅鬕࢓昛鉠㬍찑饌⇓鈉⥦枒숟ຳ汉鄊讹㎾僨瑚ꍏꩿ艻댨혀硯ꮬ罅惛⊴ᣌᕰئ₦䅣ꚱ潁ລ萳⬅떪ꕒ뉋쿯ሰﴽ䣨腎糓禙㇧嘼⡸审௘撈ꝇҬԨ⒑ꠘⅶ߉቙ⴘⅈ袜茂໭뒤ျ妶撐₟嶬갢ꊾ㨓慐印즊垡瘄᝟ⶁ쪌ꎡᲨ谪Ḑ┺䳴ཱི褔䀪昔螘턶ࢱ葤変끣셞ﴊ쿹摗ᛁᬝ䋂И㼳⟚膸簀篥밣쐫Ᶎⱋឿ❸ᗰ맊ઠ㞬닽봰┏塲沎灵⽁⽈덾顇龎ﳒᨇ杔Ṧ뒃Җ돇콧쿔㜞梼̀뺲ˌ솄쮘纪肎歆⬙ﮔ᪶젉糱㿏패㋼篟Ъ킸破쐤閭籭皈鮈䏶཰黡縮ত豰豳셰恙킕ㅣ಴䢯폳ܱ샠ᾹⱮ蝄炐陑祋Ⴅ熲嬽攣籜閴蠟⯀ݒꍈ㫰밿萨㣛⃗聀ɖ긠媄魲境礉瀍ꀫ龁帐毧ດʰ匊݉ᅜꐴ蒰蟌䖤导꥜骧嘈裵쁨壪儙㺰办ቭ晫櫟䪚铨卉䓳䭓ᰣ疵꧟쟆娖巣颬䳁騱蒭ꧩ䙵柵﹟秦挍珂螉耏夵膿쓉辘﮿ⵜ꩕몖䙻䜵ュ햌슟螯ꮜ埜䬂荺ᛢ䰓虵롴ᨠᩲ묦ڢ⟴櫼瀕赓⦕駔䛵뙠뛐ꍎϿ㊰鿗䏝ꈟ潷徿矽箽曣ﯭꕷᑺ렆检庱㤽搼羦놔䏀떚賎흥顱邫輂ᄂ⫖ﲫ耒⫊慅봟㄰罗ց巘Ꟍ䳋赺Î䴶瀝‿꿰ﴟ띶䄫徟⮻䋗䗺脪⁢᡿濳쀌䅈䣔鵕ៃ欠헪㚬⩡ᯒ쪮섵ɔɱᵼ鉪j๾뮽놧ꑪᑪ蠔詌῏䇦ꮂ㞣쪯⤯툊ꗆ¦⼨ᧇ湧놳퟊Ⱋꝵ屖ޣ▙綠颞ぁㄩ㠃ἷ첨ꝡࡎ窫ἲ외ꭔ힟௫㵦팕笞缌漅䅡ঊ䏲鰺甊ﴹሀꊛ쏫ᗺ㍶ᥖᕰ赵瓉隬꤭栖惁ﱊ䬉膃䮰幸끦箐䌌憋郘뜼૨╟깨ꬭ⼬⢯쯻갿掩㗪痗順虰攚ᘕᷝ礋╈秼膻⶯♕ﴍ쫛潯龩둛犴ᤊŜ躆滄鮤苖힛銱龂욜灡늹ף噏큁ᾊ얝햼궯弼닧仂踗竤谽蠘⟢償妃놤᳂攇噧걱᝞遶鄼蓰볯瓉ҫ⽙苵癷඀颥菻ꤊ萧즇䥗埯曎Ⴅ鹧끫⺆霩捼︩솵惒矂괘료⫏썍昉똅丕⡻쿝脿갉䃖⎘걉섐鑧˺磔토쾙䘮갇邦}賶욱㾨뱧ﮇ觲댌᝗ナ椘魟ӵ豄럶獆濽췈뻗ꑧⰹ쿝ž⥛寲ꣷ磁㺞ւŤ傒걿칪㨉ғ辧㴞문섘ᴩퟧ퇰䒢槭豑➻᪞ᮏ娌猽ꏪ㕏釸퓹齧懓粝辖뱍釢䯺考沉黓館Ꝍ픅㨀땧椪䟣赆큄薊㩳ⲯ씞ࡴ菛뿿ዾ鮘ꝙꡥ⣢ᨳↈ峍炥ᙂ反צּ⒙ụ犂峉喓頶ꂨ㡟꒥棄咏఺ꮌ꥟髵옗ꬆ⧌ꖾ癄才嗻੖倅൜蟣⫨瓽欍媶최⿇팾啂ᰀ櫛㣺ꋟ⫼Ֆ䆏꫿䰁껷草غꈝ⥈扔紣⫭᝱촼ʃ롟䟖ꉠ둩膤᪯،苬푐敜䓯늶猕䅪룝镀鹕ꢳꨭ羊炈ꮣ먅앆䫭앵块丹ʅ瓮坱徠淊套꠱悰頫壓↺嘓ⶐ佒ೲ퓹垲홏歖ᒴ❮웹標ષᔩ鿥㳔㱮生櫖煾ង曹喕໢扈ቾꐨ僚ꌱ﹓퍉骬ꇾ퇯Ꝼ誀螪ᵟ㤙ᦔ렒⚝긍馂簆ൕ飁쫊탄邖褌足勼⍻觩늘⎿侦仨䣺穻⹂戶蟋誊赁橠耚⢝詆첻촭ᎈ뒝拋螪ᨛ뫥屝횬轴⪯샛ឆ䧦阍㫻考⟻㈀沘縟䂈뾵⟶쥨촱׷ᄅ䃁㢓큌瘾捖Ὸꃅ퓚ꕠ剎檉ⷫ㊵⪹霤櫚䪔蒤殸컗賷싞Ɡ확驄쬸ﰓ厰潴孰츾鄑셸㙏蚑烇貈햄쩺캠⁺Ꮻꕟ箣铕ꎪ鱢׈੹땊ఈ骵琺೵ෝ휱꧐껰㊲曔切禪죲ꦬ洹羫溕ꉻ嗀跩埪喺䑾蕵䝢毻୪녉稽穉緺뗞㕀┛呩䨲慤뽅◥㇣ꢉ蒔䗴謙抬咈⤗崬玀攙劉䲭땞礒阕〝ꁵ㒨ࢯ㣧幭䄝쵺树坡෡櫅⤋烬髵휊䊫䞻纟サ⿋ݾ깐㸳ϋ™ﯵ㾻毘챳Ⰰ메㡎칰ᗾ➣ꋁ䓻ꎛᜮ셹ꅥ菏䏺郎瘤䣌꘴攧왦♒鏝⠝⚴絺ꐽᷡ撪୾뎪亵ꚪ켞澓⡁죂촊㢴㯧쟇穃ퟧ嵚挽패驈럷煏규ꍆ雿鋦ꊼﮚ揌᧫풕촙㾺Ꞝ꾚̔ㇸ㳵騲糞ш眣⡪䮙ꮯ휿೨▲濫擨ཏ芼觉઴佅듲꛿雓琩敽꾓㭆ӎ囹䫊՛㾘毿వ爎驾갇腔鳀엧䠿粰毽蠊顂奐ꌝᯗꖿ奢氂ಙ⪇ꚜ垨逰鬽菷历⶷剀ጒᅡ漫˝忳玖㬎錐ㅉ猼ꦏ氳縚牉燭춢픕㞕ጎ貞빒鱩衏糣ၝ௪庯ꡎ䚏腓挙뉤᭑ꋔ頜䕇ⓜ饙딸挚荝躝ⴹ䕦便垭뫜ꭱ⒒⣢⵺퐧滐뭂⨿賈껎칚즪豗⠆裥崂쓎㖡ꨣ≲ᙪ訢䑟脱蓲働䃢椔ꐥ㈤➔䐙ө橑祅腋컳㏦䁗⇴ᵊ瞈쇺䅪월㑂艾令ꢂ蘑夨模⁠ꌊ鉼焈⌀䱊캈萯ể굒䤕⭁ತꅖ笣鄙Ⴠ왺捔諑え뺈⣱ꅔ켮廇ተᒆ䅙排㔛맨譅挊䠛䒊垠뛪Ĥ삣谯弤᧺⮾갹ಂ␖䜅ബ吆뺩镅䐚⣹稌Ͷꚺ恃鲩㘈팒䤒穞貤釐泈ዡ펴馢壊⧫傑辒묣俁͊玖瑶苆꟰궫໻༝₢鶒ꉂ㒞䞍꞊䘖ᅈ帍퀢토慩㥏詞ﳀ࠯팋녀◬㖔獶숾贫ڟ侁酆ᦹ䰩줭鄘對랔酩셤採ࠦ⨺ꬨ鋛賢떈桑 光㖗본Гⅆ搊ᓏ㌨腅迭盲儲௳ጜ⾒ᔂ༸劐䋇詇鈒Ḵ陴蒎㨔㨞ᵛ䩃ॕꪝ
שׁ匋ﹼ렚穉ﵢ摯䗛у譬趍残∠嗞毁늇᣿黝擵ˇ꫹ꫲ所᰻鿆᏾嗾繕ﲫꅿ攟뺎썩⢁顯ཫꒀȕ”燐潑㥕팻₸໘肇漋ﶇ絹᳡풙ೊ쿨茙꣞姌綾啋﹙鈽ﲴ䷚쩔컊䡾ᒊᇶ解㙪觪⧢ꓥꨖ粮㪬琓ጟ핺砕౏ࡍἡ㊼ﺱ㠿槢䑀ꪋ뱟耩ಫ퍼휬◚미相㒛Ьꉢ团䕙앙㛛ꍒ藩ꯁ휵혐쁰汜ṕ쟥/赊툾ᇫ킩▂昐憷糌鄏鬝῭鑬阯튮멕坊⫩ꕝ璫꺕嗒䪺崪ꮥ镴튮멕坊⫩ꕝ璫꺕嗒䪺崪ꮥ镴튮멕坊⫩ꕝ璫믽಼遯覭ⲓ뇏癉闕䴯ƌ퐽Ⱈ坕㡔咣ᓿ鳯䆩た఍쫜僟葽⯗Ẩ∾ꝉପ熼꼝硡唬午漻团瘋껗皔웗즫줒ﲂ뱹ⱌ퍎졫㚜춮䷎ষⶃ쐪˻賸棘殈⮟蜬抷ⵎ涤뱣୳앯痬涤瑍梛ꊳᔕ蒛䛡鎺ᘝ❖Ꮹ킼럋ꪭ鬐䥌짏뜎䓰䴌蹰弹⊩忿ꞈ跄誰蟬媛ව캶綤稁춣䰮킽鬠奵⅃⏂溛쯁鋛늫⥯葶涒憐⦉獶䮐஬₉麌误Ⴈ䟄왰䧅䃆ẙ嫤젷쳞⸑⧜㰤里㳎镭袹༽⡭䗂肣稗汬ᬅꈟ㾛傫瘡㟩픮淌蓹Ꭰ鬯⾌◠⎑耳䜏吗頊蟠껎춴鐉엂嗖皈讝Ꮐ긧⼜ୄ牵᡽葰误唁웄縆ᷢ鯁띜隽ㄱ褲싗掅꼘碍皏畱ꤌ困瓕焊荭潯蛧鲒㖽䇆⣨㌥ᬨ蒙餟ꨖ웵➚慸錒ਧ蕩鷋犊ⷵ珓鞪茉ѐ쨺囊ꯠ棚㋖夺箷훧膤ᘻ庣춧㠿긢啲췅핊卟띻⋧੔鍻瓔煮칎惐ꤙ訁쩑⡹㇂슞耣䉆碙瓯俖ꨛ蛱埁桷㸚덞륤噓ꭖ횳吵喓῱㰵㌶饌곕䄳긯⨃ꐥᶕ굡쎄࢟ょソ䢯⽤ﴑ벍辣쑋僅켈㜤阽බꦊ璶ࡓ뼟伄䊷殜汐ᇬቖﴰ䝎嵎툥ꅩ툧᥏耍벬Ⱨ憉ꅒ㲮膃쑋⥐̑벢䅞閛춺鿔ᠸ㷣䴅寐넒鱔䁼䗉弋柱Ⲫꦿﺒ旓ꈜ黟篢萇은녕ॣ툦ྵㄪ굀佤ᥰ䝺ꠤ飗찬欄빃謱卉枃壟㎩皀饯ﮠ嫀萇ᾒ璥糏䛼觝載뭧䄂✘첈뉖뿢䛲䪹࿺⍃氧쎐ꐵ㘣稴밽ꦨ剹㙫ᠶ䪴ꆼﺒㄫ䇴떙좮ᄝ㙂턶眡頄ﴥ솃穇浖뻔⵸딜礿䧷Ꞙ噈捞簹紛㉤聙찀캠恨狰⫪簃棑쮡诚૬៟䛦蕦ཙٞ돚ꝅᬖ꣫蔀밠㾅ፇ波ᢣໝ渶難䊉ꉓၺ닷紓萳ཧ﷯ᄞይ䱫ᚠ购菢젛捛慱雂ሧʭ霷紆嘌愌{የљഗ큻⥚覌뾎䗌ꚁ轁放䅪밪쟀᱈枡迚趭ᡤ첟칁肜肯쀭怊삊㐓⸻ꌔ슘዆ʘ庠㒌腳㸽䕬宄֊迺侴쫱㳿ᗨ䛀퇗煯̱楞繘ꃑꈿౠ퓻멐鵿䊢㬑羢夣ㄾ翢뵝乯萪ﺹ倣淋㬉먿익퀜텼ᭈֆ䔰邟丗ᶿ倱뢐㽐띥આ퍍仢ﯳయ쵚荅㒀䂂읷醐ଃ닼㯺⼆柱羮躂y폤ةꋁ롋ꓙ衛臻틈ﴋǰꛊ鎛涠賂떞䌋偽ⱂ슥鏻ꄈ툉뢊섖蚞秮곩ꖪ縦䉱穭ႚఉ鏍म싅䵡톝뾨ꛠ䭨訒賓盄섴桜逵ᇰ㵠읠Ⅳ䤧ᢿ뱱똺諗댅떯﵌讋ᚆѩད䖹佽䓸⨲੣乼㛩ᶝቹ᳦⋊䭄䓏غ㊲碢俑慘팿ꨔ館蔷棘撰锊ꅌ࿿⅍「ꕐ靣̈녉艹程孅샘茿숭艊衔ꎞ뽍茉⹶짔밻⩂蘡撻ᮥ᳸㏱믓鉔菠뜜쀜謐슚犓갈獓喱뻎텸͚Ҁȳ℔ඁᕇ퐾趐꧆䉙ḭ吰䭤皀漶჊䖅ై轠㸸兀助᭑沒៎ﴗ쉍텰ᥔ쐾サﻐ㔃螿䧭㐮㯊⿺钜筛隱⒒谶뉄獹鄝Ⅾ帹ر챊輠莭䢆䀑῭뤇籆⡆㛗칎䶀ÿ섦趰뫳哅鐿蟇㸼쉼㷠㣀㫇Მ↦븎駓᥾ᘪ렖䚭똀䊂ꇮ㼳쿕켏伃ሐ㣝닒第㹇픹 ဈ䇃ꕾ䜗ゥꝽ횇䭟韖䬪틺㘥⬶뤬ᩊ↤鱑Ꮠ㴂瞉䐇垗麅랥孓㉒ޕ捦妭当锏롟❌䖞棙峦텍ᘟ랖霸䕛췏垵䴈쁽쓢趀㗲ᧉ鍁혣ꈼ쇟꜇읐龴涟ᜃꉙ㒡๼ꡲ蕓忨㰐汲詛鏌⑂㽸奏꺭뢈脴혝頳炢κ䥶ꆉ㜸萲蕷뛵煀慡汜ɯ㗫я铦ᝑ叓襷쐘ﲂ춏ꏢヒ荻䳑嚜ᢂ쥮븧쒐Ⱁ柮璒ɦ媞㝤鐮샘᧧᯻◅킻씽㭆萰쀩岗꧄ᨄ뱝乸᪥ڣ揝먬͚䁺龷岵듸删瞜୶줡仛⓼術蛶ꨢ贙胙儮ሱ苆㚠嬂ሐ닍Β俳蔊莪ꤳᙐ㽦⹦윰겕캍걯司 耋ঊ敚蕋愦⢁䖏𤋮蘐믊葧ᬑ꘼춧湓ɷ䎆岫磻箢ᝤ逋촧樷庖葂᠍砩㖇⒠㐛밖㑃㣞珼赍Ԝ엪怩㜸蛓괧๳၄闉ೃ㩓鵵譫㓣㚏ꄛོ⥣䌓遑颍긞龫㉀焒❇⿟걮蹰須푛忥瞘앆ㅤ銥ᗔጒ䲻烼帽썮㞏❜橉뀊桭넴㝑戾쐀㰌膡屑倣퇤맺⃈ㅠ„㣬溙ꐖ픡䁪嫗鉡哀鸁넕芦츏¢曜㰯燃ᩀ࠷똄液蒆럗ꤝ⸊璆⪗鐏ݚἛ콌꘭恒䒊榣ᯪ⃑횹㌶ᴛ朖㡒븲䯥貏텲ꧨ蔡鵋ﰝ蝚ᧅ⺘旟໎塼턙ゼ΍↘豤툉뎎ᢉᆽ퉊㭔暗䠕蠊屙捦묆䉬᫆䇆較桗Ӛ욾悏䄡䜇戳瑉吇z颿悊Ⴗꋑᅩൠ桼⒍挛都䥖窏㘥䏚㉨穮컈밻ᑬᩪꬽ縦섵޵泶潍貁ઢᬋ䣫瘷뱟椳ᾊድⅾ꾱▥ᥨ蔐ᨍ瑔흣ৱ裲韪貏㔍塵➍㰮옯焷짤ႆꃶӶ쳤쨛阒肤ᒵ⛺뼐蝰愩푆⩅᨝䅂䛣ᄯᓱ㬯哱ꄋ섉ꝫ㏉䞠꾍긂亰좪᝚梹꘳룠麗ɬꁓᶫዤᲛ鄧婤記ꉹ뉒촄轕섆욤煭跁魏瞁냄홝⦜䃆쏟솩ꬄ巏엽ṯ꘿㯸褐꩗㰯ݯ疓f̴耟桾הР쒈鑸氙喹黎냌᎙ⴁ┺蟿윺֋ᆳ荭ꭁᩐ藽꽛曬܄⏷籶鉖꠬᪁꜉ᾎ྅횇用˝䰡喡뙣揠쑭⫰仆츠囑ာ꨾ꑣ⭞鸵᫻浃㸃葛죆꜅ꋣfi㥾绂㲫鶧≇ɂԦツ⣨ॸꏛ댮ﴓ퍻쀈劍ᆕ稀勒ȩ㛰E丨㜈筢∋퀀퀝Ӕᣟ䭾#唏ⱗỨ롣ー뮓嵰﫥蓖톙恫뭒⭒鯯儁ⶁ◥놱欓﬿㟢铰皅鐯옢୫틣綹鍄⛂帷䛂ᘍ阮埢ᒆ᜞㔶럂썏璛ᐍ陡馌慾捣쪋寲쬷疞娩駨⳸ࣰ淛烼ᜰ盬账拨厾軡╱䠣䳨➥맻띸㩊蹬ݷ쪰礩Щ㘿꒼ﹴ®㻟侃发╤츥裦ᘵ츋㇏གྷ䜯ὺ➇৶⏺샢䰖눅፠돓튞嫶カ똀㝷훟쀄狞ࠨ袵q嬰䝄谌⹊㴞莉웆羰•』«᱅ሠ슍┏ﲨቂ৪膖ᙊ䪯룩褴蕊༗픿ⲙ邗齜衯쉺溈ᘒἜ⠯흄퇃恂裒鴓ꩲ‚鸅屮捜媵됥䴀컰ỡ몆}ᦟថ傐Яਔ聻吿切ᚊ틐埕弛丷탎煴많看谙릸㣔漑챬ꖍ쭼⫋畱屌ኝ韛ԩ⃛ῳӳ娂娰펱⼓┤콇姒鴒糇幅‡ꢛ桢搜놠⻯쬸∹메ἐ벸짝♻沤≬쑾擦ꓑ橠☜郋ѿ쏆焸鮍셙ⱄ毅䜤㸊㠈쓤袉Ⴞ䡋乨頪Ոᅰ捀ዏܔ⑾ꉩ䆎彀㛚㶈넳ᥖ뱽⌐ᆂ퍋ꠉ趁灶萳㪷❝倠܄꒵ႈ縹嗯迬᳚遼猜市닣⒱刭힓戇婷ꇔ벢텞⎻ɶ얬䠝᫛䒏ℂ镧側터쑜ᛐꀾ㚄僄碸᭹棟딌枿◌牢蕙㌾畨쟌ꍦ㴅㚴畨쉆ᱟ⑃옖縋慛䦼爁䱽⛯覼࿎঒Ꝣࣙ絶㛲텿諘鵧下捳௮控↹ꀙ䁧琓见銀鱏拦嘪쏉㸱׮ꖚ絞⥡ꬡ墊ʦ藺귾窼嬘ᮧ蒶똾嚰ʞ虊刅墡杔ὀ艟跾쎙䛌⡺밌ᅲᗛ껤疴研쑩琞渶菡줱節箅䧙簿禣ᬪ㧙䆾䟄㴲̑꼎㊪鈠䊒痎ڏ肱瘝ᆊ帇䜻尢ꤤ鼌丗ⱃ䋅柃㾟쯺䜋타䳡멯ெᦤ힠츕儓䓘탼弼㝗갘꜍꘼ᓄ阡딒⒚䁱謀⹃鵔拇顁ၮ㥴㰦ᷯཎ㷪ꎲᒔ⅙DZ⧓슴렋꧂逎ﭳ澌粖꿆᧴≓冷鼦㼱۞쭚꘭䐉뫪ᥣ㮓䜈ỉh噪⧣セ퉜挚庅ﶊ爋ჰ启㈢磠ဦꋨ歸畛楢ꗊ칞쬼Ỳ푬캖ᓋ顬뷄鍅ࣚڌث㟸鵦↕௺赅ꦾ챣쑴㺈턣⺯瞛⤞乒崼㮂䷌匶ᆷ芠⦺峤ﲞᡦﵤᲗꘘ喠⥉エ縋쀥碷磘标⩖হ뱪꒩⧤껙鷣봤ꬤ䂧ꀝЋ惥⇗ؤ뽀뒓랈鴀᪟憟噜㔳竆椆즐籬壌㨬䆣랃섯홣᧒쉞禼鯈䑭싽應ፋ뜄᜙촣攸ূᙅ띹玟஬怫豶㷡䁜怑謽꾄䳡烌驌એ좃䔡䀖␽솈ラ췹줮梾쵅靷唷쒺ᗅ虒ㄞⓣ䘶ꈡḀ֞ﬤဝ䅃她ṥ튄达黩椁줓䊢揲뚉㔩믟樬肦鈔퀾୺臥숄嬼똿✥渍惄츏ꗊ﯉蕅琣驄댵硍䃿垏⪱拼஍Ꮚ萪魰本펦쎍╠ꋽ蝛䣢┍㳥ℏ鞜峲⨕隆⊔墤嗠㮠첟醅桞幂፥驮ԛ醌鈦㟥Ń㤠⃬滑䠀鹩줫ꙴ娜䲋볾☨ᤥ得鶔鋟Ꮦ鬖㛆h涳볢ﲓ㉈煏ᗶ綮춺蔸჎롎능♳〈⊏겓癠Ḋ뢗隺㗅ļꊘ楲긣т቟鈇秡ﮌ㖬᷒擂ᾈ涂語骧孈㪖梺芈쿮㭃枖靅䈃㡮륀㇇ᙘ新궺焱ᖳᅨů㥫괔愛꭮哥犙쀅ѷ躝ㄥⰜ흔驈òᑵ░靈搔ꛤ뚋镣慂鋱躨룮팭ꗴග५鵅쒣⟃鑭퉶縟ඩ䞅ᒕ₹㤘猤듽밎➩囱鏉䫸ꉏᐰ拥㓋ꌻ俤魼觼串籏㶛횉ꬆ꓅롯嗸菬纷陪녘믜엸쪒哝ể樶拣ᖫᱜ桯炁逇잼唓⓮蝭퉢䧺刢Ꙥ뵎씸ཇ錄돬콧㖴ഗȶ뺂쮓⸧쑯ᣏ瘋ႚⰥꔍ譬჆沏鈼瓽䟜鼫艏蠣ꊾქ摼픲⼘䭾驞䩤䆧綞藐虜協寂⻨犥镈幯㎡㩊蘢듮㘰랃遙趁핇ۆ洀츯ﯧ鐏ꪄ₳嗀㙠脘䉔Ᶎ妌㑯愾ꢴ杚Ჵ屛ꊮꡔ嬢鎭ꬕ䦵ƫ঵挽➘៺䭅竢Ꝕ㰳ﴡ룺ꝁ戟¶퐂ᖈ耩ꄣ눠쳯匚꺝Ɇ犑쇢藧폏㽩軟⻗䪟쨴烌礣嫆䱪뺅볒외ꀘ뵥ꚮ㇞籲⃗䩌᧑옖칰쿨꡾쥮禒▵봳病䯆찶敛䣃⤸ベ៽莯ڴ漄ำ䷱◻庽䭋搹ᕼ입᪃飔靌誣夝ꁲ洴㪀鴫籭遟垙諗ꇫ嘳睿曡㴋䭈紽鰇句饴쉢܄蚣ធᤎ婔༯䰖蘸鵪㢑稊╩㴔᎔枯ཬ劐莰巯鍥糝镤궋渔䷏뢋㷩폝쾋⽪肴芀涆ᄰ˩츊廓靜昊集ഗ粇衃࡮둚䢈鼎疏姱䧜멮慛蛄븽夥慱䘶ⓤꎮጬᙲ濔惘ڋ늑䘓넃㽨퓗嬜̱ꨚ溁䤀櫏뼳肞亍﷓ꡞ﷊댒ፗ䛢ᜳ얟蜾騞鿋邡炾佛Ꟍᘜઝꦉ뎩로躳ꅞ鷸㓛嶽䴲뵟௅濉⼽쓙뿺ୣ췵欎য়L穹﨩混௛羫盟뤸淌傽㬠슸띷⻬鲦瓬仧펞㮱떼焟䐞馢졌꿇牢맵붍薾셋餳瀝폿峋탇༿뜻휷∏ꇅ뇿ங녮꧋距츞眳뇐鶕昏歂䋂￯ᩫ淚㸛᪘웏슃쵰ḍ勺㩘뛕挽淛፩꛺晷맖罞῎⷏ࡴ䝢烼恹앿ஓ६넭佽鮈澌듏鳤温⮭駭됾箶鬎࿆௭雬ᝧ䠯맏玘捷展䥩贷潮வ暁䗈㍆䅫Ꮞ㟥睖淢ﺹඉ慮烤쀴趍㛯Ḏ캌❯獖뙤䮷煬痯獄돫볂㬿췦筍讳Ⳡ駧ᱴ췶급뷞牾烥韘쒶獴ࡊḎ掄䫦箮뽣玧鯟ӌ뚛䝗יּ홼鰶湳堶垗䲈굂羢⽩璝㟮눷⯝ᷱ鈺坜뾎뽩넷뜓挋戓祰뫃쐦흹ꁎ潵训࿳䝯蝁ꊇ煱澦湿衝矘䌼쇛㸮㯤礈᏶ꈋᄠ㱚⑈導癞襵䝤﹚覵խ稽炼픸떓능즁ꖝ终♠㛓㡷뼸㈻㾼霸఍䳮बꀃ侔煳㼟ⓒ▮ﯶ駂ᣁ渗쏥뤋冱뿬範᩷餣恴ྖ乷㓬䋼筢餭燩跭ઍ⍛䦇㫔摵蛻☏犛⾋躅慞꿍྄䝻톳ﶾ䁰껍᷍춎츝ꐬ歃볿掾ၛ솂棽ᜠ㲞Ứ췈暭晖㢚릹タᶽ鿯诙熬ū敶ﶏꃯ㨰㟈撍蘖⟶롻鱄碏솹뷎断灶龖擲᩺珓縎㍽뚻鮜廚ঁ뗌㎸䤝祶무놱䗈蟜쎓⮜ߢ魳욹쏑趕西썥묽텭낊ⴸ埸ﰎ泱鱠἟ఝ᳌怜ﰏ蝝햞ꉌ묭맒犗穤랦ꎣ鷾킕뙲瘥ᖸ轏ᶏꚺ勷ᦃ鳟᠐古ﭫ曉똱췆浴ﱇ놙Ⅾ社뀰᡼ი鬺屶ﲳ䮸ઘ쓮蝽㻁뷞翺䊃끁짨䟅惷Ⓤ瘧刻꬇湡젤粻ꦇ晰∮ಌ砞�餴墝駜ᆘ川䇚鿒ᯫ尽츟㪍㛶葚䜵疮鶍衰὎᠗蟙醯莎嫸៎Ȗ饫㉘鰗崕蟍㇡⥾댶燶뿑ឰᅪ崓펬嫖맫玡惱⹽髧튇ⷃ癘쯞޺馹퀬諣럐涚ᶍཎ᭦퉧殓놙ﶅꩶ慚㵇략ሞ❇릅焩⇆淲笋⏋㵻ߝ薃コ獁錠ଌ킮嫶㩋갎랤슜﫤掾屚ﶃ岍湼㗏覐㏇鞱浻曶厢毻첩⛘븈⹀⬺霆癡顪橛Ⰴผ蠬魃텻滘拯㉺ੳଃ魻᧽탷蝮팳رﯝ퉜᾽訍ꆎ망곮㎧氡皆쎩쩶㮹벴룛蚑剆鷑ä㈻략狼汿烤맙묽됦㳺묨頴鯛㠙嶜Ⓣ컁瞜뜬瓚阓䛄╺큾웙㥏ꛘ㱈㲚走겁뿟ỗ诟ᾍ࿌垤眻㪇㫶춛ⱬ秒㲰㮽뜻贓藮꧹醽ᶍ実潊ᵍ쵌ㆁ蟆㈻校뤽鯚篦卷鷁筱鷆㜔놹鶁鞕희
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐