如何从收件箱中删除短信?

4
我已经编写了一款自动短信回复程序:
.
.
.
function IsSMSAnswered(smsid: string): Boolean;
begin
  // Code to test if SMS is answered
end;

procedure SendReplySMS(reply_smssender, reply_smsbody: string);
begin
  // Code to send reply to smssender
end;

procedure FetchSMS;  //fetch sms used by timer every 1 minute
var
  cursor: JCursor;
  uri: Jnet_Uri;

  id_smsid: integer;
  id_smssender: integer;
  id_smsbody: integer;

  id_smsid: string;
  smssender: string;
  smsbody: string;
  smsreply: string;
begin
  uri:= StrToJURI('content://sms/inbox');
  cursor:= SharedActivity.getContentResolver.query(uri, nil, nil, nil, nil);

  id_smsid:= cursor.getColumnIndex(StringToJstring('_id'));
  id_smssender:= cursor.getColumnIndex(StringToJstring('address'));
  id_smsbody:=cursor.getColumnIndex(StringToJstring('body'));

  cursor.moveToLast;
  for i:= cursor.getCount downto 1 do
    begin
      smsid:= :=JStringToString(cursor.getString(id_smsid));

      if not IsSMSAnswered(smsid) then
        begin
          smssender:=JStringToString(cursor.getString(id_smssender));
          smsbody:=JStringToString(cursor.getString(id_smssender));

          if smsbody = 'abc' then
            SendReplySMS(smssender, 'reply abc')
          else if smsbody = 'def' then
            SendReplySMS(smssender, 'reply def');
        end
      else
        Break;
    end;
end;
.
.
.

在这种情况下,所有收到的短信消息都保留在手机数据库中。

处理完后如何从手机数据库中删除已收到的短信消息?

.
.
.
if not IsSMSAnswered(smsid) then
  begin
    smssender:=JStringToString(cursor.getString(id_smssender));
    smsbody:=JStringToString(cursor.getString(id_smssender));

    if smsbody = 'abc' then
      SendReplySMS(smssender, 'reply abc')
    else if smsbody = 'def' then
      SendReplySMS(smssender, 'reply def');

    ???? Now do I delete this received message ????
  end
.
.
.

此解决方案不适用于 Delphi... - pudnivec74
你是怎么得到它们的?你使用了什么数据抽象? - pskink
我从SharedActivity.getContentResolver.query获取了它们 - 请参见上面的代码。 - pudnivec74
太好了!因此使用ContentResolver将它们删除。 - pskink
可以。但是你需要展示一些代码来说明它如何实现吗? - pudnivec74
显示剩余2条评论
1个回答

4
我有一个解决方案(在pskink的帮助下):
.
.
.
procedure FetchSMS;  //fetch sms used by timer every 1 minute
var
  cursor: JCursor;
  uri: Jnet_Uri;
  uri_del: Jnet_Uri;

  id_smsid: integer;
  id_smssender: integer;
  id_smsbody: integer;

  smsid: string;
  smssender: string;
  smsbody: string;
  smsreply: string;
begin
  uri:= StrToJURI('content://sms/inbox');
 cursor:= SharedActivity.getContentResolver.query(uri, nil, nil, nil, nil);

  id_smsid:= cursor.getColumnIndex(StringToJstring('_id'));
  id_smssender:= cursor.getColumnIndex(StringToJstring('address'));
  id_smsbody:=cursor.getColumnIndex(StringToJstring('body'));

  cursor.moveToLast;
  for i:= cursor.getCount downto 1 do
    begin
      smsid:= :=JStringToString(cursor.getString(id_smsid));

      if not IsSMSAnswered(smsid) then
        begin
          smssender:=JStringToString(cursor.getString(id_smssender));
          smsbody:=JStringToString(cursor.getString(id_smssender));

          if smsbody = 'abc' then
            SendReplySMS(smssender, 'reply abc')
          else if smsbody = 'def' then
            SendReplySMS(smssender, 'reply def');

          // ???? Now I need to delete this received message ????

          // There is the answer
          uri_del:= StrToJURI('content://sms');
          SharedActivity.getContentResolver.delete(uri_del, StringToJString('_ID=' + smsid), nil);
          // There is the answer
        end
      else
        Break;
    end;
end;

. . .


感谢提供解决方案,点赞+1。 - Johan
我的大脑编译器告诉我,由于重复的 id_smsid 变量,这段代码无法编译。 - TLama
Cursor.getColumnIndex 始终会返回整数值。 - pudnivec74
1
可能是。我想指出的问题是您声明了两次 id_smsid 变量。 - TLama
1
你说得对。我已经修复了,现在它可以正确地显示了。 - pudnivec74

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接