Я использую 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.