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

Viv*_*vek 32 sms android

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

我能够使用广播接收器收听传入的消息.我发现收听外发短信非常困难.

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

如何才能做到这一点?

Cri*_*ian 47

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

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

yourObserver是一个object(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
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,你究竟如何获得短信的内容?你必须使用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 :)
Run Code Online (Sandbox Code Playgroud)

  • 字符串"content:// sms/out"对我不起作用.我使用了"content:// sms /"而没有out,并检查了"type"列== 2 for outgoing (4认同)

小智 5

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

  1. 创建从其他活动调用的服务
  2. 在其中创建内容观察者

     @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;
     }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建观察者类

    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
        }
    }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

如果我没有弄错的话,我们使用"content:// sms/sent"如果我们只想检查所有发送的消息,"content:// sms/out"如果我们只想检查发件箱内的所有消息,并且"内容:// sms"如果我们想检查所有消息.