12

根据4.4 SMS APIs,新版本提供以下功能:

允许应用在设备上读取和写入 SMS 和 MMS 消息

我找不到有关此功能的任何信息,也找不到新 SDK 中的任何示例。到目前为止,这就是我阅读新传入消息的内容。

但是,我想阅读存储在设备上的现有消息:

// Can I only listen for incoming SMS, or can I read existing stored SMS?
SmsMessage[] smsList = Telephony.Sms.Intents.getMessagesFromIntent(intent);
for(SmsMessage sms : smsList) {
    Log.d("Test", sms.getMessageBody())
}

请注意:我知道使用SMS Content Provider,但是不支持此方法。根据链接的 API,我应该能够以受支持的方式执行此操作。

4

3 回答 3

32

看起来你可以使用这个类来让它工作。包是Telephony.Sms.Conversations

虽然以下代码使用了内容提供者方法,但现在这是 API Level 19 (KitKat) 中添加的官方 API,用于读取 SMS 消息。

public List<String> getAllSmsFromProvider() {
  List<String> lstSms = new ArrayList<String>();
  ContentResolver cr = mActivity.getContentResolver();

  Cursor c = cr.query(Telephony.Sms.Inbox.CONTENT_URI, // Official CONTENT_URI from docs
                      new String[] { Telephony.Sms.Inbox.BODY }, // Select body text
                      null,
                      null,
                      Telephony.Sms.Inbox.DEFAULT_SORT_ORDER); // Default sort order

  int totalSMS = c.getCount();

  if (c.moveToFirst()) {
      for (int i = 0; i < totalSMS; i++) {
          lstSms.add(c.getString(0));
          c.moveToNext();
      }
  } else {
      throw new RuntimeException("You have no SMS in Inbox"); 
  }
  c.close();

  return lstSms;
}
于 2013-11-13T23:51:31.440 回答
1

我是这样做的。创建短信对象:

public class SMSObject {
  private String _id;
  private String _address;
  private String _msg;
  private String _readState; // "0" for have not read sms and "1" for have
                            // read sms
  private String _time;
  private String _folderName;

  //+ getter and setter methods and 

  @Override
  public String toString() {
    return "SMSObject [_id=" + _id + ", _address=" + _address + ", _msg="
            + _msg + ", _readState=" + _readState + ", _time=" + _time
            + ", _folderName=" + _folderName + "]";
}

这里有一个简单的函数,它简单地记录所有当前的 SMS-Objects

private void readSMS() {
    List<SMSObject> lstSms = new ArrayList<SMSObject>();
    SMSObject objSms = new SMSObject();
    Uri message = Uri.parse("content://sms/");
    ContentResolver cr = this.getContentResolver();

    Cursor c = cr.query(message, null, null, null, null);
    // this.startManagingCursor(c);
    int totalSMS = c.getCount();
    Log.d("SMS Count->", "" + totalSMS);
    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {

            objSms = new SMSObject();
            objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
            objSms.setAddress(c.getString(c
                    .getColumnIndexOrThrow("address")));
            objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
            objSms.setReadState(c.getString(c.getColumnIndex("read")));
            objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
            if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
                objSms.setFolderName("inbox");
            } else {
                objSms.setFolderName("sent");
            }

            lstSms.add(objSms);

            Log.d("SMS at " + i, objSms.toString());

            c.moveToNext();
        }
    }
    // else {
    // throw new RuntimeException("You have no SMS");
    // }
    c.close();

    // return lstSms;

}
于 2013-11-11T13:49:26.537 回答
0

前几天发现的,不记得是哪个网站的了;只有当用户选择将应用设为默认短信应用时,您才能恢复消息。这可能会也可能不会完全回答您的问题。我还没试过这个

  1. 查询当前默认短信应用的包名并保存。

    String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
    
  2. 请求用户将默认 SMS 应用更改为您的应用以恢复 SMS 消息(您必须是默认 SMS 应用才能写入 SMS Provider)。

    Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);
    intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
    startActivity(intent);
    
于 2013-11-11T13:19:08.873 回答