使用ContentProvider读取手机联系人跟手机短信

1、Android使用内容提供者给我们提供了一些系统数据供我们访问,其中短信的Uri地址为:短信的Uricontent://sms/

手机联系人的Uri地址为:content://com.android.contacts/raw_contacts(获得联系人的id,姓名)

content://com.android.contacts/raw_contacts/"+id+"/data(根据联系人的id获得联系人的信息)
执行效果如下所图:

使用ContentProvider读取手机联系人跟手机短信_第1张图片使用ContentProvider读取手机联系人跟手机短信_第2张图片使用ContentProvider读取手机联系人跟手机短信_第3张图片使用ContentProvider读取手机联系人跟手机短信_第4张图片


2、下面是一个简单的读取短信的例子:

如下是xml文件

xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"
    tools:context="com.example.android_contentresolver02.MainActivity">
   <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">

       <Button android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="获取联系人"
           android:onClick="readperson"
           />
       <Button android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="获取短信"
           android:onClick="readmessage"
           />
   LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="220dp">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/lv_listview_person"
            >
        ListView>
    LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        >

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/lv_listview_message"
            >
        ListView>
    LinearLayout>

LinearLayout>


02.MainActivity文件 

 
  
package com.example.android_contentresolver02;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private ContentResolver contentResolver;
    private ListView lv_listview_person;
    private ListView lv_listview_message;
    private List> persondata;
    private List> messagedata;
    private SimpleAdapter personsa;
    private SimpleAdapter messagesa;
    private Map personmap;
    private Map messagemap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取xml中的展示联系人ListView的id
        lv_listview_person = (ListView) findViewById(R.id.lv_listview_person);
        //获取xml中的展示短信ListView的id
        lv_listview_message = (ListView) findViewById(R.id.lv_listview_message);

        //获取内容访问者
        contentResolver = getContentResolver();

        //实例化一个集合用来保存联系人的信息
        persondata = new ArrayList>();
        //高级控件的运用了简单适配器
        personsa = new SimpleAdapter(this, persondata, android.R.layout.simple_list_item_2, new String[]{"names", "phones"}, new int[]{android.R.id.text1, android.R.id.text2});
       //给listview添加适配器
        lv_listview_person.setAdapter(personsa);

        //这个是获取短信的集合
        messagedata = new ArrayList>();
        messagesa = new SimpleAdapter(this, messagedata, android.R.layout.simple_list_item_2, new String[]{"myphones", "content"}, new int[]{android.R.id.text1, android.R.id.text2});
        lv_listview_message.setAdapter(messagesa);
    }


    //获取联系人列表的方法
    public void readperson(View view) {

        //协议:content://com.android.contacts/raw_contacts(获得联系人的id,姓名)
        Cursor cursor = contentResolver.query(Uri.parse("content://com.android.contacts/raw_contacts"), null, null, null, null);
        while (cursor.moveToNext()) {
            personmap = new HashMap();
             //得到的联系人的id
            int id = cursor.getInt(cursor.getColumnIndex("_id"));
            //得到联系人的名字
            String displayname = cursor.getString(cursor.getColumnIndex("display_name"));
          
         //把名字添加到集合中 
         personmap.put("names", displayname);
           // 协议:content://com.android.contacts/raw_contacts/"+id+"/data(根据联系人的id获得联系人的信息)
            Cursor cursordate = contentResolver.query(Uri.parse("content://com.android.contacts/raw_contacts/" + id + "/data"), null, null, null, null);
            while (cursordate.moveToNext()) {
             //如果用了这个会报这样的错( Failed to read row 0, column -1 from 所以用下面这个字段)
                 //int  type= cursordate.getInt(cursor.getColumnIndex("mimetype_id"));
              
               //得到联系人的类型
                String type = cursordate.getString(cursordate.getColumnIndex("mimetype"));
                
                //得到联系人的电话号码
               String dates = cursordate.getString(cursordate.getColumnIndex("data1"));
         //给personmap集合添加值
                personmap.put("phones", dates);
            }
            //将personmap集合添加到persondata大的集合中显示
            persondata.add(personmap);
        }
        //通知适配器发生改变
        personsa.notifyDataSetChanged();
    }


//获取短信的方法
   public void readmessage(View view) {
        Cursor cursor = contentResolver.query(Uri.parse("content://sms/"), new String[]{"_id", "address", "body", "date", "type"}, null, null, null);
        if (cursor != null && cursor.getCount() > 0) {
            int _id;
            String address;
            String body;
            String date;
            int type;
            while (cursor.moveToNext()) {
                //实例化一个messagemap集合放电话号码跟短信内容的值
                messagemap = new HashMap();
                _id = cursor.getInt(0);
                address = cursor.getString(1);
                body = cursor.getString(2);
                date = cursor.getString(3);
                type = cursor.getInt(4);
                //给messagemap集合里设值
                messagemap.put("myphones",address);
                messagemap.put("content",body);
                //将messagemap集合添加到messagedata大的集合中
                messagedata.add(messagemap);
                Log.i("test", "_id=" + _id + " address=" + address + " body=" + body + " date=" + date + " type=" + type);
            }
        }
       //通知适配器发生改变
       messagesa.notifyDataSetChanged();
    }

}
 
  
03.清单文件中加上读写短信的权限


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





你可能感兴趣的:(使用ContentProvider读取手机联系人跟手机短信)