2011-03-30 4 views
8

Est-il possible d'écouter les appels entrants en étendant BroadcastReceiver pour écouter la diffusion du système d'exploitation, sans utiliser PhoneStateIntentReceiver ou PhoneStateListener. Aussi s'il vous plaît dites-moi ce que seront l'action et les autorisations dans le manifeste.Écouter les appels entrants via BroadcastReceiver, sans PhoneStateIntentReceiver ou PhoneStateListener

J'ai essayé avec ce qui suit, mais il ne fonctionne pas pour les appels entrants, mais travaillant pour les messages sortants

Le seul fichier .java d'application est la suivante (l'application d'un seul fichier .java et un fichier manifeste)

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");   
    } 
} 

manifeste

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

Répondre

8

L'action que vous avez défini dans votre manifeste est incorrect. C'est une intention d'action qui peut être utilisée pour répondre à un appel et ne pas surveiller les appels entrants.

Vous pouvez utiliser deux récepteurs de diffusion qui écoutent les intentions de diffusion ACTION_PHONE_STATE_CHANGED et NEW_OUTGOING_CALL. L'ACTION_PHONE_STATE_CHANGED sera reçu lorsqu'il y aura un nouvel appel entrant, un appel reçu ou un raccrochage (voir la documentation pour les EXTRA reçus avec cette intention).

Le NEW_OUTGOING_CALL sera reçu lorsqu'un nouvel appel sortant sera placé sur votre appareil.

En ce qui concerne les autorisations, je pense que vous l'avez à peu près juste dans votre manifeste (je suppose que l'autorisation de RECORD_AUDIO est utilisé pour quelque chose d'autre dans votre application)

0

Voici ma démo pour test unitaire android. Vous pouvez vous y référer.

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(); 
    } 
} 

Ne pas oublier d'ajouter des autorisations

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission> 
Questions connexes