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
- ContentProvider读取联系人数据和ContentObsever实时短信监听
- Android读取短信和联系人
- Android -- ContentProvider, 读取和保存系统 联系人
- Android-ContentProvider读取和插入手机联系人
- 内容提供者ContentProvider共享数据,监控短信,操作联系人
- ContentProvider实现程序之间共享数据(如短信、联系人)
- ContentProvider 读取系统联系人
- Android -- 利用ContentProvider 读取和写入短信
- Android ContentProvider之读取和插入短信
- Android发送短信和读取联系人
- android中ContentProvider实现联系人的读取和插入
- 数据存储:ContentProvider获取联系人
- ContentProvider 监听数据变化
- 监听ContentProvider数据改变
- 监听ContentProvider数据改变
- 监听ContentProvider数据改变
- 监听ContentProvider数据改变
- 监听ContentProvider数据改变
- CursorAdapter的使用:获取手机联系人
- Android 多分辨率自适应总结
- 诗《风云续》
- 屏幕取色工具ColorPix
- solor5.x搭建
- ContentProvider读取联系人数据和ContentObsever实时短信监听
- Swift的单例模式写法
- ubuntu安装jdk的环境变量设置
- 使用WebLogic时控制台输出中文乱码解决方法
- uboot网卡移植
- 基于Monkey的Android自动化测试
- SAP PM表
- Oracle blob字段的插入和更新
- 数据库范式——通俗易懂【转】