ContentProvider官方教程(4)ContentResolver权限

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为例,需要声明如下权限:

```

package="com.example.myapp">

...

```

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> mDataList = new ArrayList<>();

private SimpleAdapter mAdapter;

private Uri mUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

private String[] mProjection = {ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};

private String mSelection = null;

private String[] mSelectionArgs = null;

private String mSortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mListView = findViewById(R.id.list_view);

mAdapter = new SimpleAdapter(this, mDataList, R.layout.list_item,

new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,

ContactsContract.CommonDataKinds.Phone.NUMBER},

new int[]{R.id.name_text_view, R.id.number_text_view});

mListView.setAdapter(mAdapter);

initData();

}

private void initData() {

Cursor cursor = getContentResolver().query(mUri, mProjection, mSelection, mSelectionArgs, mSortOrder);

while (cursor.moveToNext()) {

String id = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));

String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

Map map = new HashMap<>();

map.put("id", id);

map.put("name", name);

map.put("number", number);

mDataList.add(map);

}

cursor.close();

mAdapter.notifyDataSetChanged();

}

public void onSearchClick(View view) {

EditText editText = findViewById(R.id.query_edit_text);

String query = editText.getText().toString().trim();

if (TextUtils.isEmpty(query)) {

mSelection = null;

mSelectionArgs = null;

} else {

mSelection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " LIKE ?";

mSelectionArgs = new String[]{"%" + query + "%"};

}

mDataList.clear();

initData();

}

public void onInsertClick(View view) {

ContentValues values = new ContentValues();

values.put(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, "张三");

values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890");

getContentResolver().insert(mUri, values);

mDataList.clear();

initData();

}

public void onUpdateClick(View view) {

ContentValues values = new ContentValues();

values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "9876543210");

String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = ?";

String[] selectionArgs = {"张三"};

getContentResolver().update(mUri, values, selection, selectionArgs);

mDataList.clear();

initData();

}

public void onDeleteClick(View view) {

String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = ?";

String[] selectionArgs = {"张三"};

getContentResolver().delete(mUri, selection, selectionArgs);

mDataList.clear();

initData();

}

}

```

以上代码通过ContentResolver访问ContactsContract中的数据,实现了对联系人列表的查找、插入、修改和删除。通过调用getContentResolver().query()、getContentResolver().insert()、getContentResolver().update()和getContentResolver().delete()方法完成相应的操作。

总结

ContentResolver是Android系统中与ContentProvider通信的核心组件之一,它提供了四种基本操作方法:query、insert、update和delete。使用ContentResolver时需要注意权限的问题,否则可能会出现无法访问ContentProvider的情况。本文通过案例介绍了ContentResolver的基本使用方法,希望对开发者有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(82) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部