是否有可能在Android中检测被拒绝的呼叫?

时间:2010-12-20 14:12:02

标签: android calllog

在我的应用程序中,当用户拒绝呼叫时拦截是很好的,即选择发送忙音。 除了在有来电时收到通知,还有什么办法可以做到这一点吗? 我没有在文档中找到任何关于此的内容。 这些信息是否存储在通话记录中,即我是否可以轮询通话记录以查看通话是否被拒绝或接听?

3 个答案:

答案 0 :(得分:5)

嘿。 您可以使用PhoneStateListenerCallLog类查询最近的呼叫列表,以查找被拒绝的呼叫。

http://developer.android.com/reference/android/provider/CallLog.html http://developer.android.com/reference/android/telephony/PhoneStateListener.html

或者,您可以监控android.intent.action.NEW_OUTGOING_CALLandroid.intent.action.NEW_INCOMING_CALL上的广播 只需将android.permission.PROCESS_INCOMING_CALLSandroid.permission.PROCESS_OUTGOING_CALLS放入清单。

答案 1 :(得分:1)

经过很长一段时间,搜索和逻辑解决了这个问题,我得到了解决方案:

问题如果我打电话给某个人,如果我的电话未被该人接受,在我身边我必须出示敬酒,我的电话被拒绝 < / p>

解决方案: 创建一个通过两个动作注册的接收器

android.intent.action.NEW_OUTGOING_CALL   android.intent.action.PHONE_STATE

这两项行动都是必要的。

为此,您必须获得许可

   <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

Manifast.xml

<receiver android:name="Call_Receiver">
            <intent-filter>

                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
                <action android:name="android.intent.action.PHONE_STATE"/>

            </intent-filter>
        </receiver>

你的BroadcastReceiver类

* Call_Receiver.java *

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

/** 
 * 
 */
public class Call_Receiver extends BroadcastReceiver {

    private Context ctx;


    @Override
    public void onReceive(Context context, Intent intent) {
        ctx = context;
        OutgoingIncomingCallListener phoneListener = new OutgoingIncomingCallListener();
        TelephonyManager telephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);

        if (intent.getAction()
                .equals("android.intent.action.NEW_OUTGOING_CALL")) {

            Log.i("", " :::::::::::: inside onReceive if &&&&&&  :::::::::::::");

            telephony.listen(phoneListener,
                    PhoneStateListener.LISTEN_CALL_STATE);

        }
    }

    class OutgoingIncomingCallListener extends PhoneStateListener {
        public boolean wasRinging;

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                Log.i("", "  ************   RINGING  ********");
                wasRinging = true;
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.i("", "  ***********  OFFHOOK  ********");

                if (!wasRinging) {
                    // Start your new activity
                    Log.i("", "  ***********  if  ********");
                } else {
                    // Cancel your old activity
                    Log.i("", "  ***********  else  ********");
                }

                // this should be the last piece of code before the break
                wasRinging = true;
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                Log.i("", "  ::::::::::: IDLE  :::::::::");
                // this should be the last piece of code before the break
                // Log.i("", "  ***********  OFFHOOK  ********");

                if (wasRinging) {
                    Toast.makeText(ctx,
                            "Your call is disconnected by receiver", 10000)
                            .show();
                }
                wasRinging = true;
                break;
            }
        }
    }
}

当你打电话不接受时,这会显示Toast。

答案 2 :(得分:0)

如果使用android.intent.action.NEW_INCOMING_CALL怎么办?

当您拒绝来电时,callstate会从响铃变为空闲。这意味着你被拒绝了。

如果通话状态从OFFHOOK更改为空闲,则表示您接听了电话。