Android学习总结(九)———— 内容提供器(ContentProvider)

一.内容提供器基本概念

  内容提供器主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。详细资料请看下图:

  

二.示例代码

2.1 读取系统联系人

  其实很多时候我们用到ContentProvider并不是自己暴露自己的数据,更多的时候通过ContentResolver来读取其他应用的信息,最常用的莫过于读取系统APP,信息,联系人, 多媒体信息等!如果你想来调用这些ContentProvider就需要自行查阅相关的API资料了! 另外,不同的版本,可能对应着不同的URL!这里给出如何获取URL与对应的数据库表的字段, 这里以最常用的联系人为例。哈哈哈哈~我们还是开始动手吧!

  编写一个布局文件,读取出来的的联系人信息能够在ListView中显示,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lvContacts"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


</LinearLayout>

  编写一个Activity,用来读取数据,展示数据,代码如下所示:

package com.nyl.contentprovidercontacts;

import android.app.Activity;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    private ListView lvContacts;

    private ArrayAdapter<String> arrayAdapter;

    private List<String> contactsList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lvContacts = (ListView) findViewById(R.id.lvContacts);
        arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList);
        lvContacts.setAdapter(arrayAdapter);
        readContacts();
    }

    /**
     * 读取联系人
     */
    private void readContacts() {
        Cursor cursor = null;
        //查询联系人数据
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null,null,null);
        //循环cursor中的数据
        while (cursor.moveToNext()){
            //获取联系人名字
            String displayName = cursor.getString(cursor.getColumnIndex(
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            //获取联系人手机号
            String number = cursor.getString(cursor.getColumnIndex(
                    ContactsContract.CommonDataKinds.Phone.NUMBER));
            //将数据添加到contactsList集合
            contactsList.add(displayName+"\n"+number);
        }
    }
}

  别忘了加读联系人的权限,代码如下:

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

   加入了android.permission.READ_CONTACTS的权限,程序就可以访问到系统的联系人数据,效果如下:

  

  

posted @ 2017-03-08 13:14  ButterflyGirl  阅读(397)  评论(0编辑  收藏  举报