カウントダウンタイマー付きのアプリケーションを開発しています。電話に着信がある場合にのみ、そのタイマーを一時停止したいと思います。電話を受けるたびにイベントを発生させる方法はありますか?
7 に答える
クラスを拡張する必要があると思います。PhoneStateListenerそのクラスでは、電話の状態を処理します。そのためには、電話の状態を処理するためのマニフェスト ファイルのアクセス許可を使用します (つまり<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">)。
そしてTelephonyManager、電話のステータスを取得するために使用します。
 TelephonyManager  manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
 manager.listen(this, LISTEN_CALL_STATE); // Registers a listener object to receive notification of changes in specified telephony states.
そして、このメソッドをオーバーライドします。
     @Override
public void onCallStateChanged(int state, String incomingNumber) {
    super.onCallStateChanged(state, incomingNumber);
    switch (state) {
    case TelephonyManager.CALL_STATE_OFFHOOK:
    case TelephonyManager.CALL_STATE_RINGING:
        // Here you can perform your task while phone is ringing.
        break;
    case TelephonyManager.CALL_STATE_IDLE:
        break;
    }
}
着信をリッスンするブロードキャストレシーバーを作成する必要があります
詳細については、このリンクを参照してください...
BroadcastreceiveronReceive()に次のコードを記述します
適切な許可を与えることを忘れないでください
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            MyCallStateListener customPhoneListener = new MyCallStateListener();
            telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
            if (!intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
                return;
public class MyCallStateListener extends PhoneStateListener {
        public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:
                        break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
                        break;
        }
    }
}
最良の実装は、タイム スタンプ、タイマー (java.util.Timer または android.app.AlarmManager) を利用し、ブロードキャスト レシーバーを使用して電話イベントをリッスンすることです。
基本的に、一定期間アラームを開始する必要があるたびに、そのアラームの開始のタイムスタンプを保存し(おそらくSQLデータベースで最も簡単です)、タイマー/アラームを開始します。アラームが鳴ったら、保存されているタイムスタンプを必ずクリーンアップしてください。
電話の状態の変化を聞き、電話の応答が変化したら、すべてのアラーム/タイマーをクリアし、停止日を以前のタイムスタンプと一緒に記録し、電話が終了したら (受信者イベントから) タイマー/アラームを再起動します。残り時間。
public class OutgoingCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
           Toast.makeText(context, "My Toast", Toast.LENGTH_LONG).show();
    }
}
このレシーバーを試してイベントを発生させます