Android 通过BroadcastReceiver接听来电,无需PhoneStateIntententReceiver或PhoneStateListener
有没有办法通过扩展BroadcastReceiver来监听操作系统的广播,而不使用PhoneStateIntententReceiver或PhoneStateListener来监听来电。 另外,请告诉我清单中的操作和权限 我尝试了以下方法,但它不适用于传入呼叫,而是适用于传出呼叫 app的唯一一个.java文件如下(app只有一个.java文件和一个manifest文件) 显示Android 通过BroadcastReceiver接听来电,无需PhoneStateIntententReceiver或PhoneStateListener,android,android-broadcast,Android,Android Broadcast,有没有办法通过扩展BroadcastReceiver来监听操作系统的广播,而不使用PhoneStateIntententReceiver或PhoneStateListener来监听来电。 另外,请告诉我清单中的操作和权限 我尝试了以下方法,但它不适用于传入呼叫,而是适用于传出呼叫 app的唯一一个.java文件如下(app只有一个.java文件和一个manifest文件) 显示 <?xml version="1.0" encoding="utf-8"?> <manifest x
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.crsardar.media.audio"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name="IncommingCallReceiverCRS" android:enabled="true">
<intent-filter>
<!--action android:name="android.intent.action.NEW_OUTGOING_CALL"/-->
<action android:name="android.intent.action.ANSWER" >
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>
您在清单中定义的操作不正确。这是一种动作意图,可用于接听来电,而不是监控来电 您可以使用两个广播接收器来收听和广播意图 当有新的来电、接听电话或挂断时,将收到更改的操作\电话\状态\的信息(请参阅文档了解出于此目的而收到的额外信息) 当您的设备上有新的拨出电话时,将收到新的拨出电话
至于权限,我认为您的清单中的内容是正确的(我假设RECORD\u AUDIO权限用于应用程序中的其他内容)这是我的android单元测试演示。你可以参考一下
public interface ICallVerify {
void onOutgoing(Context context, Intent intent);
void onCallStateChange(Context context, Intent intent);
}
protected void setUpCallVerify(final ICallVerify callVerify) { //listen ingoing and outgoing
final CountDownLatch latch = new CountDownLatch(1);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
Log.i(TAG, "outgoing call...");
callVerify.onOutgoing(context, intent);
} else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals("RINGING")) {
state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
Log.i(TAG, "call state changed.... " + state);
callVerify.onCallStateChange(context, intent);
}
}
};
IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
ContextUtils.getTargetContext().registerReceiver(receiver, filter);
try {
latch.await(5, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
别忘了添加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
相关:
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>