0

着信 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");
                }
            }

        });
    }
}

}

4

1 に答える 1

0

BroadcastReceiver はそれほど長生きすることは想定されていないため、clearAbortBroadcast() に依存することはできません。

あなたの場合、あなたの流れは次のようになると思います:

  1. ブロードキャストを受信し、サーバーに送信します。
  2. ブロードキャストを中止し、携帯電話から SMS を削除します (これについてユーザーに警告する必要があります)。
  3. サーバーからの承認を待ちます。
  4. 承認された場合は、メッセージを SMS に保存し、ユーザーに通知します。

この種の検閲は良いとは思いませんが、理由があるかもしれませんが、これをインストールするユーザーがそれが何をするかを知っていることを確認してください.

于 2013-01-04T18:06:38.527 に答える