4

在我的应用程序中,我想确定拨出呼叫状态是否像等待、已接收或被对方拒绝。我在下面的这些链接中搜索了很多
呼出状态 如何检测呼出中的应答或拒绝状态,通过android BroadcastReceiver 呼出信息识别呼出连接事件
但找不到合适的答案。请帮助我。谢谢。

4

4 回答 4

3

我知道已经有一段时间了,但我希望对仍在寻找解决方案的人有所帮助!

我最近不得不从事一个类似的项目,我需要捕获拨出电话的振铃状态,而我能找到的唯一方法是使用本机拨号应用程序的隐藏 Api。由于 api 更改,这仅适用于 android > 5.0。这在 Android 5.0.1 上进行了测试,效果很好。(ps您需要一个root设备才能工作,因为您需要将您的应用程序安装为系统应用程序(谷歌如何!),然后才能检测拨出呼叫状态)。

作为记录,PhoneStateListener 不适用于检测许多帖子中提到的拨出呼叫状态。

首先,在清单文件中添加这个权限,

<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />

然后定义你的广播接收器,(这是一个示例代码!)

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;

public class MyBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, final Intent intent)
    {
        switch (intent.getIntExtra("foreground_state", -2)) {
            case 0: //  PreciseCallState.PRECISE_CALL_STATE_IDLE:
                System.out.println("IDLE");
                break;
            case 3: //  PreciseCallState.PRECISE_CALL_STATE_DIALING:
                System.out.println("DIALING");
                break;
            case 4: //  PreciseCallState.PRECISE_CALL_STATE_ALERTING:
                System.out.println("ALERTING");
                break;
            case 1: //  PreciseCallState.PRECISE_CALL_STATE_ACTIVE:
                System.out.println("ACTIVE");
                break;
        }

    }
} 

我用它们的值替换了一些常量,因为我在不熟悉反射概念的人中看到了很多困惑(为了方便)。警报基本上是接收器实际响铃时的状态!这不包括呼叫建立时间!。

于 2018-03-24T09:35:55.430 回答
0

我有一个类似的问题。我想检测一些拨出电话的状态。我通过在android中使用可视化类解决了这个问题。它可以返回扬声器上当前播放的音频的傅里叶变换。使用正在播放的音频类型(前置扬声器上的小哔哔声),您可以确定拨出电话的状态。例如,您可以知道电话是否在接收器上开始响铃。当可视化器返回非零样本时,它是肯定的。

背景音频不会打扰您,因为在通话期间,呼叫者应用程序会关闭所有其他音频。

等待状态 off_hook 然后开始你的可视化类

于 2016-03-19T16:08:44.563 回答
-2

试试这个,查看其他部分并在那里进行更改,它会起作用。

public class CallBr extends BroadcastReceiver {
        Bundle bundle;
        String state;
        String inCall, outCall;
        public boolean wasRinging = false;

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_IN)) {
                if ((bundle = intent.getExtras()) != null) {
                    state = bundle.getString(TelephonyManager.EXTRA_STATE);
                    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                        inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                        wasRinging = true;
                        Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show();
                    } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
                        if (wasRinging == true) {

                            Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show();

                            String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date());
                            File sampleDir = new File(Environment.getExternalStorageDirectory(), "/TestRecordingDasa1");
                            if (!sampleDir.exists()) {
                                sampleDir.mkdirs();
                            }
                            String file_name = "Record";
                            try {
                                audiofile = File.createTempFile(file_name, ".amr", sampleDir);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            String path = Environment.getExternalStorageDirectory().getAbsolutePath();

                            recorder = new MediaRecorder();
//                          recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

                            recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
                            recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
                            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                            recorder.setOutputFile(audiofile.getAbsolutePath());
                            try {
                                recorder.prepare();
                            } catch (IllegalStateException e) {
                                e.printStackTrace();
                            } catch (IOException e) { 
                                e.printStackTrace();
                            }
                            recorder.start();
                            recordstarted = true;
                        }
                    } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
                        wasRinging = false;
                        Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show();
                        if (recordstarted) {
                            recorder.stop();
                            recordstarted = false;
                        }
                    }
                }
            } else if (intent.getAction().equals(ACTION_OUT)) {
                if ((bundle = intent.getExtras()) != null) {
                    outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                    Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show();
                }
            }
        }
    }
于 2013-09-20T06:54:42.313 回答
-2

试试这个,你可以使用 PhoneListener 扩展为 PhoneStateListener。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class ListenToCallState extends BroadcastReceiver {

// private LoadProfImage mProfile;
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    // mProfile = new LoadProfImage(context);

    PhoneListener phoneListener = new PhoneListener(context);
    TelephonyManager telephony = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

}

class PhoneListener extends PhoneStateListener {
    private Context context;

    public PhoneListener(Context context) {
        // TODO Auto-generated constructor stub
        this.context = context;
    }

    public void onCallStateChanged(int state, String incomingNumber) {

        switch (state) {

        case TelephonyManager.CALL_STATE_IDLE:
                            //Do your stuff
            break;

        case TelephonyManager.CALL_STATE_RINGING:
                             //Do your stuff
            break;

        case TelephonyManager.CALL_STATE_OFFHOOK:
                              //Do your stuff
            break;

        }
    }
}

}

于 2013-09-20T07:00:55.930 回答