着信 SMS メッセージをブロックし、何らかの処理を行った後に解放する Android アプリを開発しています。
私がやりたいことは、SMS がそのメッセージを受信したときに、そのメッセージをブロックしてオンライン サーバーにプッシュする必要があるということです。その後、管理者は Web サイトを介してサーバーにプッシュされたメッセージを表示し、承認または拒否できます。管理者がメッセージを承認した場合は、電話の受信トレイにリリースする必要があります。それ以外の場合は、メッセージを破棄します。
1つのことを除いてすべてを完了します。私がしたことは、メッセージがサーバーにプッシュされた後、スケジュールされたタイマー タスクが開始され、5 分ごとにオンライン サーバーを読み取り、メッセージが承認されていることを確認することです。「BroadcastReceiver」を使用して着信メッセージを追跡していますが、ブロックされたメッセージを解放するには、「onReceive」メソッドが終了する前に「clearAbortBroadcast()」メソッドを使用する必要があることを知っています。しかし、私のタイマーはスレッドとして機能します。したがって、タイマー内で「clearAbortBroadcast()」メソッドを呼び出すと、「onReceive」メソッドはすでに実行が終了しており、メッセージは解放されません。
誰かがこの問題を克服するのを手伝ってくれますか?
私の BroadcastReceiver クラス
public class SmsReceiver extends BroadcastReceiver{
// run on another Thread to avoid crash
private Handler mHandler = new Handler();
// timer handling
private Timer mTimer = null;
public static long NOTIFY_INTERVAL = 15000;
int id;
Context context;
SmsReceiver sr;
GetMsgStatus status;
Bundle bundle;
@Override
public void onReceive(Context context, Intent intent)
{
//this stops notifications to others
this.abortBroadcast();
this.context = context;
//create a instance of GetMsgStatus class
status = new GetMsgStatus(context);
//---get the SMS message passed in---
bundle = intent.getExtras();
SmsMessage[] msgs = null;
String from = null;
String to = null;
String msg= null;
String str = "";
if (bundle != null)
{
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
from = msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
msg = msgs[i].getMessageBody().toString();
str += "\n";
}
System.out.println("from "+from);
System.out.println("msg "+msg);
Toast.makeText(context, "SMS Received : ",Toast.LENGTH_LONG).show();
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
to = mTelephonyMgr.getLine1Number();
//push msg to the server
SendMsgToServer send = new SendMsgToServer(context, to, from, msg);
//get the msg id of the pushed msg
id = send.getId();
// cancel if already existed
if(mTimer != null) {
mTimer.cancel();
} else {
// recreate new
mTimer = new Timer();
}
// schedule task
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}
}
class TimeDisplayTimerTask extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run()
{
status.getDataFromServer(id);
//if status is 0 means msg rejected
if(status.getStatus()==0)
{
mTimer.cancel();
}
//if status is 1 means msg approved
else if(status.getStatus()==1)
{
sr.clearAbortBroadcast();
mTimer.cancel();
}
//pending
else
{
System.out.println("pending");
}
}
});
}
}
}