在我的应用程序中,我想确定传出呼叫状态是否像其他方面一样等待,接收或拒绝。
我在下面这些链接中搜索了很多
Outgoing call status How to detect answered or rejected state in outgoing call,outgoing call information through android BroadcastReceiver,identify outgoing call connect event
但是找不到合适的答案.Plz帮帮我。谢谢。
答案 0 :(得分:1)
我知道它已经有一段时间,但我希望对仍在寻找解决方案的人有所帮助!
我最近不得不在一个类似的项目上工作,我需要捕获拨出呼叫的振铃状态,我能找到的唯一方法是使用本机拨号应用程序的隐藏Api。这只适用于android> 5.0因为api的变化。这是在Android 5.0.1上测试过的,并且像魅力一样。 (p.s.你需要一个有根设备才能工作,因为你需要将你的应用程序安装为系统应用程序(google how!),然后才能检测出局呼叫状态。)
对于记录,PhoneStateListener不能用于检测许多帖子中提到的传出呼叫状态。
首先,在清单文件
中添加此权限 django.core.urlsresolvers
然后定义你broadcastreceiver,(这是一个示例代码!)
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
我用它们的值替换了一些常量,因为我看到不熟悉反射概念的人之间有很多混淆(为了方便)。 警报基本上是接收器实际响铃时的状态!这不包括通话设置时间!
答案 1 :(得分:0)
我有类似的问题。我想检测一些拨出电话的状态。我在android中使用visualizer类解决了这个问题。它可以通过扬声器上播放的当前音频的傅里叶变换返回给您。使用正在播放的音频类型(前置扬声器上的小哔声),您可以确定外出呼叫的状态。例如,您可以知道手机是否已开始在接收器上振铃。当可视化器返回非零样本时,它是肯定的。
背景音频不会打扰您,因为在通话期间,来电应用程序会关闭所有其他音频。
等待状态off_hook,然后启动可视化工具类
答案 2 :(得分:-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();
}
}
}
}
答案 3 :(得分:-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;
}
}
}
}