内容提供者(ContentProvider)---获取联系人

一、基础知识

ContentProvider:为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。
1. 使用表的形式来组织数据
- 无论数据来源是什么,ContentProvider都会认为是一种表。(把数据组织成表格)
2. 提供的方法
- query:查询 - insert:插入 - update:更新 - delete:删除 - getType:得到数据类型 - onCreate:创建数据时调用的回调函数
3. 公共的URI
- 每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。
- Android所提供的ContentProvider都存放在android.provider包当中。
4. 对比分析
虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同。
- 采用文件方式对外共享数据,需要进行文件操作读写数据;
- 采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。
- 使用ContentProvider共享数据的好处是统一了数据访问方式。

内容访问者访问系统联系人,有两种方式,第一种是用Intent跳转系统自带的Activity(就是android系统自带的联系人界面),显示联系人信息。第二种是从系统数据库中得到联系人数据显示到Listview中。这里我只讲第二种 。

main_activity.xml



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:orientation="vertical"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zking.shuanger_android_25_contentprovider2.MainActivity">

   <Button
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="获取联系人"
       android:onClick="getContact"
       />
   <ListView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:layout_marginTop="20dp"
       android:layout_marginRight="16dp"
       android:layout_marginLeft="16dp"
       android:id="@+id/main_listview"
       android:visibility="gone"
       >ListView>

LinearLayout>

自定义联系人展示的activity



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_contact"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:background="#ffffff"
    android:orientation="vertical"
    tools:context="com.zking.shuanger_android_25_contentprovider2.ContactActivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginRight="16dp"
        android:layout_marginLeft="16dp"
        android:id="@+id/lv_mian"

        >ListView>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:background="#f9aea3"
        android:layout_marginTop="16dp"
        />

LinearLayout>

自定义contact_item.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/contact_item"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff">
        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:id="@+id/img_mian_logo"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:src="@drawable/olqbank_tx"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="17sp"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@id/img_mian_logo"
            android:id="@+id/text_mian_name"
            android:textColor="#292929"
            android:text="ggg"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/text_mian_name"
            android:layout_marginTop="5dp"
            android:layout_alignLeft="@id/text_mian_name"
            android:layout_marginBottom="10dp"
            android:id="@+id/text_mian_tel"
            android:textColor="#818080"
            android:text="ggg"
            />
    RelativeLayout>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:background="#f9aea3"
        android:layout_marginTop="5dp"
        />

LinearLayout>

ContactActivity.java

public class ContactActivity extends AppCompatActivity {
    /**
     * 获取库Phon表字段
     **/
    private static final String[] PHONES_PROJECTION = new String[]{
            Phone.DISPLAY_NAME, Phone.NUMBER, Phone.CONTACT_ID};

    /**
     * 联系人显示名称
     **/
    private static final int PHONES_DISPLAY_NAME_INDEX = 0;

    /**
     * 电话号码
     **/
    private static final int PHONES_NUMBER_INDEX = 1;

    /**
     * 联系人的ID
     **/
    private static final int PHONES_CONTACT_ID_INDEX = 2;

    /**
     * 联系人名称
     **/
    private ArrayList mContactsName = new ArrayList();

    /**
     * 联系人号码
     **/
    private ArrayList mContactsNumber = new ArrayList();

    private ContentResolver cr;
    private ListView lv_mian;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
        //得到内容访问者
        cr = getContentResolver();
        //得到listView
        lv_mian = (ListView) findViewById(R.id.lv_mian);

        getPhoneContacts();
        lv_mian.setAdapter(new MyAdapter());

        lv_mian.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {
                Intent intent=new Intent(ContactActivity.this,MainActivity.class);
                intent.putExtra("tel",mContactsNumber.get(i));
                intent.putExtra("name",mContactsName.get(i));
                startActivity(intent);
                finish();
            }
        });

    }

    /**
     * 得到手机通讯录联系人信息
     **/
    public void getPhoneContacts() {
        //获取联系人
        Cursor phoneCurso = cr.query(Phone.CONTENT_URI, PHONES_PROJECTION, null, null, null);
        if (phoneCurso != null) {
            while (phoneCurso.moveToNext()) {
                //得到手机号
                String phoneNumber = phoneCurso.getString(PHONES_NUMBER_INDEX);
                ////当手机号码为空的或者为空字段 跳过当前循环
                if (TextUtils.isEmpty(phoneNumber)) {
                    continue;
                }
                //得到联系人的名称
                String contactName = phoneCurso.getString(PHONES_DISPLAY_NAME_INDEX);
                //得到联系人的ID
                Long contactid = phoneCurso.getLong(PHONES_CONTACT_ID_INDEX);

                Log.i("test","本地联系人:"+contactName+"###"+phoneNumber);

                mContactsName.add(contactName);
                mContactsNumber.add(phoneNumber);
            }
            phoneCurso.close();
        }
    }

    /**
     * 得到手机SIM卡联系人人信息
     **/
    public void getSIMContacts() {
        //获取SIM卡联系人
        Uri uri = Uri.parse("content://icc/adn");
        Cursor cursor = cr.query(uri, PHONES_PROJECTION, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                //得到手机号
                String phoneNumber = cursor.getString(PHONES_NUMBER_INDEX);
                ////当手机号码为空的或者为空字段 跳过当前循环
                if (TextUtils.isEmpty(phoneNumber)) {
                    continue;
                }
                //得到联系人的名称
                String contactName = cursor.getString(PHONES_DISPLAY_NAME_INDEX);
                Log.i("test","SIM卡联系人:"+contactName+"###"+phoneNumber);

                mContactsName.add(contactName);
                mContactsNumber.add(phoneNumber);
            }
            cursor.close();
        }
    }

    class MyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            Log.i("test","数量:"+mContactsNumber.size());
            return mContactsName.size();
        }
        @Override
        public boolean areAllItemsEnabled() {
            return false;
        }
        @Override
        public Object getItem(int i) {
            return i;
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
//             text_mian_name = null;
//             text_mian_tel = null;
            if (view == null) {
                view = LayoutInflater.from(ContactActivity.this).inflate(R.layout.contact_item, null);
                TextView  text_mian_name = (TextView) view.findViewById(R.id.text_mian_name);
                TextView  text_mian_tel = (TextView) view.findViewById(R.id.text_mian_tel);
                text_mian_name.setText(mContactsName.get(i));
                text_mian_tel.setText(mContactsNumber.get(i));
            }
            Log.i("test","所有联系人:"+mContactsName.get(i)+"###"+mContactsNumber.get(i));

            return view;
        }
    }


}

MainActivity.xml

public class MainActivity extends AppCompatActivity {

    private ListView main_listview;
    private List> data=new ArrayList<>();
    private Map map = new HashMap<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        main_listview = (ListView) findViewById(R.id.main_listview);
        getData();
        SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,data,R.layout.contact_item,new String[]{"name","tel"},new int[]{R.id.text_mian_name,R.id.text_mian_tel});

        main_listview.setAdapter(simpleAdapter);


    }

    public void getContact(View view){
        Intent intent = new Intent(MainActivity.this,ContactActivity.class);
        startActivity(intent);
    }

    public void getData(){
        String name=getIntent().getStringExtra("name");
        String tel=getIntent().getStringExtra("tel");
                map.put("name", name);
                map.put("tel", tel);
                main_listview.setVisibility(View.VISIBLE);
                data.add(map);
    }
}


在清单文件中配置权限


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

你可能感兴趣的:(数据,应用)