2011-03-30 104 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>