首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》账户信息

关灯直达底部

为了访问账户信息,在manifest文件中必须提供以下权限:


<uses-permission android:name=/"android.permission.GET_ACCOUNTS/" /><uses-permission android:name=/"android.permission.READ_CONTACTS/" /><uses-permission android:name=/"android.permission.WRITE_CONTACTS/" />  

在Activity中,可以使用managedQuery方法查询ContactsContract.Contacts数据,并返回Cursor:


private Cursor getContacts {    Uri uri = ContactsContract.Contacts.CONTENT_URI;    String projection = new String {            ContactsContract.Contacts._ID,            ContactsContract.Contacts.LOOKUP_KEY,            ContactsContract.Contacts.DISPLAY_NAME    };    String selection = null;    String selectionArgs = null;    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +                                                    /" COLLATE LOCALIZED ASC/";    return managedQuery(uri, projection, selection, selectionArgs, sortOrder);}  

关于ContactsContract.Contacts类中可用的字段和常数的完整信息,可参考开发者文档:http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html。

有了Cursor,可以在SimpleCursorAdapter中加载它,并显示特定的数据字段,在这个例子中即联系信息“display name”:


String fields = new String {            ContactsContract.Data.DISPLAY_NAME};SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,                                                        R.layout.contact,                                                        cursor,                                                        fields,                                                        new int {R.id.name});    // get the listviewListView contactlist = (ListView) findViewById(R.id.contactlist);    // set the adapter and let it rendercontactlist.setAdapter(adapter);  

以下是包含ListView的layout(通过R.id.contactlist引用):


<?xml version=/"1.0/" encoding=/"utf-8/"?><LinearLayout xmlns:android=/"http://schemas.android.com/apk/res/android/"    android:orientation=/"vertical/"    android:layout_    android:layout_    android:background=/"#fff/"      >      <ListView android:id=/"@+id/contactlist/"          android:layout_          android:layout_          /></LinearLayout>  

以下是SimpleCursorAdapter的通讯录layout(通过R.layout.contact引用):


<?xml version=/"1.0/" encoding=/"utf-8/"?><LinearLayout xmlns:android=/"http://schemas.android.com/apk/res/android/"          android:layout_          android:layout_          android:background=/"#fff/"            ><TextView android:id=/"@+id/name/"          android:layout_        android:layout_        android:textColor=/"#000/"        android:textSize=/"25sp/"        android:padding=/"5dp/"        /></LinearLayout>  

这里,通过提供Cursor及Cursor内的位置来删除联系方式:


private void deleteContact(Cursor cursor, int position) {    cursor.moveToPosition(position);    long id = cursor.getLong(0);    String lookupkey = cursor.getString(1);    Uri uri = ContactsContract.Contacts.getLookupUri(id, lookupkey);    String selectionArgs = null;    String where = null;    ContentResolver cr = getContentResolver;    cr.delete(uri, where, selectionArgs);}  

在这个例子中,为了添加联系方式,构建了一组ContentProviderOperations并对其进行了批量处理。注意,首先插入新的联系方式,然后如果有电话信息,就增加电话信息(正如这个例子所示)。为了执行插入操作,通过SimpleCursorContentProviderOperation.newInsert方法创建了ContentProviderOperation.Builder,生成专门执行insert的ContentProviderOperation,然后调用build方法执行构建:


String accountNameWeWant = /"SpecialAccount/";String phone = /"8885551234/";String name = /"Bob/";String accountname = null;String accounttype = null;Account accounts = AccountManager.get(this).getAccounts;// find the account we want. if we don/'t find it we use /'null/' - the defaultfor(Account account : accounts) {    if(account.equals(accountNameWeWant)) {        accountname = account.name;        accounttype = account.type;        break;    }}ArrayList<ContentProviderOperation> ops =  new ArrayList<ContentProviderOperation>;ops.add(ContentProviderOperation.newInsert    (ContactsContract.RawContacts.CONTENT_URI)        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountname)        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accounttype)        .build);// create the new contactops.add(ContentProviderOperation.newInsert        (ContactsContract.Data.CONTENT_URI)      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)      .withValue(ContactsContract.Data.MIMETYPE,         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)      .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,         name)      .build);// if there is a phone num we add itif(phone.getText != null   && phone.getText.toString.trim.length > 0) {    ops.add(ContentProviderOperation.newInsert            (ContactsContract.Data.CONTENT_URI)        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)        .withValue(ContactsContract.Data.MIMETYPE,               ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,            phone)        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,               ContactsContract.CommonDataKinds.Phone.TYPE_HOME)        .build);}try {    getContentResolver.applyBatch(ContactsContract.AUTHORITY, ops);} catch (Exception e) {    e.printStackTrace;    }