ContentProvider讀寫聯絡人列表以及許可權處理
阿新 • • 發佈:2019-02-12
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要點就是這麼多。