カウントダウンタイマー付きのアプリケーションを開発しています。電話に着信がある場合にのみ、そのタイマーを一時停止したいと思います。電話を受けるたびにイベントを発生させる方法はありますか?
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();
}
}
このレシーバーを試してイベントを発生させます