2

我正在开发一个具有倒数计时器的应用程序。我只想在电话有来电时暂停该计时器。每当我们接到电话时,有什么方法可以触发事件吗?

4

7 回答 7

5

我认为你应该扩展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;
    }
}
于 2012-08-14T06:48:44.653 回答
1

当收到电话时,操作系统会触发一条消息,技术上称为广播。

任何应用程序都可以通过注册 PhoneIntentReceiver 查看/响应此消息,如果安装的多个应用程序已为此注册,则所有应用程序都有机会根据优先级查看此消息。

您可以通过 Manifest 或以编程方式注册 PhoneIntentReceiver。在这两种情况下,您都指定了一个扩展项目中广播接收器的类,它将在检测到来电时接收回调。

然后在这个类中,控件被传递给 onReceive 方法。它在这里,你可以停止你的 Timmer。

这就是它背后的故事。Happy Coding。

于 2013-07-17T12:34:55.933 回答
0

在您的 Broadcastreceiver 中onReceive()编写以下代码

不要忘记给予适当的许可

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;
        }

    }
}
于 2015-02-11T10:29:20.423 回答
0

您必须编写侦听来电的广播接收器

有关更多信息,请参阅此链接...

于 2012-08-14T06:09:40.543 回答
0

我想说最好的实现是利用时间戳、定时器(java.util.Timer 或 android.app.AlarmManager),然后使用广播接收器监听电话事件。

基本上每次您需要在一段时间内启动警报时,都会存储该警报开始的时间戳(可能在 sql db 中最简单),然后启动计时器/警报。当警报响起时,请确保清理您存储的时间戳。

确保收听电话状态的变化,并在接听电话时清除所有警报/计时器并记录停止日期以及之前的时间戳,然后在电话结束时(从您的接收者事件)重新启动计时器/警报剩余时间。

于 2013-05-02T18:56:47.417 回答
0

你必须为此使用广播接收器......

首先在 manifest.xml 中注册您的接收器

<receiver android:name="com.cygnet.phonefinder.receiver.PhoneIntentReceiver" > <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiver>

然后你必须处理那个接收器

public class PhoneIntentReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) { } }
于 2013-04-30T09:16:52.330 回答
-5
public class OutgoingCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

           Toast.makeText(context, "My Toast", Toast.LENGTH_LONG).show();
    }
}

试试这个接收器来触发一个事件

于 2012-08-14T06:07:37.513 回答