Android Служба приложения не может прочитать SMS в delphi - PullRequest
0 голосов
/ 21 июня 2020

Я использую Delphi в rad studio 10.4 создание приложения android, которое читает SMS и пересылает его на электронную почту.

, поэтому у меня есть модуль, содержащий функцию для чтения SMS-сообщений. когда основное приложение использует функции, оно работает нормально, но когда служба использует функцию, это вызывает исключение и приводит к зависанию приложения, сообщение об исключении говорит: «Действие не найдено, возможно, вы находитесь в службе»

почему это происходит? Моя цель - прочитать SMS-сообщение в фоновом режиме и поработать с ним.

 unit uReadSMS;

interface
USES
System.SysUtils,
System.IOUtils ,
Androidapi.Helpers,
Androidapi.Jni.Os,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Net,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Telephony;

function FetchSms(const Ainteger: integer): String;

function FetchLastSmsID: String;


implementation

var
cursor: JCursor;
uri: Jnet_Uri;
address,person,msgdatesent,protocol,msgread,msgstatus,msgtype,
msgreplypathpresent,subject,body,
servicecenter,locked,threadid,smsid :string;
msgunixtimestampms,SUBSCRIPTIONID:int64;
addressidx,
personidx,
msgdateidx,
msgdatesentidx,
protocolidx,
msgreadidx,
msgstatusidx,
msgtypeidx,msgreplypathpresentidx,subjectidx,bodyidx,
servicecenteridx,
lockedidx,threadidx,smsidx:integer;

Function FetchSms(const Ainteger: integer): String;
 var
 MSGid:Integer;
 sl:string;
begin
  // MSGid :=STRTOINT(Astring);
   sl:='';
   uri:=StrToJURI('content://sms/inbox');
cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil);
addressidx:=cursor.getColumnIndex(StringToJstring('address'));
personidx:=cursor.getColumnIndex(StringToJstring('person'));
msgdateidx:=cursor.getColumnIndex(StringToJstring('date'));
msgdatesentidx:=cursor.getColumnIndex(StringToJstring('date_sent'));
protocolidx:=cursor.getColumnIndex(StringToJstring('protocol'));
msgreadidx:=cursor.getColumnIndex(StringToJstring('read'));
msgstatusidx:=cursor.getColumnIndex(StringToJstring('status'));
msgtypeidx:=cursor.getColumnIndex(StringToJstring('type'));
msgreplypathpresentidx:=cursor.getColumnIndex(StringToJstring('reply_path_present'));
subjectidx:=cursor.getColumnIndex(StringToJstring('subject'));
bodyidx:=cursor.getColumnIndex(StringToJstring('body'));
servicecenteridx:=cursor.getColumnIndex(StringToJstring('service_center'));
lockedidx:=cursor.getColumnIndex(StringToJstring('locked'));
threadidx:=cursor.getColumnIndex(StringToJstring('THREAD_ID'));
 //SMSIDX:=cursor.getColumnIndex(StringToJstring('SMS_ID'));
  repeat
      try
      begin
       Cursor.moveToNext  ;

      address:=JStringToString(cursor.getString(addressidx));
      person:=JStringToString(cursor.getString(personidx));
      msgunixtimestampms:=cursor.getLong(msgdateidx);
      msgdatesent:=JStringToString(cursor.getString(msgdatesentidx));
      protocol:=JStringToString(cursor.getString(protocolidx));
      msgread:=JStringToString(cursor.getString(msgreadidx));
      msgstatus:=JStringToString(cursor.getString(msgstatusidx));
      msgtype:=JStringToString(cursor.getString(msgtypeidx));
      msgreplypathpresent:=JStringToString(cursor.getString(msgreplypathpresentidx));
      subject:=JStringToString(cursor.getString(subjectidx));
      body:=JStringToString(cursor.getString(bodyidx));
      servicecenter:=JStringToString(cursor.getString(servicecenteridx));
      locked:=JStringToString(cursor.getString(lockedidx));
      threadid:=JStringToString(cursor.getString(threadidx));
      smsid  :=JStringToString(cursor.getString( smsidx ));

      sl:=sl+IntToStr(trunc(msgunixtimestampms/1000))+'*#$%V'+{ 'address: '+}address+
      '*#$%V'+{'person: '+}person+'*#$%V'
      +'date: '+msgdatesent+'*#$%V'+
      'protocol: '+protocol  +'*#$%V'
      +'msgread: '+'*#$%V'+msgread+
      '*#$%V'+
      'msgstatus: '+msgstatus+'*#$%V'+msgtype+'*#$%V'+
      'msgreplypathpresent: '+msgreplypathpresent
      +'*#$%V'+'subject: '+subject
      +'*#$%V'+
      'service center: '+servicecenter+'*#$%V'+
      'locked: '+locked+ '*#$%V'+threadid+ '*#$%V'+ 'SmsID:'+smsid + '*#$%V'+ {'body: '+}body +#13#10;
        end;
     except


      end;
       until ( strtoint(smsid) =   Ainteger)    or  (strtoint(smsid)  <  Ainteger)   ;

       result:=sl;

end;


 function FetchLastSmsID: String;

begin

   try


     begin

      uri:=StrToJURI('content://sms/inbox');
      cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil);
      addressidx:=cursor.getColumnIndex(StringToJstring('address'));
      personidx:=cursor.getColumnIndex(StringToJstring('person'));
      msgdateidx:=cursor.getColumnIndex(StringToJstring('date'));
      msgdatesentidx:=cursor.getColumnIndex(StringToJstring('date_sent'));
      protocolidx:=cursor.getColumnIndex(StringToJstring('protocol'));
      msgreadidx:=cursor.getColumnIndex(StringToJstring('read'));
      msgstatusidx:=cursor.getColumnIndex(StringToJstring('status'));
      msgtypeidx:=cursor.getColumnIndex(StringToJstring('type'));
      msgreplypathpresentidx:=cursor.getColumnIndex(StringToJstring('reply_path_present'));
      subjectidx:=cursor.getColumnIndex(StringToJstring('subject'));
      bodyidx:=cursor.getColumnIndex(StringToJstring('body'));
      servicecenteridx:=cursor.getColumnIndex(StringToJstring('service_center'));
      lockedidx:=cursor.getColumnIndex(StringToJstring('locked'));
      threadidx:=cursor.getColumnIndex(StringToJstring('THREAD_ID'));
      //SMSIDX:=cursor.getColumnIndex(StringToJstring('SMS_ID'));

      (cursor.movetoNEXT) ;
      address:=JStringToString(cursor.getString(addressidx));
      person:=JStringToString(cursor.getString(personidx));
      msgunixtimestampms:=cursor.getLong(msgdateidx);
      msgdatesent:=JStringToString(cursor.getString(msgdatesentidx));
      protocol:=JStringToString(cursor.getString(protocolidx));
      msgread:=JStringToString(cursor.getString(msgreadidx));
      msgstatus:=JStringToString(cursor.getString(msgstatusidx));
      msgtype:=JStringToString(cursor.getString(msgtypeidx));
      msgreplypathpresent:=JStringToString(cursor.getString(msgreplypathpresentidx));
      subject:=JStringToString(cursor.getString(subjectidx));
      body:=JStringToString(cursor.getString(bodyidx));
      servicecenter:=JStringToString(cursor.getString(servicecenteridx));
      locked:=JStringToString(cursor.getString(lockedidx));
      threadid:=JStringToString(cursor.getString(threadidx));
      smsid  :=JStringToString(cursor.getString( smsidx ));


      Result:=smsid ;
           end
        except
          on E : Exception do
           begin
             TFile.WriteAllText(TPath.Combine(TPath.GetSharedDownloadsPath, 'the exception message.txt'),  E.Message);

           end;
         end;
      end;

end.
...