2011-03-30 74 views
8

有什么办法通过扩展广播接收器收听OS的广播收听来电,而无需使用PhoneStateIntentReceiver或PhoneStateListener。 也请告诉我什么将清单中的行动和权限。通过收听广播接收器来电,而不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");   
    } 
} 

清单

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

回答

8

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

您可以使用两个广播接收机来收听ACTION_PHONE_STATE_CHANGEDNEW_OUTGOING_CALL广播意图。

当有新的传入呼叫,应答呼叫或挂断时,将收到ACTION_PHONE_STATE_CHANGED(请参阅本意向文件)。

当有放置在您的设备上新的呼出的NEW_OUTGOING_CALL将被接收。

至于权限,我觉得你得到了它大约就在你的清单(我假设RECORD_AUDIO权限用于其他应用程序中的东西)

0

这里是我的机器人单元测试演示。你可以参考它。

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>