通过BroadcastReceiver收听来电,而不需要PhoneStateIntentReceiver或PhoneStateListener

有没有办法通过扩展BroadcastReceiver监听操作系统的广播,而不使用PhoneStateIntentReceiver或PhoneStateListener来监听来电。 也请告诉我什么是清单中的操作和权限。

我已经尝试过如下,但它不是用于传入呼叫,但工作传出

应用程序的唯一一个.java文件如下(应用程序只有一个.java文件和一个清单文件)

package com.crsardar.media.audio; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class IncommingCallReceiverCRS extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.e("Chitta : ", "Its working"); } } 

performance

 <?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> 

Solutions Collecting From Web of "通过BroadcastReceiver收听来电,而不需要PhoneStateIntentReceiver或PhoneStateListener"

您在清单中定义的操作不正确。 这是一个动作意图,可以用来接听电话,而不是监听来电。

您可以使用两个侦听ACTION_PHONE_STATE_CHANGED和NEW_OUTGOING_CALL广播意图的广播接收器。

ACTION_PHONE_STATE_CHANGED将在有新的呼入,呼叫应答或挂断时被接收(请参阅本意图收到的EXTRAs的文档)。

当您的设备上有新的去电时,将收到NEW_OUTGOING_CALL。

至于权限,我认为你在你的清单中正确的(我假设RECORD_AUDIO权限用于你的应用程序中的其他东西)

这是我的Androidunit testing演示。 你可以参考它。

 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>