【问题标题】:Read all SMS from a particular sender读取来自特定发件人的所有短信
【发布时间】:2012-06-07 20:56:21
【问题描述】:

如何阅读特定发件人发给我的所有短信?例如。我想扫描 a) 正文,以及 b) 从“TM-MYAMEX”发送到手机的所有 SMS 的日期/时间。

一些网站似乎表明这可以从“content://sms/inbox”中读取。我无法弄清楚到底是怎么回事。也不确定大多数手机是否支持它。我使用的是 Galaxy S2。

【问题讨论】:

    标签: android sms


    【解决方案1】:

    试试这个方法:

    StringBuilder smsBuilder = new StringBuilder();
           final String SMS_URI_INBOX = "content://sms/inbox"; 
            final String SMS_URI_ALL = "content://sms/";  
            try {  
                Uri uri = Uri.parse(SMS_URI_INBOX);  
                String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" };  
                Cursor cur = getContentResolver().query(uri, projection, "address='123456789'", null, "date desc");
                 if (cur.moveToFirst()) {  
                    int index_Address = cur.getColumnIndex("address");  
                    int index_Person = cur.getColumnIndex("person");  
                    int index_Body = cur.getColumnIndex("body");  
                    int index_Date = cur.getColumnIndex("date");  
                    int index_Type = cur.getColumnIndex("type");         
                    do {  
                        String strAddress = cur.getString(index_Address);  
                        int intPerson = cur.getInt(index_Person);  
                        String strbody = cur.getString(index_Body);  
                        long longDate = cur.getLong(index_Date);  
                        int int_Type = cur.getInt(index_Type);  
    
                        smsBuilder.append("[ ");  
                        smsBuilder.append(strAddress + ", ");  
                        smsBuilder.append(intPerson + ", ");  
                        smsBuilder.append(strbody + ", ");  
                        smsBuilder.append(longDate + ", ");  
                        smsBuilder.append(int_Type);  
                        smsBuilder.append(" ]\n\n");  
                    } while (cur.moveToNext());  
    
                    if (!cur.isClosed()) {  
                        cur.close();  
                        cur = null;  
                    }  
                } else {  
                    smsBuilder.append("no result!");  
                } // end if  
                }
            } catch (SQLiteException ex) {  
                Log.d("SQLiteException", ex.getMessage());  
            }  
    

    AndroidManifest.xml:

    <uses-permission android:name="android.permission.READ_SMS" />
    

    【讨论】:

    • 效果很好,谢谢!我什至尝试使用“IN”子句,它按预期工作......但是......地址格式呢?在“sql where”语句中,如果我搜索地址“3485152182”它可以工作,但如果我搜索“348 5152182”或“348 5152 182”或“+393485152182”(具有国际前缀的相同地址),查询'会失败。有没有一种优雅的方法来解决这类问题?谢谢!
    • @GiveEmTheBoot :我认为没有通用的方法可以做到这一点,您可以使用一些字符串方法,例如“348 5152 182”,在这种情况下,您可以先修剪这个数字然后搜索它或“+393485152182如果您首先从数字中删除“+”号然后搜索它
    • @ProsperK...非常感谢你!我希望以一种更简单、更优雅的方式来做到这一点……也许如果短信地址以与联系人中的地址相同的方式/格式存储,我可以更好地实现我的目标。有人知道吗?
    • 我想知道sms表的“地址”字段中存储的地址是否与联系人表中存储的地址相同。如果我的联系人“Jack”在我的联系人中有“348 8591236”作为电话号码,那么我的短信表是否会在地址字段中准确包含“348 8591236”?我希望我现在更清楚了。
    • @GiveEmTheBoot :是的,你是对的,因为号码存储在联系人列表中,如果短信来自同一个号码,相同的用户将在短信列表中看到。
    【解决方案2】:

    试试这个,它是一种从收件箱中读取消息的简单方法。

    public class ReadMsg extends AppCompatActivity {
    
    ListView listView;
    private static final int PERMISSION_REQUEST_READ_CONTACTS = 100;
    ArrayList smsList;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read_msg);
        listView = (ListView)findViewById(R.id.idList);
    
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);
    
        if (permissionCheck == PackageManager.PERMISSION_GRANTED){
            showContacts();
        }else{
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS},PERMISSION_REQUEST_READ_CONTACTS);
        }
    }
    
    private void showContacts() {
        Uri inboxURI = Uri.parse("content://sms/inbox");
        smsList = new ArrayList();
        ContentResolver cr = getContentResolver();
    
    
        Cursor c = cr.query(inboxURI,null,null,null,null);
        while (c.moveToNext()){
            String Number = c.getString(c.getColumnIndexOrThrow("address")).toString();
            String Body= c.getString(c.getColumnIndexOrThrow("body")).toString();
            smsList.add("Number: "+ Number + "\n" + "Body: "+ Body );
        }
            c.close();
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, smsList);
        listView.setAdapter(adapter);
    }
    

    }

    将此权限添加到清单中。

    <uses-permission android:name="android.permission.READ_SMS"></uses-permission>
    

    【讨论】:

      【解决方案3】:
       protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              inbox = (Button) findViewById(R.id.inbox);
              list = (ListView) findViewById(R.id.list);
              arlist = new ArrayList<String>();
              inbox.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      Uri inboxUri = Uri.parse("content://sms/inbox");
                      String[] reqCols = {"_id", "body", "address"};
                      ContentResolver cr = getContentResolver();
                      Cursor cursor = cr.query(inboxUri, reqCols, "address='+919456'", null, null);
                      adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.msg_content_layout, cursor,
                              new String[]{"body", "address"}, new int[]{R.id.txt1, R.id.txt2});
                      list.setAdapter(adapter);
                  }
              });
      
          }
      

      这里我添加了数字+919456作为地址字段的值。

      除此之外,您还需要将 READ_SMS 权限添加到清单:

      【讨论】:

      • 这是否会匹配任何格式的电话号码,是否有空格,是否有国际国家代码?
      【解决方案4】:

      你可以在几行代码中做到这一点

      String[] phoneNumber = new String[] { "+923329593103" }; 
      Cursor cursor1 = getContentResolver().query(Uri.parse("content://sms/inbox"), new String[] { "_id", "thread_id", "address", "person", "date","body", "type" }, "address=?", phoneNumber, null);
                       StringBuffer msgData = new StringBuffer();
                      if (cursor1.moveToFirst()) { 
                          do {
      
      
                             for(int idx=0;idx<cursor1.getColumnCount();idx++)
                             {
                                 msgData.append(" " + cursor1.getColumnName(idx) + ":" + cursor1.getString(idx));
                             }
      
                          } while (cursor1.moveToNext());
                      } else {
      
                           edtmessagebody.setText("no message from this contact"+phoneNumber);
                      }
      

      【讨论】:

      • 这是否会匹配任何格式的电话号码,是否有空格,是否有国际国家代码?
      【解决方案5】:
      public class SmsController extends BroadcastReceiver {
      
      @Override
      public void onReceive(Context context, Intent intent) {
      SmsMessage msgs[] = null;
      Bundle bundle = intent.getExtras();
      try {
          Object pdus[] = (Object[]) bundle.get("pdus");
          msgs = new SmsMessage[pdus.length];
          for (int n = 0; n < pdus.length; n++) {
              byte[] byteData = (byte[]) pdus[n];
              msgs[n] = SmsMessage.createFromPdu(byteData);
          }
      } catch (Exception e) {
      
      }
      for (int i = 0; i < msgs.length; i++) {
          String message = msgs[i].getDisplayMessageBody();
          if (message != null && message.length() > 0) {
              String from = msgs[i].getOriginatingAddress();
              if(FROM.contains("TM-MYAMEX")){
                  String  body = message ;
                  Date datetime = new Date() ;
                  } 
              }
          }
        }
       }
      }
      

      我不确定“TM-MYAMEX”是什么意思,但这里是获取所有 SMS 的代码。

      Date = new Date()因为它在BroadcastReceiver下,那么你收到消息的时间就是当前时间。

      希望对您有所帮助。

      【讨论】:

      • TM-MYAMEX 表示此消息来自美国运通。我只是想知道你是否在地址中传递了这个值,而像这样cr.query(inboxUri, null, "address='TM-MYAMEX'", null, null); 查询返回 0 SMS。有谁知道如何从这些发件人那里获取短信??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多