Мне нужно автоматически попытаться повторно отправить неудачное исходящее SMS на устройстве Samsung Android (Galaxy S10) через некоторое время (из-за плохого качества сигнала, отсутствия кредитов, отсутствия SIM-карты и т. д.).
Я нашел приложение Tasker (любые другие способы/предложения сделать это также будут в порядке).
Я пытался поймать событие Tasker SMS Failure, но это не помогает. В мануале есть примечание к этому событию: Only works for an SMS sent by Tasker's Send SMS action. Но мне нужно поймать событие сбоя из собственного приложения SMS.
Я также пытался поймать Intent com.samsung.intent.action.SMS_SEND_FAIL с помощью Tasker. Это тоже не работает (может быть, неправильное имя намерения?).
Парсинг записи LogCat также бесполезен, потому что не содержит данных SMS (мне нужен номер телефона получателя SMS и текст, чтобы попытаться отправить повторно).
И, наконец, я попытался получить SMS из внутренней базы данных телефона, но я мог получить только успешно отправленные сообщения и входящие:
content://sms/inbox - ОК (входящее СМС)
content://sms/sent - ОК (успешно отправлено)
content://sms - ОК (входящие + отправлено)
content://sms/all - пусто
content://sms/failed - пусто
content://sms/queued - пусто
content://sms/draft - пусто
content://sms/outbox - пусто
content://sms/undelivered - пусто
Любые другие решения? Большое спасибо!
Вот мое решение для грязи (требуется рут).
<TaskerData sr = "" dvi = "1" tv = "6.1.32">
<Profile sr = "prof12" ve = "2">
<cdate>1691745640721</cdate>
<edate>1691750328401</edate>
<flags>8</flags>
<id>12</id>
<limit>true</limit>
<mid0>13</mid0>
<nme>Failed SMS Retry</nme>
<Time sr = "con0">
<fh>6</fh>
<fm>0</fm>
<rep>2</rep>
<repval>10</repval>
<th>23</th>
<tm>0</tm>
</Time>
</Profile>
<Task sr = "task13">
<cdate>1691745663215</cdate>
<edate>1691750291965</edate>
<id>13</id>
<nme>Process Failed Sms</nme>
<pri>100</pri>
<Action sr = "act0" ve = "7">
<code>667</code>
<Int sr = "arg0" val = "0"/>
<Str sr = "arg1" ve = "3">/data/data/com.android.providers.telephony/databases/mmssms.db</Str>
<Int sr = "arg10" val = "1"/>
<Str sr = "arg2" ve = "3"/>
<Str sr = "arg3" ve = "3"/>
<Str sr = "arg4" ve = "3">SELECT _id, address, body, type FROM sms WHERE [type] = 5 ORDER BY _id ASC LIMIT 1</Str>
<Str sr = "arg5" ve = "3"/>
<Str sr = "arg6" ve = "3"/>
<Str sr = "arg7" ve = "3">∆</Str>
<Str sr = "arg8" ve = "3">%SMSES</Str>
<Int sr = "arg9" val = "0"/>
</Action>
<Action sr = "act1" ve = "7">
<code>548</code>
<on>false</on>
<Str sr = "arg0" ve = "3">%SMSES(1)</Str>
<Int sr = "arg1" val = "1"/>
<Str sr = "arg10" ve = "3"/>
<Int sr = "arg11" val = "1"/>
<Int sr = "arg12" val = "0"/>
<Str sr = "arg13" ve = "3"/>
<Int sr = "arg14" val = "0"/>
<Str sr = "arg15" ve = "3"/>
<Int sr = "arg2" val = "0"/>
<Str sr = "arg3" ve = "3"/>
<Str sr = "arg4" ve = "3"/>
<Str sr = "arg5" ve = "3"/>
<Str sr = "arg6" ve = "3"/>
<Str sr = "arg7" ve = "3"/>
<Str sr = "arg8" ve = "3"/>
<Int sr = "arg9" val = "1"/>
</Action>
<Action sr = "act2" ve = "7">
<code>547</code>
<Str sr = "arg0" ve = "3">%SMS</Str>
<Str sr = "arg1" ve = "3">%SMSES(1)</Str>
<Int sr = "arg2" val = "0"/>
<Int sr = "arg3" val = "0"/>
<Int sr = "arg4" val = "0"/>
<Int sr = "arg5" val = "3"/>
<Int sr = "arg6" val = "1"/>
<ConditionList sr = "if">
<Condition sr = "c0" ve = "3">
<lhs>%SMSES(#)</lhs>
<op>0</op>
<rhs>1</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr = "act3" ve = "7">
<code>590</code>
<Str sr = "arg0" ve = "3">%SMS</Str>
<Str sr = "arg1" ve = "3">∆</Str>
<Int sr = "arg2" val = "1"/>
<Int sr = "arg3" val = "0"/>
<ConditionList sr = "if">
<Condition sr = "c0" ve = "3">
<lhs>%SMSES(#)</lhs>
<op>0</op>
<rhs>1</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr = "act4" ve = "7">
<code>548</code>
<on>false</on>
<Str sr = "arg0" ve = "3">%SMS3</Str>
<Int sr = "arg1" val = "1"/>
<Str sr = "arg10" ve = "3"/>
<Int sr = "arg11" val = "1"/>
<Int sr = "arg12" val = "0"/>
<Str sr = "arg13" ve = "3"/>
<Int sr = "arg14" val = "0"/>
<Str sr = "arg15" ve = "3"/>
<Int sr = "arg2" val = "0"/>
<Str sr = "arg3" ve = "3"/>
<Str sr = "arg4" ve = "3"/>
<Str sr = "arg5" ve = "3"/>
<Str sr = "arg6" ve = "3"/>
<Str sr = "arg7" ve = "3"/>
<Str sr = "arg8" ve = "3"/>
<Int sr = "arg9" val = "1"/>
</Action>
<Action sr = "act5" ve = "7">
<code>667</code>
<Int sr = "arg0" val = "0"/>
<Str sr = "arg1" ve = "3">/data/data/com.android.providers.telephony/databases/mmssms.db</Str>
<Int sr = "arg10" val = "1"/>
<Str sr = "arg2" ve = "3"/>
<Str sr = "arg3" ve = "3"/>
<Str sr = "arg4" ve = "3">DELETE FROM sms WHERE [type] = 5 AND _id = %SMS1</Str>
<Str sr = "arg5" ve = "3"/>
<Str sr = "arg6" ve = "3"/>
<Str sr = "arg7" ve = "3"/>
<Str sr = "arg8" ve = "3">%XXX</Str>
<Int sr = "arg9" val = "0"/>
<ConditionList sr = "if">
<Condition sr = "c0" ve = "3">
<lhs>%SMSES(#)</lhs>
<op>0</op>
<rhs>1</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr = "act6" ve = "7">
<code>667</code>
<Int sr = "arg0" val = "0"/>
<Str sr = "arg1" ve = "3">/data/data/com.android.providers.telephony/databases/mmssms.db</Str>
<Int sr = "arg10" val = "1"/>
<Str sr = "arg2" ve = "3"/>
<Str sr = "arg3" ve = "3"/>
<Str sr = "arg4" ve = "3">UPDATE sms SET [type] = 2 WHERE [type] = 5 AND _id = %SMS1</Str>
<Str sr = "arg5" ve = "3"/>
<Str sr = "arg6" ve = "3"/>
<Str sr = "arg7" ve = "3"/>
<Str sr = "arg8" ve = "3">%XXX</Str>
<Int sr = "arg9" val = "0"/>
<ConditionList sr = "if">
<Condition sr = "c0" ve = "3">
<lhs>%SMSES(#)</lhs>
<op>0</op>
<rhs>1</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr = "act7" ve = "7">
<code>41</code>
<Str sr = "arg0" ve = "3">%SMS2</Str>
<Str sr = "arg1" ve = "3">%SMS3</Str>
<Int sr = "arg2" val = "0"/>
<Str sr = "arg3" ve = "3"/>
<Int sr = "arg4" val = "0"/>
<ConditionList sr = "if">
<Condition sr = "c0" ve = "3">
<lhs>%SMSES(#)</lhs>
<op>0</op>
<rhs>1</rhs>
</Condition>
</ConditionList>
</Action>
</Task>
</TaskerData>