1. 程式人生 > >ContentProvider讀寫聯絡人列表以及許可權處理

ContentProvider讀寫聯絡人列表以及許可權處理

ContentProvider簡介:

一個內容提供者訪問資料的中央資源庫。提供者是應用程式的一部分,提供自己的操作資料的UI。然而,內容提供者主要是被其他應用程式引用,通過提供者客戶物件訪問提供者。提供者和提供者客戶端為資料提供一個一致的,標準的介面,也處理程序間的聯絡和資料安全訪問。

提供者嚮應用程式呈現資料就像一個或多張表,就像是在關係資料庫裡一樣。一行顯示一些資料型別的例項,列的每行顯示例項資料集合的獨立資料。

一個應用程式通過客戶類ContentResolver訪問內容提供者的資料。這個函式有一個在提供者物件裡同名的函式,是一個ContentProvider子類的例項。函式ContentResolver提供”CRUD”的基礎(建立,獲取,更新,刪除)函式。

擁有提供者的應用程式程序的ContentResolver物件和ContentProvider物件可以自動處理程序間的資料交換。

簡而言之:ContentProvider以表的形式,向客戶端提供了訪問資料的API,通過ContentResolver實現程序間的資料共享。而程序間資料的共享通過uri來實現。

實現效果:
這裡寫圖片描述

這裡主要的實現方法:

private void getData() {
        ArrayList<UserModel> data = new ArrayList<>();
        //獲取ContentResolver物件
        ContentResolver cr = getContentResolver();
//查詢contacts表 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (!cursor.moveToFirst()) { Toast.makeText(this, "暫無內容", Toast.LENGTH_LONG).show(); } while (cursor.moveToNext()) { //獲取聯絡人名字 UserModel model = new UserModel();
int nameId = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); String name = cursor.getString(nameId); model.setName(name); //獲取電話號碼 Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)), null, null); //可能有多個號碼 if (phoneCursor.moveToNext()) { String phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); model.setPhone(phone + ";"); } //關閉cursor phoneCursor.close(); data.add(model); } //關閉cursor cursor.close(); adapter.getData(data); }

注意點:cursor用完之後必須要close;這裡通過nameId去查的是查不到手機號碼的。
其他點註釋 很清楚。

許可權:

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

這裡需要注意一下
需要做6.0動態許可權處理,以上做過論述,處理方式

繫結許可權

PermissionGen.with(MainActivity.this)
                .addRequestCode(100)
                .permissions(
                        Manifest.permission.READ_CONTACTS,
                        Manifest.permission.WRITE_CONTACTS)
                .request();
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }

    @PermissionSuccess(requestCode = 100)
    public void doSomething() {
        getData();
    }

    @PermissionFail(requestCode = 100)
    public void doFailSomething() {
        Toast.makeText(this, "Contact permission is not granted", Toast.LENGTH_SHORT).show();
    }

新增依賴:

  compile 'com.lovedise:permissiongen:0.0.6'

ContentProvider要點就是這麼多。