ContentProvider读取联系人数据和ContentObsever实时短信监听

来源:互联网 发布:手机打印软件惠普 编辑:程序博客网 时间:2024/06/08 01:53

思路:首先,我们需要知道短信收发短信的存储过程,收到短信先存储到数据库中,然后再显示到界面上。然后短信也是可以通过ContentProvider进行共享的,所以我们需要找到com.android.providers.telephony这个程序中在写继承自ContentProvider的类时,在清单文件中所声明的authorities,然后就可以拿到Uri,就可对短信进行监听。我们查看源代码得知其声明的authorities为sms,所以我们在访问时的uri为content://sms,之后由于这个uri路径下存在多个表,并且每个表的列名我们也不知道,所以我们先查询之后,打印输出列名。新建项目,在布局文件中加一个ListView用来将实时收发的信息显示出来

之后:

一、创建监听,注册,当发送或者接受短信时,打印输出列名

MainActivity中的onCreate()中:

uri = Uri.parse("content://sms");//监听短信getContentResolver().registerContentObserver(uri,true,new SmsObserver(new Handler()));继承自ContentObserver的类为SmsObsever:private class SmsObserver extends ContentObserver{    public SmsObserver(Handler handler) {        super(handler);    }    @Override    public void onChange(boolean selfChange) {        super.onChange(selfChange);        Cursor c = getContentResolver().query(uri,null,null,null,null);c.moveToNext();String[] names = c.getColumnNames();//得到所有列名for(String name : names){    System.out.println(name);//输出查看列名}}


此时,收发担心,都会输出结果,列名我们需要的有address(电话号码),body(短信内容),type(1代表收到短信,2代表发出短信),暂时就取出着三个值进行监听吧
二、监听短信的收发,并且实时显示到ListView中
public class MainActivity extends ActionBarActivity {    Uri uri;    ListView listView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //短信的provider接口        uri = Uri.parse("content://sms");        //监听短信        getContentResolver().registerContentObserver(uri,true,new SmsObserver(new Handler()));        listView = (ListView)findViewById(R.id.listView);          }    private class SmsObserver extends ContentObserver{        public SmsObserver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange) {            super.onChange(selfChange);            //只取最后一个            Cursor c = getContentResolver().query(uri,null,null,null,"_id DESC LIMIT 1");            List<String> data= new ArrayList<String>();            c.moveToNext();            String[] names = c.getColumnNames();//得到所有列名            for(String name : names){                System.out.println(name);//输出查看列名            }                     while (c.moveToNext()){                String address = c.getString(c.getColumnIndex("address"));                String body= c.getString(c.getColumnIndex("body"));               // String name = c.getString(c.getColumnIndex("name"));                int type = c.getInt(c.getColumnIndex("type"));                String tranType = type==1?"received":"sent";                data.add(tranType + " " + body + "The number is: " + address);                         }            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data);            listView.setAdapter(adapter);
            //输出查看data的值            for(String d :data){                System.out.println(d);            }        }    }
至此,实时监听短信已经告一段落,可以将监听到的短信数据存到本地数据库或者传到服务器上,或者转发给自己。只是在做应用时收发验证码直接读取出来,切勿做他用。
下面,来说如何获取联系人数据,不是实时监听,就是想通过访问C联系人的数据库来读取数据,此时还是通过ContentProvider来访问:
首要问题,uri 和要查询的列名如何写,这里我们用系统提供好的:
还是在这个程序中写吧:
//读取联系人数据的方法,获取数据源
private  void readContact(){    Cursor c =null;    c = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);    while(c.moveToNext()) {        String name = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));        String number = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));        //data.add(name + " "+number);    }}
之后与数据源进行适配,显示在ListView中:
    List<String> data= new ArrayList<String>();    ListView listView;    ArrayAdapter<String> adapter;
    listView = (ListView)findViewById(R.id.listView);    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);    readContact();    listView.setAdapter(adapter);

这样就可以读取联系人数据


0 0
原创粉丝点击