在Android中收听发送的短信或发送框

我正在开发一个应用程序将所有传入和传出的短信存储在SD卡中的文本文件。

我可以使用广播接收机收听收到的消息。 我发现收听短信非常困难。

我在某种程度上知道发送的邮箱或发件箱上的内容观察员需要设置,但我不知道该怎么做。

如何才能做到这一点?

基本上,你必须注册一个内容观察者…这样的事情:

ContentResolver contentResolver = context.getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, yourObserver); 

yourObserver是一个对象( new YourObserver(new Handler()) ),看起来像这样:

 class YourObserver extends ContentObserver { public YourObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // save the message to the SD card here } } 

那么,你究竟如何得到短信的内容呢? 你必须使用Cursor

 // save the message to the SD card here Uri uriSMSURI = Uri.parse("content://sms/out"); Cursor cur = this.getContentResolver().query(uriSMSURI, null, null, null, null); // this will make it point to the first record, which is the last SMS sent cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); // use cur.getColumnNames() to get a list of all available columns... // each field that compounds a SMS is represented by a column (phone number, status, etc.) // then just save all data you want to the SDcard :) 

这是我解决这个问题的方法

  1. 创build一个从其他活动调用的服务
  2. 在里面创build一个内容观察器

      @Override public int onStartCommand(Intent intent, int flag, int startId) { MyObserver myObserver = new MyObserver(new Handler()); ContentResolver contentResolver = this.getApplicationContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, myObserver); return START_STICKY; } 
  3. 创build观察者类

     class MyObserver extends ContentObserver { public MyObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse("content://sms/sent"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); String smsNumber = cur.getString(cur.getColumnIndex("address")); if (smsNumber == null || smsNumber.length() <= 0) { smsNumber = "Unknown"; } cur.close(); if(smsChecker( "OutgoingSMS to " + smsNumber + ": " + content)) { //save data into database/sd card here } } } 
  4. 我添加了一个方法smsChecker()来检查新消息是否与最后一条消息相同

     public boolean smsChecker(String sms) { boolean flagSMS = true; if (sms.equals(lastSMS)) { flagSMS = false; } else { lastSMS = sms; } //if flagSMS = true, those 2 messages are different return flagSMS; } 

如果我没有弄错的话,如果我们只想检查所有发送的邮件,我们就使用“content:// sms / sent”,如果我们只想检查发件箱里面的所有邮件,“content:// sms / out” ://短信“,如果我们要检查所有消息。

这是我的版本,已经在Android 6.0 +中validation

 class smsObserver extends ContentObserver { private String lastSmsId; public smsObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse("content://sms/sent"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String id = cur.getString(cur.getColumnIndex("_id")); if (smsChecker(id)) { String address = cur.getString(cur.getColumnIndex("address")); // Optional: Check for a specific sender if (address.equals(phoneNumber)) { String message = cur.getString(cur.getColumnIndex("body")); // Use message content for desired functionality } } } // Prevent duplicate results without overlooking legitimate duplicates public boolean smsChecker(String smsId) { boolean flagSMS = true; if (smsId.equals(lastSmsId)) { flagSMS = false; } else { lastSmsId = smsId; } return flagSMS; } } 

将此代码放置在应该启用观察者的地方

 ContentResolver contentResolver = getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms"), true, new smsObserver(new Handler())); 

这假定你正在使用一个活动。 请记住,您将需要一个Context引用来从服务或接收者中调用getContentResolver()

我看到了什么错误。 其上线:

  contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, _myObserver); 

你必须删除'/发送',只是写'content:// sms'它已经在ContentObserver中指定,以查看发送的短信。