Android,处理来电事件

时间:2012-08-14 05:58:28

标签: android countdowntimer

我正在开发一个具有倒数计时器的应用程序。我想只有在手机上有来电时暂停该计时器。每当我们接到电话时,有没有办法解雇一个事件?

7 个答案:

答案 0 :(得分:4)

我认为你应该扩展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;
    }
}

答案 1 :(得分:1)

当收到电话呼叫时,OS会触发一条消息,技术上称为广播。

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

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

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

这就是它背后的故事。快乐的编码。

答案 2 :(得分:0)

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

请参阅this链接了解详情...

答案 3 :(得分: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) { } }

答案 4 :(得分:0)

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

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

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

答案 5 :(得分: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;
        }

    }
}

答案 6 :(得分:-5)

public class OutgoingCallReceiver extends BroadcastReceiver {

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

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

尝试使用此接收器触发事件​​