我正在尝试制作读取短信的Android应用程序

时间:2014-07-28 15:21:11

标签: android android-intent android-activity android-fragments android-permissions

我正在尝试制作读取短信内容的Android应用程序,当手机获取新短信时,应用程序会发出通知。 这就是我所拥有的(我从网站上看到的):

public class SMSRead extends Activity{

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      TextView view = new TextView(this);
      Uri uriSMSURI = Uri.parse("content://sms/inbox");
      Cursor cur = getContentResolver().query(uriSMSURI, null, null, null,null);
      String sms = "";
      while (cur.moveToNext()) {
          sms += "From :" + cur.getString(2) + " : " + cur.getString(11)+"\n";         
      }
      view.setText(sms);
      setContentView(view);
  }
}

目前,代码会打印短信的原始号码,但不显示短信cur.getString(11)的正文,而是显示null

我还实施了以下许可:
<uses-permission android:name="android.permission.READ_SMS"/>

2 个答案:

答案 0 :(得分:1)

因为它没有11列。做一个getColumnCount,你会看到它。

基本上,您不应该依赖列的顺序,除非您提供它们。你不是。而是使用getColumnIndex(String columnName)来确定哪个列是正文。

答案 1 :(得分:0)

这是一个在理想世界中应该起作用的样本:

public List<Sms> getAllSms(String folderName) {
    List<Sms> lstSms = new ArrayList<Sms>();
    Sms objSms = new Sms();
    Uri message = Uri.parse("content://sms/"+folderName);
    ContentResolver cr = mActivity.getContentResolver();

    Cursor c = cr.query(message, null, null, null, null);
    mActivity.startManagingCursor(c);
    int totalSMS = c.getCount();

    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {

            objSms = new Sms();
            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")));

            lstSms.add(objSms);
            c.moveToNext();
        }
    }
    // else {
    // throw new RuntimeException("You have no SMS in " + folderName);
    // }
    c.close();

    return lstSms;
}

此示例读取收件箱中的所有邮件。有点小提琴,你应该能够让它读取一条信息。