Android 使用新的电话内容提供程序读取SMS

Android 使用新的电话内容提供程序读取SMS,android,sms,Android,Sms,根据,新版本提供了以下功能: 允许应用在设备上读写短信和彩信 我找不到有关此功能的任何信息,也找不到新SDK中的任何示例。这就是我到目前为止阅读新消息的方法 public List<String> getAllSmsFromProvider() { List<String> lstSms = new ArrayList<String>(); ContentResolver cr = mActivity.getContentResolver();

根据,新版本提供了以下功能:

允许应用在设备上读写短信和彩信

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

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;
}
但是,我想阅读设备上存储的现有信息

// 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())
}

请注意:我知道如何使用,但不支持此方法。根据链接的API,我应该能够以受支持的方式完成此操作。

我几天前发现了此功能,不记得是从哪个站点找到的; 只有当用户选择将应用程序设置为默认sms应用程序时,才能还原消息。这可能会也可能不会完全回答您的问题。我还没试过这个

  • 查询当前默认短信应用的软件包名称并保存

    String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
    
  • 请求用户将默认SMS应用更改为您的应用以还原SMS消息(您必须是默认SMS应用才能写入SMS提供商)


  • 我是这样做的。创建SMSObject:

    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对象

    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;
    
    }
    
    private void readSMS(){
    List lstSms=new ArrayList();
    SMSObject objSms=新的SMSObject();
    Uri消息=Uri.parse(“content://sms/");
    ContentResolver cr=this.getContentResolver();
    游标c=cr.query(消息,null,null,null,null);
    //这个.startManagingCursor(c);
    int totalSMS=c.getCount();
    Log.d(“SMS计数->”,“+totalSMS”);
    if(c.moveToFirst()){
    对于(int i=0;i
    看起来您可以使用该类使其正常工作。这个包裹是免费的

    尽管下面的代码使用内容提供者方法,但这现在是API级别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;
    }
    
    public List getAllSmsFromProvider(){
    List lstSms=new ArrayList();
    ContentResolver cr=mActivity.getContentResolver();
    
    游标c=cr.query(Telephony.Sms.Inbox.CONTENT\u URI,//来自文档的官方内容\u URI 新字符串[]{Telephony.Sms.Inbox.BODY},//选择正文文本 无效的 无效的 Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);//默认排序顺序 int totalSMS=c.getCount(); if(c.moveToFirst()){ 对于(int i=0;i
    对问题进行了澄清。我只对阅读短信感兴趣,真的不想将我的应用设置为默认短信应用。这使用了不支持的
    content://sms/
    内容解析器。问题是专门关于使用电话API以支持的方式执行此操作。哦,对不起。。。没有意识到这一点问题并不清楚,我更新了以澄清这一点:)@RGraham我只是查看了一下API。看起来你只能阅读新的短信,但不能阅读已经收到的短信。由于目前只有一个应用程序管理短信内容,这在某种程度上是有意义的。。但是文档真的很差…太棒了,谢谢!看起来这和发布的API@longilong是一样的,只是现在已经有了官方文档,所以我很高兴使用它。如果你可以更新答案来解释它现在是API的官方部分,并显示一些代码,我可以将其标记为答案。我更新了你答案上的代码,以便更好地说明新API的用法。再次感谢!如果我的应用程序是默认sms应用程序,则使用什么URI将sms写入sms提供商?是否有类似的文档URI用于将邮件写入收件箱和已发送邮件?Telephony.Sms.inbox.CONTENT\u URI在从收件箱删除邮件时提供非法参数异常未知URL。你知道怎么解决吗?