ContentResolver是Android系统中与ContentProvider通信的核心组件之一。通过ContentResolver,应用程序可以从ContentProvider中读取数据,也可以向ContentProvider中写入或修改数据。但是在使用ContentResolver的过程中,应用程序需要注意权限的问题,否则可能会出现无法访问ContentProvider的情况。
1. ContentResolver的权限
ContentResolver通过URI来访问特定的ContentProvider。而URI的访问权限对应ContentProvider的权限设置。因此,在使用ContentResolver时,需要了解所要访问的ContentProvider的权限设置。常见的ContentProvider权限有:
- android.permission.READ_CALENDAR:访问日历信息的权限;
- android.permission.WRITE_CALENDAR:修改日历信息的权限;
- android.permission.READ_CONTACTS:访问联系人信息的权限;
- android.permission.WRITE_CONTACTS:修改联系人信息的权限;
- android.permission.READ_SMS:访问短信信息的权限;
- android.permission.WRITE_SMS:修改短信信息的权限。
在应用程序中使用ContentResolver访问ContentProvider时,需要在AndroidManifest.xml文件中声明相应的权限。以访问ContactsContract.CommonDataKinds.Phone.CONTENT_URI为例,需要声明如下权限:
```
```
2. ContentResolver的使用方法
ContentResolver提供了四种基本操作方法:query、insert、update和delete。它们分别对应着ContentProvider中的查询、插入、更新和删除操作。
2.1 query方法
query方法用于查询ContentProvider中的数据,返回一个Cursor对象。
```
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
```
参数说明:
- uri:ContentProvider中的URI,用于标识数据的位置;
- projection:需要查询的列,即将从ContentProvider中获取哪些数据;
- selection:查询条件,用于筛选出满足条件的数据;
- selectionArgs:查询条件的参数,用于替换查询条件中的?占位符;
- sortOrder:数据排序方式。
示例代码如下:
```
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
String selection = ContactsContract.CommonDataKinds.Phone.TYPE + " = ?";
String[] selectionArgs = {String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)};
String sortOrder = null;
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.d("Contacts", "name: " + name + ", number: " + number);
}
cursor.close();
```
以上代码查询手机联系人中所有手机号码对应的名字和号码,其中projection参数指定了查询结果中需要返回的列,selection参数指定了查询条件,selectionArgs参数用"1"替换了查询条件中的?占位符。
2.2 insert方法
insert方法用于向ContentProvider中插入数据,返回新插入数据的URI。
```
Uri newUri = getContentResolver().insert(uri, values);
```
参数说明:
- uri:ContentProvider中的URI,用于标识数据的位置;
- values:待插入的数据。
示例代码如下:
```
Uri uri = ContactsContract.RawContacts.CONTENT_URI;
ContentValues values = new ContentValues();
values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, "myaccount");
Uri newUri = getContentResolver().insert(uri, values);
```
以上代码向通讯录中添加一个新的RawContact,其中ACCOUNT_TYPE是RawContact中的一个列名。
2.3 update方法
update方法用于更新ContentProvider中的数据,返回更新的数据条数。
```
int count = getContentResolver().update(uri, values, selection, selectionArgs);
```
参数说明:
- uri:ContentProvider中的URI,用于标识数据的位置;
- values:待更新的数据;
- selection:更新条件,用于筛选出满足条件的数据;
- selectionArgs:更新条件的参数,用于替换更新条件中的?占位符。
示例代码如下:
```
Uri uri = ContactsContract.Data.CONTENT_URI;
ContentValues values = new ContentValues();
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890");
String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = ?";
String[] selectionArgs = {"张三"};
int count = getContentResolver().update(uri, values, selection, selectionArgs);
```
以上代码将所有名字为"张三"的联系人的电话号码修改为"1234567890"。
2.4 delete方法
delete方法用于删除ContentProvider中的数据,返回删除的数据条数。
```
int count = getContentResolver().delete(uri, selection, selectionArgs);
```
参数说明:
- uri:ContentProvider中的URI,用于标识数据的位置;
- selection:删除条件,用于筛选出满足条件的数据;
- selectionArgs:删除条件的参数,用于替换删除条件中的?占位符。
示例代码如下:
```
Uri uri = ContactsContract.RawContacts.CONTENT_URI;
String selection = ContactsContract.RawContacts.ACCOUNT_TYPE + " = ?";
String[] selectionArgs = {"myaccount"};
int count = getContentResolver().delete(uri, selection, selectionArgs);
```
以上代码删除所有账户类型为"myaccount"的RawContact。
3. ContentResolver的案例说明
以下是一个使用ContentResolver访问ContactsContract的案例。代码中实现了读取联系人列表、查找联系人、插入联系人、修改联系人和删除联系人的功能。需要在AndroidManifest.xml文件中声明READ_CONTACTS和WRITE_CONTACTS两个权限。
```
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private List
发表评论 取消回复